如何删除 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创建的=] 或 deployment
或 statefulset
等。这意味着,它们将被删除并重新生成。
您可以通过以下方式筛选和删除 运行 pods:
kubectl delete pods -n <NAMESPACE> --field-selector=status.phase=Running
kubectl delete daemonsets,replicasets,services,deployments,pods,rc,ingress --all --all-namespaces
还有控制器
以这个场景为例:
我想使用命令行自动删除每个运行 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创建的=] 或 deployment
或 statefulset
等。这意味着,它们将被删除并重新生成。
您可以通过以下方式筛选和删除 运行 pods:
kubectl delete pods -n <NAMESPACE> --field-selector=status.phase=Running
kubectl delete daemonsets,replicasets,services,deployments,pods,rc,ingress --all --all-namespaces
还有控制器