我正在寻找一种删除特定名称空间的特定部署的所有pod的方法。换句话说,给定:
x-名称空间列表
y-部署列表
for i in x:
for j in y:
delete all pods of deployment j in namespace i
如果有人知道如何在bash命令中做到这一点,我会很高兴。
谢谢!
答案 0 :(得分:4)
我相信这样会做到:
#!/bin/bash
NAMESPACES=( n1 n2 n3 )
DEPLOYMENTS=( dep1 dep2 dep3 )
for i in "${NAMESPACES[@]}"
do
for x in "${DEPLOYMENTS[@]}"
do
# Get the pods in the deployment
PODS=$(kubectl -n $i get pods --no-headers | awk '{print $1}' | grep $x | tr '\n' ' ')
kubectl -n $i delete pods $PODS
done
done
答案 1 :(得分:1)
通常使用标签选择器来执行此操作。您可以在模板元数据中放置一些内容,例如labels: {app: foo}
,然后再添加kubectl delete pod --all-namespaces -l app=foo
。
答案 2 :(得分:1)
如果您需要“单行”解决方案,则可以将bash的花括号扩展名与Kubernetes' Labels and Selectors一起使用:
eval 'kubectl delete pods --namespace='{n1,n2,n3}' --selector='{app=foo1,app=foo2,svc=svc1,svc=svc2}';'
另一种写法:
eval 'kubectl delete pods -n '{n1,n2,n3}' -l '{"'app in (foo1,foo2)'","'svc in (svc1,svc2)'"}';'
答案 3 :(得分:1)
您已经在评论中解释说,您的用例是让Pods
从ConfigMaps
提取新数据。为此,您不需要直接删除任何Pod。
如果您的Pods
是通过已安装的卷从ConfigMaps
获取数据的,而您没有使用subPath
功能,那么ConfigMap
的更改将自动被获取,您无需对您的Deployments
或Pods
进行任何操作(您可能需要等待一分钟左右的时间才能传播更改)。为了使此功能正常工作,Pod
中的应用程序需要监视对已挂载文件的更改,并在出现更改时将其合并。
另一方面,如果您的Pods
通过环境变量提取值,那么您只需要重新启动Deployments
,这对于{{1} }命令而不是删除命令,实际上您根本不需要直接与kubectl
混为一谈。使用Pods
:
kubectl rollout restart