【问题标题】:How to get list of pods which are "ready"?如何获取“就绪”的 pod 列表?
【发布时间】:2020-03-18 10:32:35
【问题描述】:

我正在使用 kubectl 来检索 pod 列表:

 kubectl get pods --selector=artifact=boot-example -n my-sandbox  

我得到的结果是:

NAME                           READY   STATUS    RESTARTS   AGE
boot-example-757c4c6d9c-kk7mg   0/1     Running   0          77m
boot-example-7dd6cd8d49-d46xs   1/1     Running   0          84m
boot-example-7dd6cd8d49-sktf8   1/1     Running   0          88m

我只想获取那些“ready”(已通过 readinessProbe)的 pod。是否有任何 kubectl 命令只返回“ready” pod?如果不是 kubectl 命令,那也许是其他方式?

【问题讨论】:

    标签: kubernetes kubectl kubernetes-pod


    【解决方案1】:

    您可以尝试使用 jq 根据需要转换 kubectl json 输出的命令。

    kubectl get pods --all-namespaces -o json  | jq -r '.items[] | select(.status.phase = "Ready" or ([ .status.conditions[] | select(.type == "Ready") ] | length ) == 1 ) | .metadata.namespace + "/" + .metadata.name'
    

    【讨论】:

    • 不幸的是我没有“jq”命令。我收到错误消息:“bash: jq: command not found”
    • 恢复了,我犯了一个错误,第二个命令确实显示没有准备好 pod.. 安装和使用 jq:) 它非常有用:)
    • 解决方案不仅适用于我,也适用于我的同事。他们需要做的步骤越少越好。
    【解决方案2】:

    你可以使用这个命令:

    kubectl -n your-namespace get pods -o custom-columns=NAMESPACE:metadata.namespace,POD:metadata.name,PodIP:status.podIP,READY-true:status.containerStatuses[*].ready | grep true
    

    这将返回带有“ready”容器的 pod。

    要在不使用 grep 的情况下执行此操作,您可以使用以下命令:

    kubectl -n your-namespace get pods -o go-template='{{range $index, $element := .items}}{{range .status.containerStatuses}}{{if .ready}}{{$element.metadata.name}}{{"\n"}}{{end}}{{end}}{{end}}'
    
    kubectl -n your-namespace get pods -o jsonpath='{range .items[*]}{.status.containerStatuses[*].ready.true}{.metadata.name}{ "\n"}{end}'
    

    这将返回“ready”的 pod 名称。

    【讨论】:

    • 这是一个解决方案,除了 kubectl 之外没有任何外部工具,可以将“Ready”字段与 pod 的其他数据一起返回给您。您可以使用 grep 仅过滤“Ready”为“true”的 pod
    • 这对我有用。无论如何,我仍然会等待使用纯 kubectl(没有 grep)的答案
    • 我已经编辑了答案以提供一个解决方案,而不使用 grep。新命令将返回“就绪”的 pod 名称。
    • 更高版本的 kubectl 现在可以做到这一点 - kubectl get pods --field-selector=status.phase=Running
    • @nrjohnstone, status.phase=Running 并不意味着 pod 准备好了。
    【解决方案3】:

    使用kubectl get <resource-name> 命令查询时打印就绪状态的所有资源类型的通用答案。

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

    例子:

    kubectl get pod
    NAME   READY  STATUS     RESTARTS  AGE
    app_1   1/1    Running    0         77m
    app_2   1/1    Running    0         77m
    app_3   0/1    Completed  0         77m
    app_4   1/1    Running    0         77m
    app_5   8/8    Running    0         77m
    app_6   4/4    Running    1         77m
    app_7   1/1    Running    0         77m
    app_8   1/1    Running    0         77m
    app_9   1/1    Running    0         77m
    app_10  1/1    Running    0         77m
    app_11  1/1    Running    0         77m
    app_12  1/1    Running    0         77m
    app_13  1/1    Running    0         75m
    app_14  2/2    Running    0         77m
    app_15  2/2    Running    0         77m
    app_16  2/2    Running    0         76m
    app_17  4/8    Running    0         77m
    app_18  1/1    Running    0         77m
    app_19  1/1    Running    0         77m
    app_20  1/1    Running    0         77m
    app_21  1/1    Running    0         77m
    app_22  2/2    Running    0         77m
    app_23  3/3    Running    0         77m
    app_24  1/1    Running    0         77m
    app_25  1/1    Running    0         77m
    app_26  1/1    Running    0         77m
    app_27  1/1    Running    0         77m
    app_28  2/2    Running    0         77m
    

    示例输出:

    kubectl get pod| grep -P '\s+([1-9]+)\/\1\s+'
    app_1   1/1    Running    0         77m
    app_2   1/1    Running    0         77m
    app_4   1/1    Running    0         77m
    app_5   8/8    Running    0         77m
    app_6   4/4    Running    1         77m
    app_7   1/1    Running    0         77m
    app_8   1/1    Running    0         77m
    app_9   1/1    Running    0         77m
    app_10  1/1    Running    0         77m
    app_11  1/1    Running    0         77m
    app_12  1/1    Running    0         77m
    app_13  1/1    Running    0         75m
    app_14  2/2    Running    0         77m
    app_15  2/2    Running    0         77m
    app_16  2/2    Running    0         76m
    app_18  1/1    Running    0         77m
    app_19  1/1    Running    0         77m
    app_20  1/1    Running    0         77m
    app_21  1/1    Running    0         77m
    app_22  2/2    Running    0         77m
    app_23  3/3    Running    0         77m
    app_24  1/1    Running    0         77m
    app_25  1/1    Running    0         77m
    app_26  1/1    Running    0         77m
    app_27  1/1    Running    0         77m
    app_28  2/2    Running    0         77m
    

    打印未处于就绪状态的资源:

    kubectl get pod |grep -Pv '\s+([1-9]+)\/\1\s+'
    NAME   READY  STATUS     RESTARTS  AGE
    app_3   0/1    Completed  0         77m
    app_17  4/8    Running    0         77m
    

    grep命令感兴趣的人,推荐阅读正则表达式中“捕获组”和“反向引用”的概念。但是,这里添加了一个简短的描述。

    \s+([1-9]+)\/\1\s+

    解释:

    \s 匹配任何空白字符 + 匹配前一个令牌一次到无限次,尽可能多次

    1st抓捕组([1-9]+)

    匹配下面列表中的单个字符[1-9] + 匹配前一个令牌一次到无限次,尽可能多次 1-9 匹配 19 范围内的单个字符 \/ 匹配字符 / 字面意思 \1 匹配与第一个捕获组最近匹配的相同文本,在本例中为 [1-9]+

    \s 匹配任何空白字符 + 匹配前一个令牌,介于 1 和 unlimit 之间

    【讨论】:

    • 你能解释一下你的 grep 巫术吗?
    • @Slashterix 添加了一些注释,但建议阅读正则表达式中的“捕获组”和“反向引用”的概念。
    【解决方案4】:
    for i in $(k get po -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}')
        do
            if [[ $(kubectl  get po $i -o jsonpath='{.status.containerStatuses[*].ready}') == 'true'  ]]
                then 
                    echo $i
            fi
        done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 2020-04-09
      • 1970-01-01
      • 2019-07-01
      • 2020-06-27
      • 2021-08-15
      • 2020-07-14
      • 1970-01-01
      相关资源
      最近更新 更多