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

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

ワーカーノードの強制削除

ベアメタル版 Anthos クラスタでは、ノードに強制削除対象のマークを付けるアノテーションを追加できます。

親ノードプールからノードを削除した後、次のコマンドを実行して、対応する障害が発生したマシンに 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. 編集した構成マップを保存すると、障害が発生したノードがクラスタから削除されます。