ども、k69 です。
kubernetesの状態をkubectlで確認するときにkubectl get
コマンドを使うのですが、このとき必要な情報だけを出力した場合がよくあります。kubectl get -h
で調べてみると-o go-template-file=...
が使えそうだと思い、
じゃ、「go-template-file=...
オプションを使って、kubernetes上のPodとServiceのIPを出力してみよう!」とウニウニしたのがこの記事です。
※ ツッコミなどコメントお待ちしてます m(_ _)m
対象読者
- kubectl get コマンドで必要な情報だけ抽出したい人
- go-templateをつかったことない人
前提条件
- kubectlを使用したことがあるユーザ
手順
1. PodとServiceの各IPを取得するためのgo-template-fileを作成します。
ファイル名:getK8sIP.tpl(任意)
{{- range .items}} ★1
{{- if (eq "Pod" .kind) }}
{{"-----"}}
{{"kind:\t"}}{{.kind}}
{{"name:\t"}}{{.metadata.name}}
{{"hostIP:\t"}}{{.status.hostIP}}
{{"podIP:\t"}}{{.status.podIP}}
{{- else if (eq "Service" .kind) }} ★2
{{"-----"}}
{{"kind:\t"}}{{.kind}}
{{"name:\t"}}{{.metadata.name}} ★3
{{"clusterIP:\t"}}{{.spec.clusterIP}} ★4
{{- end}}
{{- end}}
go-templateは「クセが強い!」ので、なかなかとっつきにくいですが慣れれば難易度は低いと思います(自分も少し触っただけですが www)
kubectl get all --all-namespaces -o json
コマンドでgo-templateで絞り込む前の状態を確認してみましょう。
{
"apiVersion": "v1",
"items": [ ★1
{
"apiVersion": "v1",
"kind": "Service", ★2
"metadata": {
~~省略~~
"name": "kubernetes", ★3
~~省略~~
},
"spec": {
"clusterIP": "10.96.0.1", ★4
"ports": [
~~省略~~
],
"sessionAffinity": "ClientIP",
"sessionAffinityConfig": {
~~省略~~
},
"type": "ClusterIP"
},
"status": {
"loadBalancer": {}
}
},
{
~~省略~~
},
~~繰り返し~~
]
★部分について説明します。
★1 rangeはアクション(関数みたいなもの)で、itemsをイテレーションでループさせます。
★2 itemsの直下の階層にある kindを取得し、"Service"(文字列)と等しいか判定します。
★3 itemsの直下の階層にある metadataの下のnameを取得し、出力します。
★4 itemsの直下の階層にある specの下のClusterIPを取得し、出力します。
あと、”-”(ハイフン)の使い方が謎だったので調べてみると
スペースを消す指定であることがわかりました。
イメージしにくいので例を書いておきます。
"-"がない場合
________{{"hoge"}} ※ _は半角スペース
________hoge ※ _は半角スペース(半角スペースが残っている)
"-"がある場合
________{{- "hoge"}} ※ _は半角スペース
hoge ※ _は半角スペース(半角削除されている)
go-templateについては、下記を見るとい詳細を調べることができます。
kubectl get
コマンドを実行します
2. kubectl get all --all-namespaces -o go-template-file=getK8sIP.tpl
-----
kind: Pod
name: kube-dns-54cccfbdf8-9k4g8
hostIP: 192.168.99.100
podIP: 172.17.0.2
-----
kind: Service
name: kubernetes
clusterIP: 10.96.0.1
-----
kind: Service
name: kube-dns
clusterIP: 10.96.0.10
-----
kind: Service
name: kubernetes-dashboard
clusterIP: 10.102.51.44
-----
kind: Service
name: tiller-deploy
clusterIP: 10.98.85.220
理解力を深めるためには手を動かすことが一番ですので、とりあえっずテンプレートファイルを作りましょう!!
まとめ
go-tamplateは最初とっつきにくいと思いましたが、調べていくと仕組みが単純なので1回覚えてしまえば簡単に使えそうです。
他にもjqコマンドやjsonpathでkubectl get
コマンド結果を抽出することができると思いますが、複雑な抽出条件の場合はgo-templateがオススメ(だと思っている)。