はじめに
最近のんびり「Programming Kubernetes」という本を読んでいます。
意識高そうな本届いたわ。お正月読もう pic.twitter.com/6SK1kaeNBd
— nishipy (@iamnishipy) December 20, 2019
日本語で出版されている他のKubernetes本と異なり、かなりDeep Dive的な情報が目白押しで、楽しく読めます。この本の序盤にも載っていたclient-go
を使ってみたのでメモしておきます。
client-goとは?
client-go
は、KubernetesクラスタとやりとりするためのGolangのパッケージです。普段はkubectl
を使うことがほとんどですが、今回はこのclient-go
を使ってみます。
client-go
は、こちらのGitHubリポジトリで開発されています。Kubernetesバージョンとの対応や基本的な使い方はREADMEに書いてあります。
やっていく
client-goリポジトリのクローン
上記のGitHubリポジトリをローカルにcloneしておきます。
1 2 |
$ cd workdir $ git clone https://github.com/kubernetes/client-go.git |
Kubernetesクラスタの用意
今回は、Docker Desktop for Macで構築できるお手軽ローカルクラスタを使います。設定方法はググれば出てきますし、以下の記事でも触れているので省略。
Kubernetesバージョンは以下の通り。v1.15.5
ですね。
1 2 3 |
$ kubectl version Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T23:42:50Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:07:57Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"} |
クラスタ情報も一応みておきます。Metrics-serverは自分で入れましたが、その他はDocker for Macで作るとこのような設定になるっぽい。
1 2 3 4 5 6 |
$ kubectl cluster-info Kubernetes master is running at https://kubernetes.docker.internal:6443 KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy Metrics-server is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. |
kubernetes.docker.internal
に身に覚えがありませんでしたが、/etc/hosts
を覗いてみると、localhostのことでした。
Golangコンテナの用意
以下の記事で紹介したように、VS Codeの拡張機能「Remote – Containers」を使って、Golangコンテナを構築し、ここで開発していきます。
ただし、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
リポジトリにある以下のサンプルコードが使えそうです。
main.go
はこんな感じ。
マウントしたkubeconfig
読み込み、KubernetesのAPIを叩いて取得した情報を用いて、以下の項目をプロンプト上に表示するようですね。
- クラスタ内に存在するPodの数
- 指定したNamespaceに、指定した名前のPodが存在するか。今回は以下のように設定する
- 名前空間:
kube-system
- Pod名:
etcd-docker-desktop
- 名前空間:
あらかじめ使い慣れたkubectl
で、これらの項目を確認しておきます。いろいろ遊んでいた結果、現在Podは12個あるようです。また、kube-system
という名前空間に、etcd-docker-desktop
というPodが存在します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE default prometheus-operator-57f469c88d-zwjtf 1/1 Running 0 18d docker compose-7b7c5cbbcc-t4qdk 1/1 Running 0 23d docker compose-api-dbbf7c5db-p7q8d 1/1 Running 0 23d kube-system coredns-5c98db65d4-5xpfs 1/1 Running 1 23d kube-system coredns-5c98db65d4-k8tcc 1/1 Running 1 23d kube-system etcd-docker-desktop 1/1 Running 0 23d kube-system kube-apiserver-docker-desktop 1/1 Running 0 23d kube-system kube-controller-manager-docker-desktop 1/1 Running 0 23d kube-system kube-proxy-knp7v 1/1 Running 0 23d kube-system kube-scheduler-docker-desktop 1/1 Running 0 23d kube-system metrics-server-5bfc664bcb-g9btb 1/1 Running 0 23d spinnaker minio-779c5957-267mm 1/1 Running 0 17d |
ではclient-go
を動かしてみましょう。READMEの通りにやっていくだけです。最後の./app
を実行すると、ビルドしたプログラムが動いて、10秒ごとに以下のように表示されました。先ほどkubectl
で確認した通り、「12 Pods」と表示されています。無事Kubernetes API serverとやりとりできているようです。
1 2 3 4 5 6 7 8 |
$ cd out-of-cluster-client-configuration $ go build -o app . $ ./app There are 12 pods in the cluster Found pod etcd-docker-desktop in namespace kube-system There are 12 pods in the cluster Found pod etcd-docker-desktop in namespace kube-system ... |
さいごに
生まれてこの方、kubectl
を使ってKubernetes API Serverとお話してきた私ですが、client-go
でもお話することができました。Golangも少しは読めるようになってきた気がしなくもない。。。今後も時間を見つけて「Programming Kubernetes」を読み進めていき、カスタムコントローラーを実装できるように頑張ります。
以上.
コメント