kubernetes 如何获取“就绪”的Pod列表?

gk7wooem  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(8)|浏览(106)

我使用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。有没有只返回“ready”pod的kubectl命令?如果不是kubectl命令,那么可能是其他方法?

kgqe7b3p

kgqe7b3p1#

您可以使用以下命令:

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名称。

qco9c6ql

qco9c6ql2#

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

kubectl get pod |grep -P '\s+([1-9]+[\d]*)\/\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]+[\d]*)\/\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之间的前一个标记

wztqucjr

wztqucjr3#

你可以尝试这个命令,它根据你的需要使用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'

字符串

sqyvllje

sqyvllje4#

您可以简单地使用本机kubectl CLI中的field-selector选项过滤掉未运行的Pod:
kubectl get pods --field-selector status.phase=Running
通过使用本机CLI,您可以将自定义列过滤器作为同一个命令的一部分,以进行额外的输出自定义:
kubectl get pods --field-selector status.phase=Running --no-headers -o custom-columns=":metadata.name

j5fpnvbx

j5fpnvbx5#

在阅读了这里发布的答案并使用其中的一些作为参考(所以我的解决方案是从其他答案中派生出来的)之后,这里是我用来计算完全就绪的pod的方法(即运行(status.phase=Running)pod,其所有容器都处于就绪状态,(即containerStatuses[*].ready=true))

kubectl get pods -l app="myservice-service" --field-selector status.phase=Running -o 'custom-columns="NAME":.metadata.name,"READY":.status.containerStatuses[*].ready,"STATUS":.status.phase' | awk '$2 !~ /.*false.*/'
NAME                                   READY       STATUS
myservice-service-74dc69d4-7t662   true,true   Running
myservice-service-74dc69d4-d4mtz   true,true   Running

字符串

  • awk删除具有一个或多个未就绪(即ready=false)容器的pod
  • --field-selector,用于仅获取Running pod
  • custom-columns用于打印自定义列,重要的是ready
oiopk7p5

oiopk7p56#

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

字符串

polkgigr

polkgigr7#

这个简单的方法对我很有效。
这将仅列出完全就绪的pod。

kubectl get pods <options> | grep -P "(\d+)\/\1\s+Running"

字符串
这将检查这两个条件。
1.状态=正在运行

  1. Pod中的所有容器也准备就绪
    reg-ex的解释:
    (\d+)一次或多次出现的数字,括号表示第1组
    \/后跟斜杠字符
    \1与第一组的相同值再次匹配
    \s+一个或多个空格
    Running文字“Running”。
    这将确保READY列两侧具有相同的数字,如1/1或2/2等
    下一个状态列应等于Running
gudnpqoy

gudnpqoy8#

@sjethvani
如果你愿意用jq..你可以用更好的跨平台支持做更多有趣的事情。像这样的东西比像jsonpath这样的东西限制少得多

kubectl get pods -n online-boutique --field-selector=status.phase==Running -o=json | jq -r '.items[] | "---", "pod_name: " + .metadata.name, "containers:", (.spec.containers[] | "- container_name: " + .name, "  image_path: " + (.image | split(":")[0]), "  image_tag: " + (.image | split(":")[1])), "---"'

字符串
样品

---
pod_name: adservice-795589cf6f-b48ln
containers:
- container_name: server
  image_path: gcr.io/google-samples/microservices-demo/adservice
  image_tag: v0.5.1
---

相关问题