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

如何阻止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

按需求流程操作

  1. 应用上述配置:
    kubectl apply -f deployment.yaml
    
  2. 修改代码后构建新的my-service:latest镜像,确保集群节点能拉取到该镜像。
  3. 重新应用Deployment配置:
    kubectl apply -f deployment.yaml
    
  4. 此时会启动1个新Pod,旧Pod仍保持运行状态,总共有2个Pod。
  5. 查看Pod创建时间,找到最旧的Pod:
    kubectl get pods --sort-by=.metadata.creationTimestamp
    
  6. 手动删除最旧的Pod:
    kubectl delete pod <旧Pod名称>
    
  7. 最终只会保留最新的Pod运行,Deployment会维持replicas:1的配置,不会重建旧Pod。

备选方案:暂停滚动更新实现手动控制

如果需要更灵活的操作节奏,也可以通过暂停Deployment滚动更新来实现:

  1. 暂停Deployment的滚动更新:
    kubectl rollout pause deployment/my-service-deployment
    
  2. 更新镜像并重新应用Deployment,此时会创建新Pod但不会自动删除旧Pod。
  3. 手动删除旧Pod后,恢复滚动更新:
    kubectl rollout resume deployment/my-service-deployment
    

内容的提问来源于stack exchange,提问作者jonas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:12:09