このドキュメントでは、Google Distributed Cloud の高可用性(HA)ユーザー クラスタで、失敗した etcd レプリカを置き換える方法について説明します。
ここで説明する手順は、kubeception を使用する HA ユーザー クラスタに適用されます。つまり、Controlplane V2 が有効になっていないユーザー クラスタです。Controlplane V2 が有効になっているユーザー クラスタで etcd レプリカを置き換える必要がある場合は、Cloud カスタマーケアにお問い合わせください。
始める前に
管理クラスタが正常に機能していることを確認します。
ユーザー クラスタ内の他の 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_PDB_FILE
ここで
ADMIN_CLUSTER_KUBECONFIG
は、管理クラスタの kubeconfig ファイルのパスです。USER_CLUSTER_NAME
は、失敗した etcd レプリカを含むユーザー クラスタの名前です。PATH_TO_PDB_FILE
は、etcd PDB ファイルを保存するパスです(例:/tmp/etcpdb.yaml
)。
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 クラスタから削除します。
まず、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 です。失敗したレプリカノードと同じ名前とピア URL で、新しいメンバーを追加します。
etcdctl 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 -- /bin/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
フラグの値をexisting
に変更します。containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...
手順 1 で削除された etcd PDB を復元します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml