Memento memo.

Today I Learned.

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 で動かしたくなった。

ローカルでの開発を避けたい理由は以下の通り。

  • 外部リソース・他CRDへの依存があり、ローカルでの環境再現が面倒。
  • GCP の Workload Identity 機能を利用しており、ローカルで構築したクラスタでは正常に動作しない。

課題

以下のようなエラーが出た。

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 実装には以下の書籍を参考にさせて頂いている。

参考