client-goで、Kubernetes API serverとやりとりしてみる

Kubernetes
Nishipy
VS Codeの拡張機能「Remote – Containers」ですぐにGolang環境が構築できたので、client-goというやつを使ってみます。

はじめに

最近のんびり「Programming Kubernetes」という本を読んでいます。

日本語で出版されている他のKubernetes本と異なり、かなりDeep Dive的な情報が目白押しで、楽しく読めます。この本の序盤にも載っていたclient-goを使ってみたのでメモしておきます。

client-goとは?

client-goは、KubernetesクラスタとやりとりするためのGolangのパッケージです。普段はkubectlを使うことがほとんどですが、今回はこのclient-goを使ってみます。

client-goは、こちらのGitHubリポジトリで開発されています。Kubernetesバージョンとの対応や基本的な使い方はREADMEに書いてあります。

GitHub - kubernetes/client-go: Go client for Kubernetes.
Go client for Kubernetes. Contribute to kubernetes/client-go development by creating an account on GitHub.

やっていく

client-goリポジトリのクローン

上記のGitHubリポジトリをローカルにcloneしておきます。

Kubernetesクラスタの用意

今回は、Docker Desktop for Macで構築できるお手軽ローカルクラスタを使います。設定方法はググれば出てきますし、以下の記事でも触れているので省略。

まだTillerで消耗してるの? Docker Desktop for Macで新しいHelmを使った
Nishipy新しくなったらしいHelmを、Macでさくっと触ってみたのでメモ。はじめに「Helmのバージョン3.0が出たらしい。」Helmと言えば、前もってRBACの設定をしておいて、その後helm initをやっ...(続く)

Kubernetesバージョンは以下の通り。v1.15.5ですね。

クラスタ情報も一応みておきます。Metrics-serverは自分で入れましたが、その他はDocker for Macで作るとこのような設定になるっぽい。

kubernetes.docker.internalに身に覚えがありませんでしたが、/etc/hostsを覗いてみると、localhostのことでした。



Golangコンテナの用意

以下の記事で紹介したように、VS Codeの拡張機能「Remote – Containers」を使って、Golangコンテナを構築し、ここで開発していきます。

VS Codeの拡張機能 "Remote - Containers" で、 ”A Tour of Go" をやったら便利だった
NishipyGolangの勉強がしたかったので、VS Codeの拡張機能「Remote - Containers」を使って環境構築してみたときのメモですはじめに「Programming Kubernetes」という本を読む...(続く)

ただし、Kubernetes API Serverの認証に必要なkubeconfigファイルをコンテナにマウントする必要があります。Macだと/User/<ユーザ名>/.kube/configあたりにあると思います。マウントの設定は、こちらのリファレンスにあるようにmountsで設定できそう。なお、Docker Desktop側の設定で、Dockerコンテナにマウントを許可するDockerホスト上のファイルやディレクトリを指定する必要があります。正しく設定できていないと、bind source path does not exist と怒られちゃうかも。

client-goを試す

できたコンテナから、用意しておいたローカルのKubernetesクラスタへリクエストを送ってみます。このコンテナは、Kubernetesクラスタの管理下になく、今回はクラスタ外からアクセスするという形になります。したがって、client-goリポジトリにある以下のサンプルコードが使えそうです。

client-go/examples/out-of-cluster-client-configuration at master · kubernetes/client-go
Go client for Kubernetes. Contribute to kubernetes/client-go development by creating an account on GitHub.

main.goはこんな感じ。

マウントしたkubeconfig読み込み、KubernetesのAPIを叩いて取得した情報を用いて、以下の項目をプロンプト上に表示するようですね。

  • クラスタ内に存在するPodの数
  • 指定したNamespaceに、指定した名前のPodが存在するか。今回は以下のように設定する
    • 名前空間: kube-system
    • Pod名: etcd-docker-desktop

あらかじめ使い慣れたkubectlで、これらの項目を確認しておきます。いろいろ遊んでいた結果、現在Podは12個あるようです。また、kube-systemという名前空間に、etcd-docker-desktopというPodが存在します。

ではclient-goを動かしてみましょう。READMEの通りにやっていくだけです。最後の./appを実行すると、ビルドしたプログラムが動いて、10秒ごとに以下のように表示されました。先ほどkubectlで確認した通り、「12 Pods」と表示されています。無事Kubernetes API serverとやりとりできているようです。

さいごに

生まれてこの方、kubectlを使ってKubernetes API Serverとお話してきた私ですが、client-goでもお話することができました。Golangも少しは読めるようになってきた気がしなくもない。。。今後も時間を見つけて「Programming Kubernetes」を読み進めていき、カスタムコントローラーを実装できるように頑張ります。

以上.

コメント