为什么我的入口控制器不将流量从我的外部 IP 路由到我集群中的服务?

Why isn't my ingress controller route traffic from my external IP to the service in my cluster?

我在 Digital Ocean 上有一个集群。 1 个主节点,2 个节点。 我将 Nginx 控制器与 Digital Ocean Load Balancer 一起使用。 我的 Ingress 服务中的三个项目工作正常。第四个我使用 Nginx 的地方没有。 有谁知道为什么?

这是配置。我遗漏了正在运行的第 1 到第 3 个部署的入口服务。如果需要我可以添加它们。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: hw1.example.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-first
          servicePort: 80
  - host: hw2.example.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-second
          servicePort: 80
  - host: hw3.example.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-third
          servicePort: 80
  - host: hw4.example.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-fourth
          servicePort: 80

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes-fourth
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: hello-kubernetes-fourth
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-fourth
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes-fourth
  template:
    metadata:
      labels:
        app: hello-kubernetes-fourth
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 8080

首先,如果你使用nginx镜像,容器Port应该是镜像的Dockerfile暴露的端口。 对于 nginx 图像,ContainerPort 应该是端口 80 https://hub.docker.com/layers/nginx/library/nginx/stable/images/sha256-cab8e4374e1e32bac58a8c7ae96c252cadcb1049545ed4bb3e3bfd5d087983b9

现在您应该通过从 minikube 节点访问 podip:containerPort 来测试 nginx 是否可用:

kubectl get po -o wide
hello-kubernetes-fourth-cb4fb668c-7tkd4   1/1     Running   0      25m  172.17.0.12                               

curl 172.17.0.12

在此之后,您应该修改服务的端口:targetPort 应该匹配 containerPort (80) 和端口 8080 现在通过服务URL:

访问Nginx
kubectl describe svc hello-kubernetes-fourth

curl ClusterIP:8080

如果确定,还修改入口的服务端口以匹配服务端口。不要忘记启用入口,因为它在 minikube 上默认是禁用的:

minikube addons enable ingress
* ingress was successfully enabled

ingress pod 启动后,并在主机中添加 MINIKUBEIP hw4.example.com /etc/hosts,您应该能够从主机 curl:

curl hw4.example.com

部署配置不正确。如下所示更新 YAML

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes-fourth
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: hello-kubernetes-fourth
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-fourth
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-kubernetes-fourth
  template:
    metadata:
      labels:
        app: hello-kubernetes-fourth
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80

进入 nginx pod 并验证您是否能够访问该服务并获得响应

卷曲http://hello-kubernetes-fourth

那么您应该可以从入口访问该服务。