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

nik*_*nik 10 kubernetes kubectl

我尝试编写一个模板,列出我的服务名称以及它们的外部端点+端口.但是,我没有找到任何示例或文档如何从数组中选择元素,在本例中是portports数组中选择.

我走得那么远:

 kubectl get service -o=custom-columns=NAME:.metadata.name,IP:.spec.clusterIP,PORT:.spec.ports
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我希望得到:

NAME                  EXTERNAL-ENDPOINT     
kafka-manager         146.148.20.225:9000
spark-master          104.199.21.225:7077
Run Code Online (Sandbox Code Playgroud)

sur*_*ajd 23

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
Run Code Online (Sandbox Code Playgroud)

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

细节:

所以kubernetes期待一个json-path-expr接一个header.我在玩表达式时遇到的错误如下:

expected <header>:<json-path-expr>
Run Code Online (Sandbox Code Playgroud)

因此迭代列表中的所有元素而不是仅使用索引*.

可以在这里找到各种其他json路径表达式.

  • 得到它,你需要引用你的自定义列表达式,所以这是有效的:`kubectl get service -n kube-system -o = custom-columns ="NAME:.metadata.name,IP:.spec.clusterIP,PORT: .spec.ports [*].TARGETPORT"` (3认同)
  • 这适用于 bash,使用 zsh 我得到 `zsh: no matches find: -o=custom-columns=NAME:.metadata.name,IP:.spec.clusterIP,PORT:.spec.ports[*].targetPort`。有任何想法吗? (2认同)

pca*_*ana 6

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

[?(@.Key=="Value"]
Run Code Online (Sandbox Code Playgroud)

如果您想使用它,重要的一点是自定义列中的查询必须是内部[']字符。

例如,以下查询失败:

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

bash:意外标记“(”附近出现语法错误

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

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'
Run Code Online (Sandbox Code Playgroud)
NAME        CPU   MEM   IP
name-node   8     8     10.10.10.10
Run Code Online (Sandbox Code Playgroud)


小智 5

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

kubectl get svc gdpr -o custom-columns='svc:*'
Run Code Online (Sandbox Code Playgroud)

对于我来说,该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
Run Code Online (Sandbox Code Playgroud)

PS关于列出外部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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)