使用自定义列 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-expr
在 header
之后。我在玩表达式时遇到的错误如下:
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
如何将 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-expr
在 header
之后。我在玩表达式时遇到的错误如下:
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