首页 > 解决方案 > Google 负载均衡器运行状况检查失败

问题描述

我按照以下官方文档在 GKE 上安装了 Kubernetes 入口控制器。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.46.0/deploy/static/provider/cloud/deploy.yaml

入口控制器运行良好。

ingress-nginx-admission-create-dvkgp        0/1     Completed   0          5h29m
ingress-nginx-admission-patch-58l4z         0/1     Completed   1          5h29m
ingress-nginx-controller-65d7564f46-2rtjs   1/1     Running     0          5h29m

它会自动创建 TCP 负载均衡器、健康检查和防火墙规则。我的 kubernetes 集群有 3 个节点。有趣的是,有 2 个实例的健康检查失败。它传递给正在运行入口控制器的实例。我调试它,但没有找到任何线索。有人可以帮我解决这个问题。

标签: google-cloud-platformgoogle-kubernetes-enginekubernetes-ingressingress-controller

解决方案


如果您要查看您应用的deploy.yaml,您会看到:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local

注意externalTrafficPolicy: Local. 它被用来保留客户端源 ip

在这里更好地解释:Source IP for Services with Type=LoadBalancer

来自 k8s 文档:

但是,如果您在 Google Kubernetes Engine/GCE 上运行,则将相同的 service.spec.externalTrafficPolicy 字段设置为 Local 会强制没有 Service 端点的节点通过故意未通过运行状况检查将自己从符合负载均衡流量的节点列表中删除。

这些健康检查旨在失败。它以这种方式工作,以便可以保留客户端 IP。

请注意,被列为健康的节点是运行 ingress-nginx-controller pod 的节点。删除这个 pod 并等待它在另一个节点上重新调度 - 现在这个另一个节点应该是健康的。现在运行 3 个 pod 副本,每个节点上一个,所有节点都将是健康的。


推荐阅读