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

10

このページでは、Anthos clusters on VMware(GKE On-Prem)の高可用性(HA)ユーザー クラスタで、失敗した etcd レプリカを置き換える方法について説明します。

始める前に

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

  • ユーザー クラスタ内の他の 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/etcdpdb.yaml

    ここで

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

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

  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 クラスタから削除します。

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID

      ここで、MEMBER_ID は失敗した etcd レプリカ ノードの ID です。ID を取得するには、次のコマンドを実行します。

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member list -w fields

      上に示したコマンドによって、etcd クラスタのすべてのメンバーが表示されます。出力は次のようになります。

      sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields
      
      "ClusterID" : 6963206042588294154
      "MemberID" : 4645269864592341793
      "Revision" : 0
      "RaftTerm" : 15
      "ID" : 2279696924967222455
      "Name" : "kube-etcd-2"
      "PeerURL" : "https://kube-etcd-2.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-2.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 3728561467092418843
      "Name" : "kube-etcd-1"
      "PeerURL" : "https://kube-etcd-1.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-1.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 4645269864592341793
      "Name" : "kube-etcd-0"
      "PeerURL" : "https://kube-etcd-0.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-0.kube-etcd:2379"
      "IsLearner" : false
      
      sh-5.0#
      

      上述の出力の MemberID は、稼働中の kube-etcd Pod のメンバー ID です。次に、失敗した etcd レプリカノードの ID を取得します。上述の例では、kube-etcd-04645269864592341793ID を持ち、kube-etcd-13728561467092418843ID を持ち、kube-etcd-22279696924967222455ID を持っています。

      メンバー ID を受け取った後、10 進数から 16 進数に変換します。これは、member remove コマンドは 16 進数のメンバー ID を受け入れ、member list は 10 進数を返すためです。printf を使用して変換を実施できます。この例の kube-etcd-2 の場合、次のようになります。

      printf '%x\n' 2279696924967222455
      

      上に示したコマンドの出力は、member remove コマンドに使用するために必要な MEMBER_ID です。

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

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key 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 -- 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 フラグの値を new に変更します。

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

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