Cover Image for 【kubernetes】-go-templateファイルで欲しい情報を得る方法
【kubernetes】-go-templateファイルで欲しい情報を得る方法

image.png

ども、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(任意)

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については、下記を見るとい詳細を調べることができます。

http://golang-jp.org/pkg/text/template/

2. kubectl getコマンドを実行します

コマンド
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がオススメ(だと思っている)。

参考URL

http://golang-jp.org/pkg/text/template/
https://kubernetes.io/docs/reference/kubectl/overview/

© 2022 k69

本サイトを通じて、たくさんの人がプログラミングに興味を持ち、 これがキッカケでモノづくりの楽しさに触れることができれば幸せです!