LoginSignup
6
2

More than 5 years have passed since last update.

client-goを使ってkuberntesで使用しているNodePortの一覧を取得するプログラムを作ってみた

Posted at

Overview

kubernetesをローカルで立ててるとちょっとしたServiceを公開する場合、NodePortって便利ですよね。
ただnamespaceを切って運用しているとどのport番号が今使用されているかわからなくなりませんか?
そこで今回、使用しているNodePortの一覧を取得するプログラムを作成してみました。
この記事では、プログラムの作成を通して、kubernetesのクライアントツールであるclient-goの使い方をお伝えできればと思います。

成果物

  • サンプルの見た目
[root@server ~]# kube-nodeport-checker
30000: http (in nginx)
30010: no name (in wekan)

client-goの使い方

基本的にサンプルが充実しているのでそれにそってやれば動かせます。

  • インストール
    まずは必要なパッケージをダウンロードします
    ※今回使用したのは以下のパッケージです(※自分のプログラムに合わせてgo getしてください)
go get k8s.io/apimachinery/pkg/apis/meta/v1
go get k8s.io/client-go/kubernetes
go get k8s.io/client-go/tools/clientcmd
  • 自作goプログラムに使用
    プログラム全体の流れとしては、自身のkubeconfigファイルでインスタンスを初期化、それを使ってKubernetes Clusterから情報を取得するといった感じになります。
    ※以下該当部分の抜粋(詳細はぜひGitHubを参照してください。そしてStarをください(笑))
    • インスタンスの初期化
func main(){
    // create kubernetes client
    // *KubeConfig: 引数で取得したkubeconfigのパス
    client, err := newClient(*KubeConfig)
    if err != nil {
        log.Fatal(err)
    }

    // 略
}

func newClient(kubeConfigPath string) (kubernetes.Interface, error) {
    if kubeConfigPath == "" {
        // use default path(.kube/config) when kubeconfig path is not set
        kubeConfigPath = clientcmd.RecommendedHomeFile
    }

    kubeConfig, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
    if err != nil {
        return nil, err
    }

    // クライアントのインスタンスを作成
    return kubernetes.NewForConfig(kubeConfig)
}
  • 情報の取得
    // 略

    // get all service in all namespace
    // 先ほどのclientを使ってServiceの一覧を取得
    // ※Services("")とやると全namespaceのdataを取得できる Services("default")みたいに指定可能
    services, err := client.CoreV1().Services("").List(meta_v1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }

    for _, service := range services.Items {
        if service.Spec.Type == "NodePort" {
            // a service may have multiple ports
            for _, port := range service.Spec.Ports {
                portName := "no name"
                if port.Name != "" {
                    portName = port.Name
                }
                fmt.Printf("%d: %s (in %s)\n", port.NodePort, portName, service.Name)
            }
        }
    }

    // 略

おわりに

client-go自体はかなり使いやすいです
初心者の私でもサンプル(こちら)を見ながらやればなんとなーくできました
ただkubernetesのAPIを調べるのがちょっと大変でした
このあたりはIDEとか使ってかっこよくプログラミングしたい・・・(ソースを追っかけて関数とか調べてた人←)

全体としては、Go言語を触ったことのあるプログラマーの方なら特に問題なく使えるかなっていうのが私の感想です。
ただGo言語は環境がややこしいので(※個人的な感想)、GitHub上にDockerfileも置いてます。
参考になれば幸いです!

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2