障害が発生した etcd レプリカを置き換える

このドキュメントでは、GKE on VMware の高可用性(HA)ユーザー クラスタで、失敗した etcd レプリカを置き換える方法について説明します。

ここで説明する手順は、kubeception を使用する HA ユーザー クラスタに適用されます。つまり、Controlplane V2 が有効になっていないユーザー クラスタです。Controlplane V2 が有効になっているユーザー クラスタで etcd レプリカを置き換える必要がある場合は、Cloud カスタマーケアにお問い合わせください

準備

  • 管理クラスタが正常に機能していることを確認します。

  • ユーザー クラスタ内の他の 2 つの etcd メンバーが正しく動作していることを確認します。複数の etcd メンバーが失敗した場合は、etcd データ破損または損失からの復元をご覧ください。

障害が発生した etcd レプリカを置き換える

  1. 後で復元できるように、etcd PodDisruptionBudget(PDB)のコピーをバックアップします。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE

    ここで

    • ADMIN_CLUSTER_KUBECONFIG は、管理クラスタの kubeconfig ファイルのパスです。

    • USER_CLUSTER_NAME は、失敗した etcd レプリカを含むユーザー クラスタの名前です。

    • PATH_TO_PDB_FILE は、etcd PDB ファイルを保存するパスです(例: /tmp/etcpdb.yaml)。

  2. etcd PodDisruptionBudget(PDB)を削除します。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. 次のコマンドを実行して、テキスト エディタで kube-etcd StatefulSet を開きます。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    --initial-cluster-state フラグの値を existing に変更します。

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. 失敗した etcd レプリカのノードをドレインします。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data

    ここで、NODE_NAME は失敗した etcd レプリカ ノードの名前です。

  5. 動作している kube-etcd Pod のいずれかのコンテナ内に新しいシェルを作成します。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
       KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \
       -- bin/sh

    ここで、KUBE_ETCD_POD は動作中の kube-etcd Pod の名前です。例: kube-etcd-0

    この新しいシェルから、次のコマンドを実行します。

    1. 失敗した etcd レプリカ ノードを etcd クラスタから削除します。

      まず、etcd クラスタのすべてのメンバーを一覧表示します。

      etcdctl member list -w table

      出力には、すべてのメンバー ID が表示されます。失敗したレプリカのメンバー ID を特定します。

      次に、失敗したレプリカを削除します。

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      ここで、MEMBER_ID は障害が発生した etcd レプリカ Pod の 16 進数のメンバー ID です。

    2. 失敗したレプリカノードと同じ名前とピア URL で、新しいメンバーを追加します。

      etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      ここで、MEMBER_NAME は失敗した kube-etcd レプリカ ノードの ID です。たとえば、kube-etcd-1kube-etcd2 です。

  6. ユーティリティ Pod のデプロイの手順 1~3 に沿って、管理クラスタにユーティリティ Pod を作成します。この Pod は、ユーザー クラスタで失敗した etcd メンバーの PersistentVolume(PV)にアクセスするために使用されます。

  7. ユーティリティ Pod 内の etcd データ ディレクトリをクリーンアップします。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  8. ユーティリティ Pod を削除します。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. 失敗したノードの閉鎖を解除します。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. テキスト エディタで kube-etcd StatefulSet を開きます。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    --initial-cluster-state フラグの値を existing に変更します。

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  11. 手順 1 で削除された etcd PDB を復元します。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml