我有一个 GKE 集群 (1.12.10-gke.17)。
我正在运行nginx 入口控制器 https://github.com/kubernetes/ingress-nginx with type: LoadBalancer
.
我已经设置了externalTrafficPolicy: Local
to 保留源ip https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-loadbalancer.
除了滚动更新期间之外,一切都运行良好。我有maxSurge: 1
and maxUnavailable: 0
.
我的问题是,在滚动更新期间,我开始收到请求超时。我怀疑 Google 负载均衡器仍在向 pod 所在的节点发送请求Terminating
即使健康检查失败。当 pod 从 pod 更改时开始,这种情况会持续大约 30-60 秒Running
to Terminating
。一段时间后一切都会稳定下来,流量最终只会流向带有新 Pod 的新节点。
如果负载均衡器is停止向终止 pod 发送请求的速度很慢,是否有某种方法可以使这些滚动部署无中断?
我的理解是,在一个normalk8s服务,哪里externalTrafficPolicy
这是不正常的,Google 负载均衡器只是将请求发送到所有节点,然后让 iptables 进行排序。当 pod 处于Terminating
iptables 更新很快,流量不再发送到该 Pod。在这种情况下externalTrafficPolicy
is Local
但是,如果接收请求的节点没有Running
pod,然后请求超时,这就是这里发生的情况。
如果这是正确的,那么我只看到两个选项
- 停止向节点发送请求
Terminating
pod
- 即使 pod 已关闭,仍继续服务请求
Terminating
我觉得选项 1 很困难,因为它需要通知负载均衡器 pod 即将启动Terminating
.
我在选项 2 上取得了一些进展,但到目前为止还没有发挥作用。我已成功通过添加一个来继续处理来自 pod 的请求preStop
刚刚运行的生命周期钩子sleep 60
,但我认为问题在于healthCheckNodePort
报告localEndpoints: 0
我怀疑有东西阻止了到达节点和到达 Pod 之间的请求。也许,iptables 没有路由localEndpoints: 0
.
我还调整了Google负载均衡器健康检查,这与readinessProbe
and livenessProbe
,到可能的“最快”设置,例如1 秒间隔,1 个故障阈值,我已经验证了负载均衡器后端(又名 k8s 节点)确实很快就失败了运行状况检查,但仍然继续向终止 pod 发送请求。