OKD 4.x:如何复刻OCP/OKD 3.11的*-deploy Pod自动删除功能
OKD 4.x 自动清理Completed状态Deploy辅助Pod方案
问题背景
在OKD 4.x中,通过DeploymentConfig或其超集Template部署应用时,业务Pod(<POD>)进入Running状态后,名为<POD>-deploy的辅助部署Pod会以Completed状态永久留存。但在OCP 3.11/OKD 3.11中,这类Pod会被自动删除。需要复刻该行为的原因:
- 这类Pod与业务Pod名称高度相似,使用
oc(即kubectl)查看Pod列表时需手动过滤,影响操作效率 - 会占用节点250个Pod的配额限制,甚至可能持续占用IP地址池资源(疑似Bug)
- 大量留存会拖慢etcd元数据处理,降低集群整体性能
OCP 3.11中的自动清理示例:
NAME READY STATUS RESTARTS AGE ml-admin-vsc-node2-1-mtjz5 1/1 Running 0 7s ml-admin-vsc-node2-1-tdr4g 0/1 Terminating 1 8d ml-admin-vsc-node2-1-deploy 0/1 Completed 0 13s ml-admin-vsc-node2-1-deploy 0/1 Terminating 0 13s
解决方案
方法1:针对单个DeploymentConfig配置
通过修改DeploymentConfig的revisionHistoryLimit参数为0,可让控制器在部署完成后自动删除Completed状态的deploy Pod。
修改现有DeploymentConfig:
oc patch dc <你的DC名称> -p '{"spec":{"revisionHistoryLimit":0}}'
创建新DeploymentConfig时,直接在YAML中添加配置:
spec: revisionHistoryLimit: 0 # 其余DeploymentConfig配置...
方法2:全局集群级配置
若需要所有新创建的DeploymentConfig都自动清理deploy Pod,可修改集群全局配置:
oc patch deployments.config.openshift.io/cluster -p '{"spec":{"revisionHistoryLimit":0}}'
注:该配置仅对修改后新建的DeploymentConfig生效,已存在的需单独调整。
方法3:定时Job兜底清理
如果上述配置不生效,可创建定时CronJob定期清理所有Completed状态的deploy Pod。
- 创建清理Job的YAML文件(
cleanup-deploy-pods.yaml):
apiVersion: batch/v1 kind: CronJob metadata: name: cleanup-deploy-pods spec: schedule: "*/5 * * * *" # 每5分钟执行一次,可按需调整 jobTemplate: spec: template: spec: serviceAccountName: cleanup-deploy-sa containers: - name: kubectl image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest command: - /bin/sh - -c - "oc delete pods --field-selector=status.phase=Completed -l openshift.io/deployer-pod=true" restartPolicy: OnFailure
- 创建对应的ServiceAccount与权限(
sa-rbac.yaml):
apiVersion: v1 kind: ServiceAccount metadata: name: cleanup-deploy-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cleanup-deploy-pods-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["delete", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cleanup-deploy-pods-binding subjects: - kind: ServiceAccount name: cleanup-deploy-sa namespace: <你的命名空间> # 替换为实际命名空间 roleRef: kind: ClusterRole name: cleanup-deploy-pods-role apiGroup: rbac.authorization.k8s.io
- 执行创建命令:
oc apply -f cleanup-deploy-pods.yaml oc apply -f sa-rbac.yaml
内容的提问来源于stack exchange,提问作者mirekphd
相关产品推荐
相关产品推荐

