Telepresence で Kubernetes Client Library を使う
結論
Telepresenceの --mount
オプションと docker volume オプションを使う。
telepresence \ --swap-deployment <container name> \ --mount /tmp/known \ --docker-run --rm \ -v=/tmp/known/var/run/secrets:/var/run/secrets \ <local image>
背景
Kubebuilder (v2.3.1) で k8s の Operator を開発していたが、共用の GKE Cluster で動かしたくなった。
ローカルでの開発を避けたい理由は以下の通り。
課題
以下のようなエラーが出た。
ERROR controller-runtime.client.config unable to get kubeconfig {"error": "could not locate a kubeconfig"}
kubeconfigが読めないらしい。
解決策
https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client/config によると以下の順に評価して、configを取得しているらしい。
- --kubeconfig flag pointing at a file
- KUBECONFIG environment variable pointing at a file
- In-cluster config if running in cluster
- $HOME/.kube/config if exists
今回はCluster内で動かそうとしているので In-cluster config を見に行かせたい。
https://github.com/kubernetes/client-go/tree/master/examples/in-cluster-client-configuration によると/var/run/secrets/kubernetes.io/serviceaccount
を見に行っている。
これは実際に kubectl describe pod ...
等実行するとvolume mountされていることが確認できる。
Telepresenceを使う場合は root dir が $TELEPRESENCE_ROOT
以下に設定されるためおかしなことになる。
冒頭のコマンドで $TELEPRESENCE_ROOT/var/run/secrets:/var/run/secrets
を読みに行かせることで解決。
なお、kubebuilder で webhookを有効化した場合は以下のようなエラーが出る。
ERROR setup problem running manager {"error": "open /tmp/k8s-webhook-server/serving-certs/tls.crt: no such file or directory"}
これも同様に tls.crt
のディレクトリのvolume設定を変えてあげればok。以下のオプションを追加すれば良い。
-v=/tmp/known/tmp/k8s-webhook-server/serving-certs:/tmp/k8s-webhook-server/serving-certs \
終わりに
最近は専らKubebuilder職人になっている。 Kubebuilder を用いた Custom Controller 実装には以下の書籍を参考にさせて頂いている。
参考
- config - GoDoc
- client-go/examples/in-cluster-client-configuration at master · kubernetes/client-go · GitHub
- Using a Kubernetes Client Library · Telepresence: Fast, realistic local development for Kubernetes and OpenShift Origin microservices
- Volume access · Telepresence: Fast, realistic local development for Kubernetes and OpenShift Origin microservices