Kubernetes/Openshift如何保留新旧Deployment且脚本创建POD不删除旧实例
问题根因
Deployment 原生设计为维护固定副本数的长期运行服务,默认滚动更新逻辑会将旧版本 ReplicaSet 的副本数缩容至 0,仅保留最新版本的对应副本数 Pod,因此默认配置下无法实现所有历史 Pod 同时留存。你的场景更适合使用 Job 资源实现。
最优方案:使用 Job 资源实现需求
Job 是 Kubernetes/Openshift 原生用于执行一次性任务的资源,完全匹配你的需求:
- 每次执行生成独立 Job 及对应 Pod,不会自动删除历史实例
- 任务执行完成后 Pod 自动标记为 Completed 状态,可配置自动销毁规则
Job 模板示例
# job-template.yaml apiVersion: batch/v1 kind: Job metadata: name: abc-{{EXEC_NUM}} spec: backoffLimit: 0 # 任务失败不重试,可按需调整 template: spec: containers: - name: task-container image: 你的业务镜像地址 # 替换为实际镜像 command: ["你的任务执行命令"] # 替换为Pod内要运行的Job命令 restartPolicy: Never # 任务完成后不重启Pod # 按需开启自动销毁:任务完成后3600秒(1小时)自动删除Job及对应Pod,不需要则注释 ttlSecondsAfterFinished: 3600
自动递增序号的执行脚本示例
#!/bin/bash # 获取当前最大的Job序号,没有则从1开始 MAX_NUM=$(oc get job -o name | grep -E 'abc-[0-9]+' | awk -F '-' '{print $NF}' | sort -n | tail -n 1 2>/dev/null || echo 0) NEW_NUM=$((MAX_NUM + 1)) # 替换模板变量并创建Job sed "s/{{EXEC_NUM}}/${NEW_NUM}/g" job-template.yaml | oc apply -f -
每次执行该脚本会自动生成abc-1到abc-5的独立Job及对应Pod,所有实例会同时留存,不会被自动删除。
备选方案:必须使用Deployment的场景
如果业务有强约束必须使用Deployment实现,需要每次部署生成唯一的Deployment名称,不要复用同一个Deployment配置,示例脚本如下:
#!/bin/bash MAX_NUM=$(oc get deploy -o name | grep -E 'abc-[0-9]+' | awk -F '-' '{print $NF}' | sort -n | tail -n 1 2>/dev/null || echo 0) NEW_NUM=$((MAX_NUM + 1)) # 生成并创建独立Deployment cat <<EOF | oc apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: abc-${NEW_NUM} spec: replicas: 1 selector: matchLabels: app: abc-${NEW_NUM} template: metadata: labels: app: abc-${NEW_NUM} spec: containers: - name: business-container image: 你的业务镜像地址 command: ["sh", "-c", "你的任务执行命令 && exit 0"] EOF
注意该方案下如果Pod内进程执行完成退出,Deployment会自动重启Pod,若要实现执行完成销毁需要配合Pod生命周期钩子或自定义探针实现,优先级低于Job方案。
内容的提问来源于stack exchange,提问作者tvoski
相关产品推荐
相关产品推荐

