私はサービスの名前とそれらの外部エンドポイント+ポートをリストするために、テンプレートを作成しようとしています。しかし、配列から要素を選択する方法やドキュメント(この場合は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
[〜#〜] 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はheader
の後にjson-path-expr
を期待しています。式で遊んだときのエラーは次のとおりです。
expected <header>:<json-path-expr>
したがって、インデックスを置く代わりにリストのすべての要素を反復するには、*
を使用します。
他のさまざまなjson-path式が見つかります here 。
*を使用して、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
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
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
それでうまくいきますか?
kubectl get service -o = custom-columns = NAME:.metadata.name、IP:.spec.clusterIP、PORT:.spec.ports [0] .targetPort