如何获取 pods 的列表,其中 "ready"?

How to get list of pods which are "ready"?

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

 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

我只想获得那些 pods 是“ready”(已通过 readinessProbe)的那些。是否有 returns 仅“ready”pods 的 kubectl 命令?如果不是 kubectl 命令,那么也许还有其他方式?

您可以尝试使用 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'

你可以使用这个命令:

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

这将 return 您 pods 容器“准备就绪”。

要在不使用 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}'

这将为您 return 您提供“就绪”的 pod 名称。

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

kubectl get pod |grep -P '\s+([1-9]+[\d]*)\/\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]+)\/\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]+[\d]*)\/\s+'
NAME   READY  STATUS     RESTARTS  AGE
app_3   0/1    Completed  0         77m
app_17  4/8    Running    0         77m

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

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

解释:

\s 匹配任何空白字符 + 匹配前面的标记一次到无限次,越多越好

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

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

\s 匹配任何空白字符 + 匹配前一个介于 one 和 unlimit

之间的标记
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

您可以简单地使用本机 kubectl CLI 中的 field-selector 选项来过滤掉 non-running pods:

kubectl get pods --field-selector status.phase=Running

通过使用本机 CLI,您可以将自定义列过滤器用作同一命令的一部分以进行额外的输出自定义:

kubectl get pods --field-selector status.phase=Running --no-headers -o custom-columns=":metadata.name