ベアメタル版 Anthos クラスタで破損したノードを強制削除する

ノードが破損して、修復または交換のためにクラスタから削除する必要がある場合、クラスタから強制的に削除できます。

ベアメタル版 Anthos クラスタ 1.6.0 のノードを強制削除する

ベアメタル版 Anthos 1.6.0 リリースでは、親ノードプールからノードを削除すると、次のアクションが発生します。

  • ノードのドレイン
  • Kubernetes クラスタからのノードの削除
  • ベアメタル版 Anthos をインストールする前の状態にマシンをリセット

ただし、ノードにアクセスできない場合、ノードのドレインは完了しません。コントローラは繰り返しノードのドレインを試みますが、ドレインが進行することはありません。

一時的な回避策として、次の変更を適用するとドレインとリセットのステップをバイパスできます。

注意: この操作では、Kubernetes カスタム リソースの特定の実装フィールドを慎重に更新する必要があります。ノードの復元が不可能な場合以外は実施しないでください。

ノードプールから破損しているノードを物理的に削除し、管理クラスタにその変更を適用してから、次の手順を行います。

  1. 管理クラスタでクラスタ API マシンのカスタム リソースを検索します。ここで、ADMIN_KUBECONFIGkubeconfig ファイルのパス、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 アドレスです。

  2. マシン カスタム リソースを編集し、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
    
  3. 管理クラスタ内でベアメタル マシンのカスタム リソースを検索します。

    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
  4. ファイナライザを削除してリセット手順をスキップし、ノード削除のブロックを解除します。

    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 ファイルのパスです。

  1. 次のコマンドで 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

  2. 残りの正常な etcd Pod のいずれかに対してコマンドを実行します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. 現在のメンバーを検索して、障害のあるメンバーの 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
  4. 障害のあるメンバーを削除します。

    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 ファイルのパスです。

  1. 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
    ...
  2. 構成マップを編集して、障害が発生した 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
    ...
  3. 編集した構成マップを保存すると、障害が発生したノードがクラスタから削除されます。