Kubernetes costum-columns选择数组中的元素

时间:2017-04-05 08:17:35

标签: kubernetes kubectl

我尝试编写模板,列出我的服务名称以及外部端点+端口。但是,我没有找到任何示例或文档如何从数组中选择元素,在这种情况下port来自ports数组。

我走得那么远:

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

举一个更具体的例子,这是我正在运行的服务:

NAME                  CLUSTER-IP     EXTERNAL-IP      PORT(S)                               AGE
kafka-manager         10.3.242.200   146.148.20.235   9000:32619/TCP                        11h
spark-master          10.3.242.209   104.199.21.235   7077:30588/TCP                        11h

我希望得到:

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

3 个答案:

答案 0 :(得分:18)

<强> 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

<强>详细信息:

所以kubernetes在json-path-expr之后期待header。我在使用表达式时遇到的错误如下:

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

因此,迭代列表中的所有元素而不是放置索引只需使用*

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

答案 1 :(得分:0)

这会对你有用吗?

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

答案 2 :(得分:0)

您可以使用*来了解json中的哪些数据。例如:

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

对于我来说kubectl get svc -o custom-columns=svc:.metadata.name,IP:.metadata.annotations.domainName,PORT:.spec.ports[*].targetPort很完美(由于外部IP信息),看起来像:

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