我试图通过使用 -o=jsonpath 来获取 pods 的就绪状态。 为了更清楚地了解我想要什么,我想使用 -o=jsonpath 获取以下示例的值 1/1。
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
但是,我不知道如何获得就绪状态。我想要的是类似于这样的输出:
some_namespace1 pod_name1 1/1
我知道我可以使用像cut这样的bash命令:
kubectl get pods --all-namespaces| tail -1 | cut -d' ' -f8
但是,我想通过使用kubectl来获取它
您可以使用以下命令获取所有 pod 状态:
kubectl get pods -o jsonpath={.items[*].status.phase}
可用于名称的类似命令
kubectl get pods -o jsonpath={.items[*].metadata.name}
编辑:
您需要比较.status.replicas
和.status.readyReplicas
,以获得有多少个现成的副本。
我认为这并没有直接在 Kubernetes API 中报告。
如果你kubectl get pod ... -o yaml
(或-o json
),你将得到一个与List
匹配的对象(不包括在 API 文档中),其中每个项目都是 Kubernetes API 中的一个 Pod,并且-o jsonpath
值遵循该对象结构。 特别是 PodStatus 有一个 ContainerStatus 列表,每个 ContainerStatus 都可能是也可能不是ready
,但 API 本身不会将计数作为第一类字段返回。
有几种不同的 JSONPath 实现。 我认为 Kubernetes 只支持 Kubernetes 文档中的语法,其中不包含任何类型的"长度"函数。 (原始的JavaScript实现和现成的Googlable Java实现似乎都略有不同,语法略有不同。
我能想到的最好的办法是报告所有单个容器的"就绪"状态
kubectl get pods
-o $'jsonpath={range .items[*]}{.metadata.name}t{.status.containerStatuses[*].ready}n{end}'
($'...'
是 bash/zsh 语法),但这仍然需要一些后处理才能恢复原始计数。