概要
kubeadm init の実行中にAPIサーバーへの接続が controlPlaneEndpoint(ロードバランサーのアドレス)ではなく localAPIEndpoint(ローカルのAPIサーバーアドレス)を使うよう修正されました。ロードバランサーがkubeadm initの完了後に初めてプロビジョニングされるような環境での初期化失敗を解決します。
背景・前提知識
kubeadm initとは: Kubernetesクラスターのコントロールプレーンを初期化するコマンドです。etcd、kube-apiserver、kube-controller-manager、kube-schedulerを起動し、クラスターが使えるようにします。
controlPlaneEndpoint vs localAPIEndpoint:
localAPIEndpoint(LAE): そのノードのAPIサーバーに直接接続するアドレス(例:192.168.1.10:6443)controlPlaneEndpoint(CPE): 通常はロードバランサーのVIPアドレス(例:my-cluster.example.com:6443)
高可用性(HA)クラスターでは複数のコントロールプレーンノードをロードバランサーの背後に置きますが、ロードバランサー自体が別途プロビジョニングが必要な場合があります。
詳細
従来のkubeadmは admin.conf と super-admin.conf をそのままAPIクライアントとして使用していたため、接続先が controlPlaneEndpoint(ロードバランサー)になっていました。
問題のあるシナリオ:
kubeadm init開始- kube-apiserverが起動するが、ロードバランサーはまだ存在しない
- kubeadm が
controlPlaneEndpointのロードバランサーへ接続しようとする - ロードバランサーが存在しないため接続失敗
修正後:
.confファイルを読み込むが、メモリ上でlocalAPIEndpointを指すよう書き換えてから使用する- これにより
init中はロードバランサーを経由せず直接ローカルのAPIサーバーに接続する - ロードバランサーは
init完了後にプロビジョニングしても問題ない
変更量: 追加83行、削除56行(サイズL)
使用例
クラウドプロバイダーが提供するロードバランサー(AWS ALB、GCP LBなど)をKubernetesクラスターのコントロールプレーン前段に置く構成で、kubeadm init を使ってクラスターを初期化する場合に恩恵を受けます。