使用kubectl -o=jsonpath命令获取准备就绪状态

3
我试图使用 -o=jsonpath 来获取Pod的Ready状态。为了更清晰地表达我的意思,我想使用以下示例中的值1/1来使用 -o=jsonpath。
NAME       READY     STATUS    RESTARTS   AGE
some_pod   1/1       Running   1          34d

我已经成功获取了一些信息,例如pod的名称或命名空间。

kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{end}'

我得到了如下内容:

some_namespace1 pod_name1

然而,我不知道如何获取“Ready”状态。我想要的输出类似于这个:

some_namespace1 pod_name1 1/1

我知道可以使用像 cut 这样的 bash 命令:

kubectl get pods --all-namespaces| tail -1 | cut -d' ' -f8

然而,我希望通过使用kubectl获取它。
2个回答

4
您可以使用以下命令获取所有pods的状态:
kubectl get pods -o jsonpath={.items[*].status.phase}

您可以使用类似的命令来操作名称

kubectl get pods -o jsonpath={.items[*].metadata.name}

编辑:

您需要比较.status.replicas.status.readyReplicas以获取有多少个就绪副本。


是的,我知道,因为我在问题中已经添加了,我可以通过使用jsonpath获取许多东西。但是,我想特别获取就绪状态。如果我使用以下命令检查所有json:kubectl get pod -o json,我无法在任何地方看到1/1字符串。 - pcampana
1
在这种情况下,您需要比较.status.replicas.status.readyReplicas以获取该信息。 - Prafull Ladha
你可能需要在jsonpath周围添加引号:kubectl get pods --all-namespaces -o jsonpath="{.items[*].status.phase}" - cbron

1
我认为这在Kubernetes API中没有直接报告。
如果您使用kubectl get pod ... -o yaml(或-o json),您将返回与API文档中未包含的List匹配的对象,其中每个项目都是Kubernetes API中的Pod-o jsonpath值遵循该对象结构。特别是PodStatus具有ContainerStatus列表,其中每个容器可能或可能不会准备就绪,但API本身不会返回计数作为一级字段。
有几种不同的JSONPath实现。我认为Kubernetes只支持Kubernetes文档中的语法,其中不包括任何类型的“length”函数。(原始的JavaScript实现和一个易于搜索的Java实现都似乎支持,但语法略有不同。)
我能想到的最好方法是报告所有单独容器的“ready”状态。
kubectl get pods \
  -o $'jsonpath={range .items[*]}{.metadata.name}\t{.status.containerStatuses[*].ready}\n{end}'

$'...' 是bash/zsh语法),但这仍需要一些后处理才能得到原始计数。

1
kubectl get pods -o jsonpath="{range .items[*]}{@.metadata.name}{'\t\t'}{@.status.conditions[?(@.type=='Ready')].status}{'\n'}" - Vaccano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接