【发布时间】:2019-07-21 14:05:18
【问题描述】:
我正在尝试获取所有 pod 中所有非就绪容器的列表,以调试集群中的网络问题。
是否可以使用 kubectl 获取所有 pod 中所有容器及其状态 (READY/..) 的干净列表?
我正在使用
$ kubectl get pods
但是,输出可能很大,并且很难知道哪些容器已准备好,哪些有问题。
谢谢。
【问题讨论】:
标签: kubernetes kubectl
我正在尝试获取所有 pod 中所有非就绪容器的列表,以调试集群中的网络问题。
是否可以使用 kubectl 获取所有 pod 中所有容器及其状态 (READY/..) 的干净列表?
我正在使用
$ kubectl get pods
但是,输出可能很大,并且很难知道哪些容器已准备好,哪些有问题。
谢谢。
【问题讨论】:
标签: kubernetes kubectl
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .status.containerStatuses[*]}{.ready}{", "}{end}{end}'
编辑来描述 jsonpath 正在做什么:
根据我对 jsonpath 的理解,range 会迭代通过获取 pod 返回的所有 .items[*]。添加 \n 以将结果拆分为每行一个,否则结果将变为一行。要查看其余部分如何工作,您应该选择一个 pod 并运行:
kubectl get pod podname -o yaml
.metadata.name 对应
apiVersion: v1
kind: Pod
metadata:
name: podname
类似地,.status.containerStatuses[*] 对应于容器状态列表,该列表应位于底部。
【讨论】:
我已调整 @joshua-oliphant's answer 以包含容器名称:
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .status.containerStatuses[*]}{.name}{": "}{.ready}{", "}{end}{end}'
这将显示所有 Pod,包括当前命名空间中的所有容器及其就绪状态,例如:
pod-name: container-name-a: true, container-name-b: false
【讨论】:
使用 jq,我们可以列出所有 pod 及其容器的状态:
kubectl get pods --output=json | jq --raw-output '.items | map([.metadata.name, (.status.containerStatuses | map(.name + ": " + (.ready | tostring)))[]]) | .[] | join("\n ")'
这会显示如下内容:
pod-1234-auiend
container1: true
container2: false
another-pod-2454-123123:
container1: true
(...)
【讨论】: