【问题标题】:troubleshoot Google kubernetes load balancer unhealthy nodes对 Google kubernetes 负载平衡器不健康节点进行故障排除
【发布时间】:2020-03-12 12:25:59
【问题描述】:

我想知道在排查 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>

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

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

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

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

任何有关我应该寻求解决此问题的帮助都会很棒。

---- 2019 年 17 月 11 日编辑

下面是通过 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 进行服务?考虑到整个过程有效,并且您有 1/3 的健康节点,这很可能是罪魁祸首。
  • @PatrickW 我是的-我已经编辑了问题以将其包含在上面-您认为有什么问题?为什么这会导致报告不健康的节点?
  • 我还看到我没有使用:controller.service.healthCheckNodePort 阅读我的设置可能需要的文档? “如果 controller.service.type 是 NodePort 或 LoadBalancer 并且 controller.service.externalTrafficPolicy 设置为 Local,请将其设置为 kube-proxy 将公开的托管健康检查端口......”
  • 由于使用的是 nginx 入口控制器,所以不需要使用 nodeport

标签: kubernetes google-kubernetes-engine kubernetes-helm kubernetes-ingress


【解决方案1】:

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

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

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

对于 nginx 入口控制器,我建议使用默认值 cluster 而不是将其更改为 local

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2016-08-05
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多