【问题标题】:How to delete every Pod in a Kubernetes namespace如何删除 Kubernetes 命名空间中的每个 Pod
【发布时间】:2021-09-12 23:00:46
【问题描述】:

以这个场景为例:

我想使用命令行自动删除每个运行 pod,而不必为每个pod 键入kubectl delete pod <pod_name> -n <namespace>。

【问题讨论】:

    标签: linux bash shell kubernetes kubectl


    【解决方案1】:

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

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

    例子:

    for pod in $(kubectl  get pod -n $NAMESPACE |awk '$3=="Running"{print $1}'); 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 变量中的所有 pod。

    示例:

    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 状态的 pod:

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

    虽然您没有要求ready 状态,但可以使用以下查询列出处于就绪状态的 pod。

    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]+)\/\1\s+'
    

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

    【讨论】:

      【解决方案2】:

      您可以通过以下方式过滤和删除正在运行的 pod:

      kubectl delete pods -n <NAMESPACE> --field-selector=status.phase=Running
      

      【讨论】:

        【解决方案3】:

        这是我为完成任务而制作的一个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 个单词 并执行我想要的任何命令。

        不过,这感觉还是一种幼稚的方法。欢迎分享更好的。

        【讨论】:

          猜你喜欢
          • 2022-08-19
          • 2016-02-04
          • 2016-11-10
          • 1970-01-01
          • 2019-09-15
          • 2019-05-15
          • 1970-01-01
          • 1970-01-01
          • 2021-11-10
          相关资源
          最近更新 更多