如何获取 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
匹配 1
和 9
范围内的单个字符
\/
匹配字符 / 字面意思
</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
我正在使用 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
匹配 1
和 9
范围内的单个字符
\/
匹配字符 / 字面意思
</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