このページでは、Anthos clusters on VMware(GKE On-Prem)の高可用性(HA)ユーザー クラスタで、失敗した etcd レプリカを置き換える方法について説明します。
始める前に
管理クラスタが正常に機能していることを確認します。
ユーザー クラスタ内の他の 2 つの etcd メンバーが正しく動作していることを確認します。複数の etcd メンバーが失敗した場合は、etcd データ破損または損失からの復元をご覧ください。
障害が発生した etcd レプリカを置き換える
後で復元できるように、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 レプリカを含むユーザー クラスタの名前です。
etcd PodDisruptionBudget(PDB)を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
次のコマンドを実行して、テキスト エディタで 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 ...
失敗した etcd レプリカのノードをドレインします。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
ここで、
NODE_NAME
は失敗した etcd レプリカ ノードの名前です。動作している 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
この新しいシェルから、次のコマンドを実行します。
失敗した 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-0
は4645269864592341793
のID
を持ち、kube-etcd-1
は3728561467092418843
のID
を持ち、kube-etcd-2
は2279696924967222455
のID
を持っています。メンバー
ID
を受け取った後、10 進数から 16 進数に変換します。これは、member remove
コマンドは 16 進数のメンバーID
を受け入れ、member list
は 10 進数を返すためです。printf
を使用して変換を実施できます。この例のkube-etcd-2
の場合、次のようになります。printf '%x\n' 2279696924967222455
上に示したコマンドの出力は、
member remove
コマンドに使用するために必要なMEMBER_ID
です。失敗したレプリカノードと同じ名前とピア 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-1
やkube-etcd2
です。
ユーティリティ Pod のデプロイの手順 1~3 に沿って、管理クラスタにユーティリティ Pod を作成します。この Pod は、ユーザー クラスタで失敗した etcd メンバーの PersistentVolume(PV)にアクセスするために使用されます。
ユーティリティ Pod 内の etcd データ ディレクトリをクリーンアップします。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- bash -c 'rm -rf /var/lib/etcd/*'
ユーティリティ Pod を削除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
失敗したノードの閉鎖を解除します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
テキスト エディタで 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 ...
手順 1 で削除された etcd PDB を復元します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml