この投稿では、Kubebuilderで生成したコントローラーに対して、実行時にkubecontextを指定できるようにする実装方法を解説します。
本稿で紹介する方法を使うと、複数クラスター環境でkubectl config use-contextを毎回実行する手間を省けるようになります!
この投稿で学べること
- Kubebuilderコントローラーでkubecontextフラグを実装する方法
- controller-runtimeのconfigパッケージの使い方
- マルチクラスター開発における課題と解決策
- 数行のコード追加で実現できる簡単な実装手順
マルチクラスター開発でのストレス
マルチクラスター対応のコントローラーを開発していると、複数のkindクラスターを起動して動作確認することがよくあります。しかし、従来の方法では毎回kubectl config use-context
を実行してコンテキストを切り替える必要があり、これが意外とストレスになります。
特に、切り替え忘れで意図しないクラスターに接続してしまい、「あれ?なんで動かないんだ?」となる経験は、多くの開発者が感じたことがあるのではないでしょうか。
従来の実装方法の課題
Kubebuilderで生成される標準的なmain.goファイルでは、以下のようにKubernetesクラスターへの接続設定を取得します。
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
// ...
})
このctrl.GetConfigOrDie()
は、現在のkubeconfigで設定されているデフォルトコンテキストを使用します。つまり、コントローラーを起動する前に、必ずkubectl config use-context
でコンテキストを切り替えておく必要があるというわけです。
解決方法: kubecontextフラグの実装
この課題を解決するため、コントローラーの起動時にkubecontextを指定できるフラグを追加してみましょう。実装は非常にシンプルで、数行のコード追加だけで実現できます。
実装手順
まず、必要なパッケージをインポートします。
import (
ctrlconfig "sigs.k8s.io/controller-runtime/pkg/client/config"
)
次に、フラグの定義とKubernetes設定の取得部分を変更します。
var kubeContext string
flag.StringVar(&kubeContext, "kubecontext", "", "The name of the kubeconfig context to use.")
// ...既存のコード...
// Get Kubernetes configuration with context support
restConfig, err := ctrlconfig.GetConfigWithContext(kubeContext)
if err != nil {
setupLog.Error(err, "unable to get kubeconfig")
os.Exit(1)
}
mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
// 既存の設定はそのまま
})
コードの詳細解説
重要なポイントは、ctrlconfig.GetConfigWithContext(kubeContext)
の使用です。この関数は、指定されたコンテキスト名を使用してKubernetes設定を取得します。
kubeContext
が空文字列の場合は、従来通りデフォルトコンテキストが使用されるため、既存の動作との互換性も保たれます。便利!
使用方法
実装が完了すると、以下のようにkubecontextを指定してコントローラーを起動できるようになります。
# kind-cluster1コンテキストを使用してコントローラーを起動
go run cmd/main.go --kubecontext=kind-cluster1
# kind-cluster2コンテキストに切り替えて起動
go run cmd/main.go --kubecontext=kind-cluster2
# フラグを指定しない場合は従来通りデフォルトコンテキストを使用
go run cmd/main.go
このように、毎回kubectl config use-context
を実行する必要がなくなるので楽ですし、なにより確実に繋ぎたいクラスターに繋げられるようになるので、開発中のストレスが激減します。
まとめ
この投稿では、Kubebuilderで生成したコントローラーにkubecontextフラグを追加する方法を解説しました。
マルチクラスター環境でKubernetesコントローラーを開発している方は、ぜひ試してみてください。コンテキストの切り替え忘れによるストレスから解放され、より快適な開発体験を得られることと思います。
最後までお読みくださりありがとうございました!