如何删除特定名称空间的特定部署的所有Pod?

时间:2019-09-24 18:06:49

标签: bash kubernetes

我正在寻找一种删除特定名称空间的特定部署的所有pod的方法。换句话说,给定:

  

x-名称空间列表
  y-部署列表

for i in x:
  for j in y:
    delete all pods of deployment j in namespace i

如果有人知道如何在bash命令中做到这一点,我会很高兴。

谢谢!

4 个答案:

答案 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)

您已经在评论中解释说,您的用例是让PodsConfigMaps提取新数据。为此,您不需要直接删除任何Pod。

如果您的Pods是通过已安装的卷从ConfigMaps获取数据的,而您没有使用subPath功能,那么ConfigMap的更改将自动被获取,您无需对您的DeploymentsPods进行任何操作(您可能需要等待一分钟左右的时间才能传播更改)。为了使此功能正常工作,Pod中的应用程序需要监视对已挂载文件的更改,并在出现更改时将其合并。

另一方面,如果您的Pods通过环境变量提取值,那么您只需要重新启动Deployments,这对于{{1} }命令而不是删除命令,实际上您根本不需要直接与kubectl混为一谈。使用Pods

kubectl rollout restart