使用自定义列 Kubernetes CLI 输出选择数组元素

Selecting Array Elements with the Custom Columns Kubernetes CLI Output

如何将 Kubernetes CLI (kubectl) 的 --output=custom-columns 选项用于 select 数组元素?

换句话说,我该如何转:

kubectl get services

#=>

NAME            TYPE       CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
kafka-manager   NodePort   10.3.242.200   146.148.20.235   9000:32619/TCP   0d
spark-master    NodePort   10.3.242.209   104.199.21.235   9000:32619/TCP   0d

进入这个?

kubectl get services \
--output=custom-columns=. . .

#=>

NAME            EXTERNAL-ENDPOINT     
kafka-manager   146.148.20.225:9000
spark-master    104.199.21.225:7077

我目前拥有的:

kubectl get services \
--output=custom-columns='NAME:.metadata.name,IP:.spec.clusterIP,PORT:.spec.ports'

#=>

NAME            IP             PORT
kafka-manager   10.3.242.200   [map[nodePort:32619 port:9000 protocol:TCP targetPort:9000]]
spark-master    10.3.242.209   [map[nodePort:30588 port:7077 protocol:TCP targetPort:7077]]

这对你有用吗?

kubectl get service -o=custom-columns=NAME:.metadata.name,IP:.spec.clusterIP,PORT:.spec.ports[0].targetPort

TLDR

对于列表中的元素,在方括号中使用 *

因此您的查询应如下所示:

kubectl get service \
-n kube-system \
-o=custom-columns='NAME:.metadata.name,IP:.spec.clusterIP,PORT:.spec.ports[*].targetPort'

#=>

NAME                   IP           PORT
kube-dns               10.0.0.10    53,53
kubernetes-dashboard   10.0.0.250   9090

注意 PORT:.spec.ports[*].targetPort 中的 *

详情:

所以 kubectl 期待 json-path-exprheader 之后。我在玩表达式时遇到的错误如下:

expected <header>:<json-path-expr>

要遍历列表中的所有元素而不是放置索引,只需使用 *.

可以找到各种其他 json 路径表达式 here

您可以使用 * 来理解 JSON 中的数据。例如:

kubectl get svc gdpr -o custom-columns='svc:*'

对于我来说,get 命令非常完美(由于外部 IP 信息。)并且看起来像:

kubectl get svc -o custom-columns='SVC:.metadata.name,IP:.metadata.annotations.domainName,PORT:.spec.ports[*].targetPort'

#=>

SVC      IP          PORT
event    site1.com   9000 
gdpr     site2.com   3333,8080
svcInt   none        80
ui       site6.com   80,6123,6124,6125,8081

P.S。关于列出外部 IP 和主机:

kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name} {.status.addresses[?(@.type=="ExternalIP")].address}{"\n"}'

#=>

ip-10-10-40-13.xxxxx.internal xx.xx.xx.175
ip-10-10-40-15.xxxxx.internal xx.xx.xx.236
ip-10-10-40-18.xxxxx.internal xx.xx.xx.207
kubectl get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type=="ExternalIP")].address}{"\n"}'

#=>

xx.xx.xx.175
xx.xx.xx.236
xx.xx.xx.207

如果您想使用自定义列在地图中进行搜索,您可以使用

[?(@.Key=="Value"]

如果要使用它,重要的是 custom-columns 中的查询必须是内部 ['] 字符。

例如,以下查询失败:

kubectl get nodes -o=custom-columns=NAME:.metadata.name,CPU:.status.capacity.cpu,MEM:.status.capacity.memory,IP:.status.addresses[?(@.type=="InternalIP")].address

bash: syntax error near unexpected token `('

但是如果我们使用 ['] 字符执行相同的查询,它会起作用:

kubectl get nodes -o=custom-columns='NAME:.metadata.name,ROLE:TOBEDEFINED,CPU:.status.capacity.cpu,MEM:.status.capacity.memory,IP:.status.addresses[?(@.type=="InternalIP")].address'
NAME        CPU   MEM   IP
name-node   8     8     10.10.10.10