场景:TKE 标准集群,Kubernetes 1.32。TCP 长连接,端口 9000,非 HTTP,要在 Pod 里拿客户端源 IP。Service 为 type: LoadBalancer、externalTrafficPolicy: Local,未开直连 Pod,CLB 后端是节点 NodePort。副本 3,经常两个 Pod 挤在同一节点。
现象:
- 没有本地 Pod 的节点健康检查不通过,只有带着 Pod 的节点是健康后端。两 Pod 同节点时,与单 Pod 节点权重相同,单 Pod 节点连接数和 CPU 更高。
- 排水后 Pod 漂到另一节点。节点本来就在后端列表里:旧节点 Pod 一走就检查失败,新节点要等检查通过才健康。副本少、漂移快时健康后端会变成 0,新连接失败,过后恢复。此时 Endpoints 和 Ready 已正常,集群内 NodePort 也通;已建连接不受影响。
- cordon 后节点仍是 Unschedulable,并留在后端里,要等 Pod 被驱逐、检查失败才摘。NotReady 节点不在列表里。
已尝试:
- 加了 Pod 反亲和,打偏减轻,排水时健康后端变 0 还在。
- 副本从 3 加到 6,空窗少一些,权重仍按节点而不是按 Pod 数。
- 开了四层会话保持。空窗里新连接仍失败,设备还会粘在将下线的节点上。
- 查了安全组,只有健康后端为 0 时从 CLB 进来的新连接才失败。
问题:
- 四层要保留源 IP,Local 还能不能放生产?若继续用,怎样约束后端绑定,才不会在漂移时把健康后端掏空?
- 节点上 Pod 数不同,权重却相同。能否按该节点 Pod 数分配,改完如何核对控制台上的实际权重?
- 这段空窗除了客户端重连,绑定策略上能不能消掉?该盯 CLB 哪项监控,而不是只看 Pod Ready?