如何删除无关联资源的Pod且不重启其他关联Pod
K8s资源清理脚本优化:仅删除无关联资源的Pod
问题背景
现有一个用于清理过期Deployment、Service和ConfigMap的Bash脚本,新增kubectl delete pod逻辑后,会删除所有未在nonprod.txt中记录的Pod,但需求是仅删除没有关联Deployment、Service、ConfigMap的Pod,关联这些资源的Pod不能被删除或重启。
原脚本Pod处理逻辑的问题
原脚本仅通过grep检查Pod是否在nonprod.txt中,未判断Pod是否属于某个受控资源(比如Deployment)。实际上,由Deployment创建的Pod会包含ownerReferences元数据,指向对应的Deployment,这是判断Pod是否需要保留的核心依据。
修改后的完整脚本
# 获取所有Pod及其所有者信息(提取Pod名称和对应的Deployment所有者) active_pods_with_owner=$(kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.ownerReferences[?(@.kind=="Deployment")].name}{"\n"}{end}') active_deployments=$(kubectl get deployments -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}') active_services=$(kubectl get services -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}') active_configmaps=$(kubectl get configmap -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}') readarray -t active_deployments_array <<<"$active_deployments" readarray -t active_services_array <<<"$active_services" readarray -t active_configmaps_array <<<"$active_configmaps" # 处理Pod清理逻辑 echo "Processing pods..." while IFS=$'\t' read -r pod owner_deployment; do if [[ -z "$pod" ]]; then continue fi # 条件1:Pod不在nonprod.txt中 # 条件2:Pod没有关联的Deployment所有者 if ! grep -q "pod/${pod} " nonprod.txt && [[ -z "$owner_deployment" ]]; then echo "Deleting unmanaged pod: $pod" kubectl delete pod "$pod" fi done <<<"$active_pods_with_owner" # 以下保留原脚本的Deployment、Service、ConfigMap清理逻辑 echo "active deployments: ${active_deployments_array[@]}" for deployment in "${active_deployments_array[@]}"; do if ! grep -q "deployment.apps/${deployment} " nonprod.txt && [[ -n $deployment ]] ; then kubectl delete deployment "$deployment" fi done echo "active services: ${active_services_array[@]}" for service in "${active_services_array[@]}"; do if ! grep -q "service/${service} " nonprod.txt && [[ -n $service ]] && [[ $service != 'kubernetes' ]] ; then kubectl delete service "$service" fi done echo "active configmap: ${active_configmaps_array[@]}" for configmap in "${active_configmaps_array[@]}"; do if ! grep -q "configmap/${configmap} " nonprod.txt && [[ -n $configmap ]] && [[ ${configmap} != "kube-root-ca.crt" ]] ; then kubectl delete configmap "${configmap}" fi done
关键改动说明
- 获取Pod的所有者信息:通过
kubectl get pods -o jsonpath同时提取Pod名称和对应的Deployment所有者,直接判断Pod是否由Deployment管控。 - Pod删除条件优化:只有同时满足两个条件才删除Pod:
- Pod未在
nonprod.txt中记录 - Pod没有关联的Deployment所有者(即属于独立创建的Pod,比如当前集群中的
http-client-test、mytestcurl)
- Pod未在
- 保留原脚本中其他资源的清理逻辑,确保Deployment、Service、ConfigMap的清理规则不变。
验证说明
结合当前集群状态,修改后的脚本会仅删除http-client-test和mytestcurl这两个无关联Deployment的Pod,其余由Deployment创建的Pod(如logging-event-xxx、my-workspace-xxx等)会被保留,完全符合需求。
内容的提问来源于stack exchange,提问作者生きがい
相关产品推荐
相关产品推荐

