对 kubectl get pods 命令进行故障排除:为什么 .spec.containers.ports.containerPort 返回 <none>?

1 kubernetes google-kubernetes-engine kubectl

我正在使用命令获取分配给 pod 的 IP 地址kubectl get pods -o custom-columns="POD_IP":.status.podIPs

基于相同的方法,我使用kubectl get pods -o custom-columns="POD_PORT":.spec.containers.ports.containerPort命令来获取端口号,但它是空白的。

cloudshell:~$ kubectl get pods -o custom-columns="POD_IP":.status.podIPs
POD_IP
[map[ip:10.32.0.194]]

cloudshell:~$ kubectl get pods -o custom-columns="POD_PORT":.spec.containers.ports.containerPort
POD_PORT
<none>

cloudshell:~$ kubectl get pods -o custom-columns="POD_PORT":.spec.containers
POD_PORT
[map[image:nginx:1.10.1 imagePullPolicy:IfNotPresent name:servic1 ports:[map[containerPort:8080 protocol:TCP]] resources:map[limits:map[cpu:500m ephemeral-storage:1Gi memory:2Gi] requests:map[cpu:500m ephemeral-storage:1Gi memory:2Gi]] securityContext:map[capabilities:map[drop:[NET_RAW]]] terminationMessagePath:/dev/termination-log terminationMessagePolicy:File volumeMounts:[map[mountPath:/var/run/secrets/kubernetes.io/serviceaccount name:kube-api-access-mgk8k readOnly:true]]]]

cloudshell:~$ 
Run Code Online (Sandbox Code Playgroud)

我尝试使用kubectl get pods -o custom-columns="Port Number of Pod":.spec.containers命令,我可以看到我的映射 ( .spec.containers.ports.containerPort) 是正确的,但不知何故它仍然无法正常工作。

我完全确定.spec.containers.ports.containerPort映射正确,并且相同的命令格式给出了 IP 地址,因此无法发现错误。

有人能发现这里出了什么问题吗?

Daz*_*kin 5

尝试:

kubectl get pods \
--output=custom-columns=\
"POD_PORT":.spec.containers[*].ports[*].containerPort
Run Code Online (Sandbox Code Playgroud)

您也可以添加.metadata.name以帮助清晰:

kubectl get pods \
--output=custom-columns=\
"NAME":.metadata.name,\
"POD_PORT":.spec.containers[*].ports[*].containerPort
Run Code Online (Sandbox Code Playgroud)

它没有明确(!?)记录,但我怀疑格式是 kubectl 的JSONPath并且(似乎)之间存在微妙的区别,例如,.spec.containers[]前者.spec.containers[*]在找不到属性时停止,而后者包括所有内容。

因为.spec总会包含一个或多个.containers,但每个container可能都没有.ports,你还可以:

kubectl get pods \
--output=custom-columns=\
"POD_PORT":.spec.containers[].ports[*].containerPort
Run Code Online (Sandbox Code Playgroud)

但效果相同containers[]ports[*]

注意,如容器 v1 核心中所述,请参阅“端口”,容器公开的端口不需要通过ports即此命令将返回记录的端口来指定,但此列表可能排除容器公开的端口(且未记录)。