You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:59:58