nginx-ingress 停止工作,尽管 Ready service + pod ("does not have any active Endpoint.")

nginx-ingress stopped working, despite Ready service + pod ("does not have any active Endpoint.")

我已将我的 microk8s 设置转移到新服务器,发现我的试用设置中曾经有效的入口设置停止工作。

我是 运行 这个最小的 whoami-app:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: default
  labels:
    app: whoami
spec:
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: containous/whoami
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: default
spec:
  selector:
    app: whoami
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami
  namespace: default
  annotations:
    kubernetes.io/ingress.class: public
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: whoami
            port:
              number: 80

Pod 已启动且 运行,服务已正确公开它,但入口无法正常工作:

kubectl get services whoami
NAME     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
whoami   ClusterIP   10.152.183.184   <none>        80/TCP    26m
curl 10.152.183.184
Hostname: whoami-567b85d54d-qbbd5
IP: 127.0.0.1
IP: ::1
IP: 10.1.76.7
IP: fe80::e850:aaff:fe72:91c4
RemoteAddr: 192.168.0.102:21910
GET / HTTP/1.1
Host: 10.152.183.184
User-Agent: curl/7.68.0
Accept: */*
kubectl get ingress whoami
NAME     CLASS    HOSTS   ADDRESS     PORTS   AGE
whoami   <none>   *       127.0.0.1   80      28m

nginx-ingress-controller 日志显示这些条目:

controller.go:1076] Service "default/whoami" does not have any active Endpoint.

但同样,通过 clusterIP 进行访问是可行的,因此 Pod 和服务都在执行它们的工作。

我真的不知道这是怎么发生的,但端点与 pod IP 不匹配。 我使用 kubectl delete endpoints whoami 手动删除了端点,它使用现在正确的 IP 重新创建,现在入口似乎可以工作。

很高兴听到你成功了。

我试图找到这种行为的原因,但不幸的是我还没有找到。在 this link 有一些类似警告的解决方案。也许它会对某人有所帮助。

第一个是入口控制器的入口 class 与用于服务的入口资源清单中的入口 class 不匹配的情况。

Nginx installation command, short example:

helm install stable/nginx-ingress \   
--name ${INGRESS_RELEASE_NAME} \   
--namespace ${K8S_NAMESPACE} \   
--set controller.scope.enabled=true \   
--set controller.scope.namespace=${K8S_NAMESPACE} \   
--set controller.ingressClass=${NGINX_INGRESS_CLASS}

ingress resource spec. , excerpt:

apiVersion: extensions/v1beta1 
kind: Ingress metadata:  
labels:
   annotations:
    # folowing line is not valid for K8s or Helm, 
    # but reflects the values must be the same
    kubernetes.io/ingress.class: ${NGINX_INGRESS_CLASS} 

第二种解决方案是在服务选择器中包含 id 指令:

  selector:
    app: whoami
    id: "0"

另请参阅 Whosebug 上的这些问题:

  1. Kubernetes Service does not have active Endpoint
  2. Kubernetes - ingress-nginx "no active endpoint" error