Docker Kubernetes为何出现重复Pod?Deployment副本数设为1仍有多余实例
滚动更新残留的过渡Pod
当Deployment触发滚动更新(比如镜像版本变更、配置修改)时,K8s会遵循"先启新Pod,就绪后删旧Pod"的逻辑。如果新Pod就绪延迟、旧Pod删除卡住(比如容器进程无法正常退出),会暂时出现两个Pod共存的情况。可以通过以下命令排查:kubectl describe deployment <你的Deployment名称>:查看事件日志,确认更新过程是否有异常kubectl get replicasets:检查是否存在未被缩容至0的旧ReplicaSet
存在手动创建的匹配标签Pod
如果有人通过kubectl run或独立Pod YAML创建了与Deployment标签选择器匹配的Pod,Deployment控制器只会维护自身管理的replicas数量,不会清理手动Pod,导致总数超过1。排查方式:kubectl get pods --show-labels:对比Pod标签是否与Deployment的selector匹配kubectl get pods -o jsonpath='{.items[*].metadata.ownerReferences}':手动创建的Pod没有ownerReferences,而Deployment管理的Pod会关联到对应的ReplicaSet
ReplicaSet异常导致多实例
多次更新Deployment后,可能存在多个ReplicaSet,若某个旧ReplicaSet的replicas被手动修改为非0,或者Deployment控制器未正确同步RS状态,会导致多个RS同时管理Pod。执行kubectl get rs查看所有RS的REPLICAS列,确认是否有多个RS的实例数大于0。特殊标识Pod来自其他控制器
带有k8s/k8s_POD标识的Pod,可能不属于当前Deployment,而是由其他控制器(如StatefulSet、DaemonSet、Job)或系统组件创建。通过kubectl describe pod <Pod名称>查看Owner References字段,确认Pod所属的控制器类型,避免误判为Deployment的重复Pod。控制器或节点故障导致收敛失败
如果kube-controller-manager出现短暂故障,或Pod所在节点失联导致Pod处于Terminating状态无法被清理,Deployment会认为当前可用实例不足,从而启动新Pod。排查:kubectl get pods -o wide:查看Pod状态是否有Terminating,以及节点状态是否正常- 检查kube-controller-manager的日志,确认控制器运行状态
内容的提问来源于stack exchange,提问作者Rafael Souza

