排除 Google kubernetes 负载均衡器不健康节点的故障

troubleshoot Google kubernetes load balancer unhealthy nodes

我想知道在对为什么 Google 负载均衡器将集群中的节点视为不健康的原因进行故障排除时要采取什么步骤?

使用 Google Kubernetes,我有一个包含 3 个节点的集群,所有部署都是 运行 就绪和活动检查。所有人都报告说他们很健康。

负载均衡器是从 helm nginx-ingress 构建的:

https://github.com/helm/charts/tree/master/stable/nginx-ingress

它用作集群内所有部署应用程序的单一入口。

目视扫描入口控制器日志:

kubectl logs <ingress-controller-name>

仅显示通常的 nginx 输出 ... HTTP/1.1" 200 ... 我在这些日志中看不到任何健康检查。不确定我是否应该这样做,但没有任何迹象表明有什么不健康的。

运行 针对入口控制器的描述没有显示任何事件,但它确实显示了活动和就绪检查,我不太确定它是否真的会通过:

Name:               umbrella-ingress-controller-****
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               gke-multi-client-n1--2cpu-4ram-****/10.154.0.50
Start Time:         Fri, 15 Nov 2019 21:23:36 +0000
Labels:             app=ingress
                    component=controller
                    pod-template-hash=7c55db4f5c
                    release=umbrella
Annotations:        kubernetes.io/limit-ranger: LimitRanger plugin set: cpu request for container ingress-controller
Status:             Running
IP:                 ****
Controlled By:      ReplicaSet/umbrella-ingress-controller-7c55db4f5c
Containers:
  ingress-controller:
    Container ID:  docker://****
    Image:         quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
    Image ID:      docker-pullable://quay.io/kubernetes-ingress-controller/nginx-ingress-controller@sha256:****
    Ports:         80/TCP, 443/TCP
    Host Ports:    0/TCP, 0/TCP
    Args:
      /nginx-ingress-controller
      --default-backend-service=default/umbrella-ingress-default-backend
      --election-id=ingress-controller-leader
      --ingress-class=nginx
      --configmap=default/umbrella-ingress-controller
    State:          Running
      Started:      Fri, 15 Nov 2019 21:24:38 +0000
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:      100m
    Liveness:   http-get http://:10254/healthz delay=10s timeout=1s period=10s #success=1 #failure=3
    Readiness:  http-get http://:10254/healthz delay=10s timeout=1s period=10s #success=1 #failure=3
    Environment:
      POD_NAME:       umbrella-ingress-controller-**** (v1:metadata.name)
      POD_NAMESPACE:  default (v1:metadata.namespace)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from umbrella-ingress-token-**** (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  umbrella-ingress-token-2tnm9:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  umbrella-ingress-token-****
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

但是,使用 Googles 控制台,我导航到负载均衡器的详细信息,可以看到以下内容:

以上 2 个节点似乎有问题,但我找不到问题。

此时负载均衡器仍在通过第三个健康节点提供流量,但它偶尔会丢弃该节点并向我显示以下内容:

此时没有流量通过负载均衡器,因此节点上的所有应用程序都无法访问。

任何关于我应该在哪里解决这个问题的帮助都会很棒。

---- 编辑 17/11/19

下面是通过 helm 传递的 nginx-ingress 配置:

ingress:
  enabled: true
  rbac.create: true
  controller:
    service:
      externalTrafficPolicy: Local
      loadBalancerIP: ****
  configData:
    proxy-connect-timeout: "15"
    proxy-read-timeout: "600"
    proxy-send-timeout: "600"
    proxy-body-size: "100m"

这是预期的行为。使用 externalTrafficPolicy: local 配置服务,以便只有存在服务 pod 的节点才会接受流量。这意味着任何没有接收服务流量的服务 pod 的节点都将丢弃数据包。

GCP 网络负载均衡器仍在向每个节点发送流量以测试运行状况。健康检查将使用服务 NodePort。任何包含 nginx loadbalancer pods 的节点都会响应健康检查。任何没有 nginx 负载均衡器 pod 的节点都会丢弃数据包,因此检查失败。

这导致只有某些节点显示为健康。

对于nginx ingress controller,我建议使用默认值cluster而不是将其更改为local