ノードが破損して、修復または交換のためにクラスタから削除する必要がある場合、クラスタから強制的に削除できます。
ベアメタル版 Anthos クラスタ 1.6.0 のノードを強制削除する
ベアメタル版 Anthos 1.6.0 リリースでは、親ノードプールからノードを削除すると、次のアクションが発生します。
- ノードのドレイン
- Kubernetes クラスタからのノードの削除
- ベアメタル版 Anthos をインストールする前の状態にマシンをリセット
ただし、ノードにアクセスできない場合、ノードのドレインは完了しません。コントローラは繰り返しノードのドレインを試みますが、ドレインが進行することはありません。
一時的な回避策として、次の変更を適用するとドレインとリセットのステップをバイパスできます。
注意: この操作では、Kubernetes カスタム リソースの特定の実装フィールドを慎重に更新する必要があります。ノードの復元が不可能な場合以外は実施しないでください。
ノードプールから破損しているノードを物理的に削除し、管理クラスタにその変更を適用してから、次の手順を行います。
管理クラスタでクラスタ API マシンのカスタム リソースを検索します。ここで、ADMIN_KUBECONFIG は
kubeconfig
ファイルのパス、CLUSTER_NAMESPACE は影響を受けるクラスタ名前空間です。kubectl --kubeconfig ADMIN_KUBECONFIG \ -n CLUSTER_NAMESPACE get ma 10.200.0.8
このコマンドは次のような結果を返します。
NAME PROVIDERID PHASE 10.200.0.8 baremetal://10.200.0.8 Deleting
この例で、10.200.0.8 は削除の段階で停止しているノードの IP アドレスです。
マシン カスタム リソースを編集し、
machine.cluster.x-k8s.io/exclude-node-draining
アノテーションを追加します。アノテーションの値自体は重要ではありません。キーが存在する限り、ドレインはスキップされます。kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ annotate ma 10.200.0.8 machine.cluster.x-k8s.io/exclude-node-draining=true
管理クラスタ内でベアメタル マシンのカスタム リソースを検索します。
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ get baremetalmachine 10.200.0.8
このコマンドは次のような結果を返します。
NAME CLUSTER READY INSTANCEID MACHINE 10.200.0.8 cluster1 true baremetal://10.200.0.8 10.200.0.8
ファイナライザを削除してリセット手順をスキップし、ノード削除のブロックを解除します。
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ patch baremetalmachine 10.200.0.8 --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
数秒後、ノードはクラスタから削除されます。
ベアメタル版 Anthos クラスタ 1.6.1 のノードの強制削除
ベアメタル版 Anthos クラスタ 1.6.1では、ノードを強制削除するためのアノテーションを追加できます。
親ノードプールからノードを削除した後、次のコマンドを実行して、対応する障害が発生したマシンに baremetal.cluster.gke.io/force-remove
アノテーションを付けます。アノテーション自体の値は重要ではありません。
kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \ annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true
ベアメタル版 Anthos クラスタはノードを正常に削除します。
コントロール プレーン ノードの強制削除
コントロール プレーン ノードの強制削除は、コントロール プレーン ノードで kubeadm reset
を実行する場合と同様ですが、手順を追加する必要があります。
コントロール プレーン ノードをノードプールから強制削除するには、障害が発生したコントロール プレーン ノードが属するクラスタに対して、次の操作を行う必要があります。
- 障害が発生したノードで実行されている障害のある
etcd
メンバーをetcd
クラスタから削除する - kube の
ClusterStatus
を更新して、対応するapiEndpoint
を削除する
障害のある etcd
メンバーを削除する
障害のあるコントロール プラン ノードを削除するには、まず残りの正常な etcd
Pod で etcdctl
を実行します。この操作の概要については、この Kubernetes ドキュメントをご覧ください。
以下の手順では、CLUSTER_KUBECONFIG はクラスタの kubeconfig
ファイルのパスです。
次のコマンドで
etcd
Pod を検索します。kubectl --kubeconfig CLUSTER_KUBECONFIG get \ pod -n kube-system -l component=etcd -o wide
このコマンドは、次のノードのリストを返します。この例では、ノード 10.200.0.8 にアクセスできないことと、復元不能なことを前提としています。
NAME READY STATUS RESTARTS AGE IP NODE etcd-357b68f4ecf0 1/1 Running 0 9m2s 10.200.0.6 357b68f4ecf0 etcd-7d7c21db88b3 1/1 Running 0 33m 10.200.0.7 7d7c21db88b3 etcd-b049141e0802 1/1 Running 0 8m22s 10.200.0.8 b049141e0802
残りの正常な
etcd
Pod のいずれかに対してコマンドを実行します。kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \ kube-system etcd-357b68f4ecf0 -- /bin/sh
現在のメンバーを検索して、障害のあるメンバーの ID を探します。コマンドはリストを返します。
etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt member list
このコマンドが返すリストの例を以下に示します。
23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false 772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
障害のあるメンバーを削除します。
etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \ member remove f64f66ad8d3e7960
ClusterStatus
の更新と障害のある apiEndpoint
の削除
以下の手順では、CLUSTER_KUBECONFIG はクラスタの kubeconfig
ファイルのパスです。
kubeadm-config
構成マップ内のClusterStatus
セクションを検索します。kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \ kube-system kubeadm-config
このコマンドは次のような結果を返します。
... ClusterStatus: ---- apiEndpoints: 7d7c21db88b3: advertiseAddress: 10.200.0.6 bindPort: 6444 357b68f4ecf0: advertiseAddress: 10.200.0.7 bindPort: 6444 b049141e0802: advertiseAddress: 10.200.0.8 bindPort: 6444 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus ...
構成マップを編集して、障害が発生した IP が含まれるセクションを削除します(この例では、
kubectl edit
コマンドを使用して10.200.0.8
を削除した結果を示します)。kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \ -n kube-system kubeadm-config
編集後の構成マップは次のようになります。
... ClusterStatus: | apiEndpoints: 7d7c21db88b3: advertiseAddress: 10.200.0.6 bindPort: 6444 357b68f4ecf0: advertiseAddress: 10.200.0.7 bindPort: 6444 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterStatus ...
編集した構成マップを保存すると、障害が発生したノードがクラスタから削除されます。