如何阻止Kubernetes Deployment自动重新部署手动终止的Pod
解决方案
为什么你之前的方法无效
- Deployment的核心作用是维持指定数量的Pod副本,手动删除Pod后,副本控制器会自动重建新Pod补全数量,所以直接删Pod无法阻止重启。
- Deployment强制要求Pod模板的
restartPolicy为Always,因为它面向长期运行的服务,设置Never会触发不支持错误。
正确实现方式:调整Deployment滚动更新策略
通过配置滚动更新参数,让Deployment更新时先启动新Pod,且不自动删除旧Pod,待你手动清理旧Pod后,系统会维持指定的副本数。
修改后的Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: namespace: default name: my-service-deployment labels: app: my-service spec: replicas: 1 # 新增滚动更新策略配置 strategy: rollingUpdate: maxSurge: 1 # 更新时允许临时超出副本数的最大数量(这里设为1,允许同时运行2个Pod) maxUnavailable: 0 # 更新时不允许任何Pod不可用,因此旧Pod会保留直到手动删除 type: RollingUpdate selector: matchLabels: app: my-service template: metadata: labels: app: my-service spec: containers: - name: my-service image: my-service:latest ports: - containerPort: 81 # 可选:如果镜像标签是latest,建议加上强制拉取策略,确保获取最新镜像 imagePullPolicy: Always
按需求流程操作
- 应用上述配置:
kubectl apply -f deployment.yaml - 修改代码后构建新的
my-service:latest镜像,确保集群节点能拉取到该镜像。 - 重新应用Deployment配置:
kubectl apply -f deployment.yaml - 此时会启动1个新Pod,旧Pod仍保持运行状态,总共有2个Pod。
- 查看Pod创建时间,找到最旧的Pod:
kubectl get pods --sort-by=.metadata.creationTimestamp - 手动删除最旧的Pod:
kubectl delete pod <旧Pod名称> - 最终只会保留最新的Pod运行,Deployment会维持
replicas:1的配置,不会重建旧Pod。
备选方案:暂停滚动更新实现手动控制
如果需要更灵活的操作节奏,也可以通过暂停Deployment滚动更新来实现:
- 暂停Deployment的滚动更新:
kubectl rollout pause deployment/my-service-deployment - 更新镜像并重新应用Deployment,此时会创建新Pod但不会自动删除旧Pod。
- 手动删除旧Pod后,恢复滚动更新:
kubectl rollout resume deployment/my-service-deployment
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

