如何删除 Kubernetes 命名空间中的每个 Pod

How to delete every Pod in a Kubernetes namespace

以这个场景为例:

我想使用命令行自动删除每个运行 pod无需为每个广告连播键入 kubectl delete pod <pod_name> -n <namespace>

这是我为完成任务而制作的shellscript,

i=0 && for pod in $(kubectl get pods | grep 'Running')
  do 
    if [ `expr $i % 5` == 0 ]
      then kubectl delete pod $pod
    fi
  i=`expr $i + 1`
done

我发现当我们遍历 kubectl get pods | grep 'Running' 时,每第 5 个单词是一个 pod 名称

所以我编写的脚本基本上是从循环中取出 每个第 5 个字 并执行我想要的任何命令。

不过,这感觉像是 天真 方法。欢迎分享更好的

您可以使用 awk 根据 STATUS==RUNNING 过滤 pod 名称。下面的代码将从 $NAMESPACE 命名空间中删除所有(在 运行 状态下)pods。

 kubectl  get pod -n $NAMESPACE|awk '=="Running"{print }'

示例:

for pod in $(kubectl  get pod -n $NAMESPACE |awk '=="Running"{print }'); do
    kubectl delete pod -n $NAMESPACE $pod
done

您可以使用 jsonpath,

NAMESPACE=mynamespace
for pod in $(kubectl  get pod -n $NAMESPACE -o jsonpath='{.items[?(@.status.phase=="Running")].metadata.name}{"\n"}'); do
    kubectl delete pod -n $NAMESPACE "$pod"
done

注意:以上代码将导致删除 $NAMESPACE 变量中的所有 pods。

示例:

kubectl get pod -n mynamespace
NAME        READY   STATUS      RESTARTS   AGE
foo-mh6j7   0/1     Completed   0          5d3h
nginx       1/1     Running     2          7d10h
mongo       2/2     Running     12         57d
busybox     1/1     Running     187        61d

jsonpath 查询打印 Running 状态下的所有 pods:

kubectl  get pod -n mynamespace -o jsonpath='{.items[?(@.status.phase=="Running")].metadata.name}{"\n"}'
nginx mongo busybox

虽然你没有要求 ready 状态,但是下面的查询可以用来 list pods in ready state.

kubectl  get pod -n mynamespace -o jsonpath='{range .items[*]}{.status.containerStatuses[*].ready.true}{.metadata.name}{ "\n"}{end}'
foo-mh6j7
nginx
mongo
busybox

同样,这可以通过 grep:

kubectl get pod -n $NAMESPACE |grep -P '\s+([1-9]+)\/\s+'

注意:任何一种解决方案都不会阻止pods重生如果它们是通过[=27创建的=] 或 deploymentstatefulset 等。这意味着,它们将被删除并重新生成。

您可以通过以下方式筛选和删除 运行 pods:

kubectl delete pods -n <NAMESPACE> --field-selector=status.phase=Running
kubectl delete daemonsets,replicasets,services,deployments,pods,rc,ingress --all --all-namespaces

还有控制器