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。
实现步骤
- 确保Jenkins节点有权限访问K8s集群:提前在Jenkins服务器或K8s内的Jenkins Pod上配置
kubeconfig,或通过ServiceAccount挂载赋予Jenkins删除Deployment的权限。 - 在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
相关产品推荐
相关产品推荐

