免責事項:これは英文の記事「Workload Cluster Upgrade Stuck or Change Stuck at New Control Plane VM due to ESXi Join Time-outs」の日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新情報は英語版の記事で参照してください。
ワークロードクラスタのアップグレード、またはコントロールプレーンノードに対するワークロードクラスタ変更を開始した後、最新のコントロールプレーン VM は Running 状態になりますが、その後処理が進行しません。
Supervisor クラスタのコンテキストに接続した状態で、以下の事象が確認されます:
kubectl get machine -n <workload cluster namespace>
kubectl get kcp -n <workload cluster namespace>
kubectl describe cluster <workload cluster name> -n <workload cluster namespace>
Remediation Failed @ <new control plane VM>
ワークロードクラスタのコンテキストに接続した状態で、以下の事象が確認されます:
kubectl get nodes
NAME STATUS ROLES
<new control plane node> Ready <none>
kubectl get pods -A -o wide | grep <new control plane node>
新しいコントロールプレーンノードに SSH 接続した状態で、以下の事象が確認されます:
crictl ps -a
cat /var/log/cloud-init-output
adding etcd member as learner
retrying of unary invoker failed
error execution phase control-plane-join-etcd: error creating local static pod manifest file: etcdserver: Peer URLs already exists
kubeadm join phase control-plane-join etcd failed
fatal error, exiting
removing member from cluster status
promoting a learner as a voting member
retrying of unary invoker failed
etcdserver: can only promote a learner member which is in sync with leader
etcdserver: request timed out, waiting for the applied index took too long
etcdserver: can only promote a learner member
error execution phase control-plane-join-etcd: error creating local static pod manifest file: etcdserver: can only promote a learner member
kubeadm join phase control-plane-join etcd failed
fatal error, exiting
removing member from cluster status
vSphere Supervisor
本問題は、ワークロードクラスタが Tanzu Mission Control(TMC)によって管理されているかどうかに関わらず発生する可能性があります。
新しいコントロールプレーンノードが作成されると、既存の正常なコントロールプレーンノードが構成する ETCD クォーラムに参加することで、ETCD データベース情報を取得します。
しかし、ETCD にはデフォルトで 2 分のタイムアウトが設定されており、新しいコントロールプレーンノードが 2 分以内に参加できない場合、システムはそのノードを失敗と判断します。
cloud-init-output ログのとおり、kubeadm join フェーズの etcd ステップが失敗した場合、クリーンアップ処理が開始され、新しいコントロールプレーンノード上のすべてのコンテナが削除されます。
再作成に備えて、失敗と判定された新しいコントロールプレーンノードからは、Kubernetes マニフェストおよび ETCD データが削除されます。
シングルコントロールプレーンノード構成のクラスタでは、失敗した新しいコントロールプレーンノードをシステムが正常に再作成できず、Remediation Failed の状態のまま Running 状態で残る場合があることが確認されています。
高いリソース使用率やネットワークの遅延により、ETCD の新メンバー参加プロセスでタイムアウトが発生する可能性があります。
重要: アップグレードやローリング再デプロイを進める目的で、既存のコントロールプレーン VM を削除することは適切ではありません。これにより、データ損失やクラスタ全体のデータベースが破壊される可能性があります。
ETCD 参加時のタイムアウトの原因を特定し、解消する必要があります。
これは、ワークロードクラスタ内の他のコントロールプレーンノードにおける高いリソース使用率、または既存のコントロールプレーンノードと新しいコントロールプレーンノード間のネットワーク問題が原因である可能性があります。
ワークロードクラスタのコンテキストに接続した状態で、kubectl top を使用して高いリソース使用率を特定できます:
kubectl top pods -A --sort-by=memory
-o wide フラグを使用することで、Pod がどのノード上で実行されているかを確認することも可能です:
kubectl get pod <pod name> -n <pod namespace> -o wide
コントロールプレーンノード上で過剰なリソースを使用しているカスタマーアプリケーションの Pod がある場合、それらを一時的にスケールダウンすることで、次回のコントロールプレーンノード再作成時に ETCD へ正常に参加できるようになります。
ワークロードクラスタ内のコントロールプレーンノード間でネットワークテストを実施し、ETCD の参加プロセスが 2 分以上かかる原因となる遅延が存在しないかを確認してください。
etcdctl による確認では、新しいコントロールプレーンノードが ETCD クォーラムへ正常に参加したように見える場合がありますが、前述のタイムアウト問題により、cloud-init-output では失敗として検知され、新しいノードが破棄されます。