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

如何删除无关联资源的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

关键改动说明

  1. 获取Pod的所有者信息:通过kubectl get pods -o jsonpath同时提取Pod名称和对应的Deployment所有者,直接判断Pod是否由Deployment管控。
  2. Pod删除条件优化:只有同时满足两个条件才删除Pod:
    • Pod未在nonprod.txt中记录
    • Pod没有关联的Deployment所有者(即属于独立创建的Pod,比如当前集群中的http-client-test、mytestcurl)
  3. 保留原脚本中其他资源的清理逻辑,确保Deployment、Service、ConfigMap的清理规则不变。

验证说明

结合当前集群状态,修改后的脚本会仅删除http-client-test和mytestcurl这两个无关联Deployment的Pod,其余由Deployment创建的Pod(如logging-event-xxx、my-workspace-xxx等)会被保留,完全符合需求。

内容的提问来源于stack exchange,提问作者生きがい

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:04:55