【发布时间】: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