Получить первый элемент карты при использовании шаблона kubectl get ... -o - PullRequest
1 голос
/ 02 февраля 2020

У меня есть служба, и я хотел бы получить IP-адрес от его значения c, используя -o go-template Я могу сделать это следующим образом:

kubectl get service webapp1-loadbalancer-svc -o go-template='{{(index .status.loadBalancer.ingress 0).ip}}'

Возвращает IP-адрес первого входа в балансировщике нагрузки, что я и хочу.

Однако вместо использования -o go-template я бы хотел использовать -o template. Я пробовал несколько команд, но я не могу это сделать. Самое близкое, что у меня работает, это:

kubectl get service webapp1-loadbalancer-svc -o template={{.status.loadBalancer.ingress}}

Но это возвращает карту [map[ip:172.17.0.28]], а не только IP. Все, что я пытался получить IP в той же команде, возвращает ошибки при выполнении шаблона.

Есть ли способ получить IP с карты, используя одну команду kubectl, используя -o template вместо -o go-template

1 Ответ

2 голосов
/ 02 февраля 2020

Kubectl поддерживает шаблон JSONPath.

Используя JsonPath, вы можете получить IP-адрес кластера службы или другие подробности, как показано ниже.

ubuntu@k8s-master:~$ kubectl get all -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
pod/nginx   1/1     Running   0          129m   192.168.85.226   k8s-node01   <none>           <none>

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   2d2h   <none>
service/nginx        ClusterIP   10.96.184.196   <none>        80/TCP    11m    run=nginx


ubuntu@k8s-master:~$ kubectl get service nginx -o jsonpath='{.spec.clusterIP}'
10.96.184.196

Использование JsonPath Хорошо работает с типом LoadBlancer а также .. надеюсь, это то, с чем вы хотите работать.

$ kubectl get all -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
pod/nginx   1/1     Running   0          133m   192.168.85.226   k8s-node01   <none>           <none>

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        2d2h   <none>
service/nginx        LoadBalancer   10.100.165.17   <pending>     80:30852/TCP   5s     run=nginx
ubuntu@k8s-master:~$



10.100.165.17ubuntu@k8s-master:~$ kubectl get service nginx -o jsonpath='{.spec.type}'
LoadBalancer

ubuntu@k8s-master:~$ kubectl get service nginx -o jsonpath='{.spec.clusterIP}'
10.100.165.17

Так что при извлечении ПОРТОВ также возвращает карту, как показано ниже

$ kubectl get service nginx -o jsonpath='{.spec.ports}'

[map[nodePort:30852 port:80 protocol:TCP targetPort:80]]

вы можете извлекать nodePort, port и targetPort каждый, как показано ниже

$ kubectl get service nginx -o jsonpath='{.spec.ports[].targetPort}'
80

ubuntu@k8s-master:~$ kubectl get service nginx -o jsonpath='{.spec.ports[].nodePort}'
30852

ubuntu@k8s-master:~$ kubectl get service nginx -o jsonpath='{.spec.ports[].port}'
80

Надеюсь, приведенные выше примеры помогут вам исправить ваш запрос

I думаю, что вы должны быть в состоянии сделать эту команду при использовании jsonpath.

kubectl get service webapp1-loadbalancer-svc -o jsonpath={{.status.loadBalancer.ingress[].ip}}
...