Kubernetes v1.27.15无头服务端点未移除终止Pod问题咨询
Kubernetes无头服务保留Terminating Pod端点的问题分析
我们在v1.27.15版本的多节点Kubernetes集群上部署了有状态Redis实例,集群内包含两个服务:redis(ClusterIP类型)和redis-headless(无头服务)。当关闭其中一个节点后,该节点上的redis-node-1 Pod进入Terminating状态:
kubectl get pods -A -o wide | grep redis mynamespace redis-node-0 3/3 Running 0 8m 10.244.248.4 ha3-node2 mynamespace redis-node-1 3/3 Terminating 0 68m 10.244.230.119 ha3-node1 mynamespace redis-node-2 3/3 Running 0 67m 10.244.192.208 ha3-node3
此时redis-headless服务的端点仍保留该Pod的IP,而ClusterIP类型的redis服务已正常移除该IP:
kubectl describe endpoints -n mynamespace redis-headless Name: redis-headless Namespace: mynamespace Subsets: Addresses: 10.244.192.208,10.244.230.119,10.244.248.4
该行为是否正常?
这种行为不属于正常预期。虽然无头服务设计上允许Terminating状态的Pod暂时保留端点(用于优雅关闭期间的流量处理),但当Pod所在节点已经离线、Pod完全无法提供服务时,端点应该被自动移除。出现差异的核心原因是:
- ClusterIP服务的端点控制器会结合节点状态、Pod就绪状态主动检测可用性,一旦判定Pod不可用就立即移除端点;
- 无头服务的端点同步逻辑在节点离线场景下,可能因kubelet无法上报Pod的最终终止状态,导致端点控制器无法及时感知Pod已不可用,从而保留无效IP。
解决方案
1. 手动清理无效端点
直接编辑端点资源,删除对应Terminating Pod的IP条目:
kubectl edit endpoints redis-headless -n mynamespace
在编辑界面中找到subsets.addresses下的10.244.230.119条目并删除,保存退出即可。
2. 强制终止无响应的Pod
如果Pod因节点离线无法正常终止,可强制删除Pod触发端点控制器更新:
kubectl delete pod redis-node-1 -n mynamespace --force --grace-period=0
强制删除后,端点控制器会同步移除该Pod的IP。
3. 修复节点状态(若节点可恢复)
如果节点只是临时离线,重启节点并等待kubelet重新连接集群,有状态Redis的Pod会被重新调度到可用节点(需确保PersistentVolume可跨节点挂载),旧端点会自动被清理。
4. 验证端点控制器配置
确认集群的kube-controller-manager配置正常,没有禁用端点自动清理的自定义参数。v1.27版本默认配置会处理节点离线场景的端点更新,若存在自定义配置需检查相关限制项。
内容的提问来源于stack exchange,提问作者Yavuz Sert
相关产品推荐
相关产品推荐

