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

Kubernetes中成功部署新版本后自动删除旧部署方案咨询

在Kubernetes中自动清理旧Deployment的实现方案(基于Jenkins流水线)

核心结论

  • 如果你的部署模式是每个版本创建独立的Deployment对象(比如my-app-v1、my-app-v2):无法通过deployment.yaml配置实现自动删除旧Deployment,必须在Jenkinsfile中添加Groovy脚本阶段完成清理。
  • 如果你的部署模式是复用同一个Deployment对象做滚动更新:可以通过deployment.yaml的配置自动清理旧版本的ReplicaSet及对应Pods,但这不会删除Deployment本身。

场景1:多独立Deployment的自动清理(Jenkinsfile实现)

这种场景下,每个版本会创建新的Deployment,需要在新版本部署验证通过后,批量删除同应用下的旧Deployment。

实现步骤

  1. 确保Jenkins节点有权限访问K8s集群:提前在Jenkins服务器或K8s内的Jenkins Pod上配置kubeconfig,或通过ServiceAccount挂载赋予Jenkins删除Deployment的权限。
  2. 在Jenkins流水线中新增清理阶段:该阶段必须放在新版本部署完成且验证通过之后(比如确认Pod就绪、服务可用),避免误删正常运行的实例。

示例Groovy脚本

stage('Cleanup Old Deployments') {
  steps {
    script {
      // 从构建参数或部署阶段获取当前版本信息,这里假设用环境变量传递
      def currentVersion = env.APP_VERSION
      def appLabel = "my-app" // 你的应用标签,用来过滤Deployment

      // 查询所有属于当前应用、且版本不等于当前版本的Deployment
      def oldDeployments = sh(
        script: "kubectl get deployments -l app=${appLabel},version!=${currentVersion} -o name",
        returnStdout: true
      ).trim().split('\n')

      if (oldDeployments.size() > 0) {
        echo "Found ${oldDeployments.size()} old deployments to clean up: ${oldDeployments.join(', ')}"
        // 执行删除操作,删除Deployment后关联的Pods会被自动回收
        sh "kubectl delete ${oldDeployments.join(' ')}"
        echo "Old deployments deleted successfully"
      } else {
        echo "No old deployments found for app ${appLabel} (current version: ${currentVersion})"
      }
    }
  }
}

适配不同命名规则

如果你的Deployment命名是用版本后缀(比如my-app-v1),可以用命名前缀过滤:

def oldDeployments = sh(
  script: "kubectl get deployments | grep '${appLabel}-' | grep -v '${appLabel}-${currentVersion}' | awk '{print \$1}'",
  returnStdout: true
).trim().split('\n')

场景2:同一Deployment滚动更新的历史清理(deployment.yaml配置)

如果你的部署是通过修改同一个Deployment的镜像版本实现滚动更新,Kubernetes会保留历史版本的ReplicaSet。可以通过配置限制保留的历史数量,自动清理旧ReplicaSet及对应Pods。

配置示例

在deployment.yaml的spec段添加revisionHistoryLimit:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  revisionHistoryLimit: 2 # 仅保留最近2个历史版本的ReplicaSet
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v1.0.0

设置后,当Deployment更新到新版本时,超过数量限制的旧ReplicaSet会被自动删除,对应的Pods也会被回收。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:01:01