概要

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.confsuper-admin.conf をそのままAPIクライアントとして使用していたため、接続先が controlPlaneEndpoint(ロードバランサー)になっていました。

問題のあるシナリオ:

  1. kubeadm init 開始
  2. kube-apiserverが起動するが、ロードバランサーはまだ存在しない
  3. kubeadm が controlPlaneEndpoint のロードバランサーへ接続しようとする
  4. ロードバランサーが存在しないため接続失敗

修正後:

  • .conf ファイルを読み込むが、メモリ上で localAPIEndpoint を指すよう書き換えてから使用する
  • これにより init 中はロードバランサーを経由せず直接ローカルのAPIサーバーに接続する
  • ロードバランサーは init 完了後にプロビジョニングしても問題ない

変更量: 追加83行、削除56行(サイズL)

使用例

クラウドプロバイダーが提供するロードバランサー(AWS ALB、GCP LBなど)をKubernetesクラスターのコントロールプレーン前段に置く構成で、kubeadm init を使ってクラスターを初期化する場合に恩恵を受けます。

参考リンク