本文档介绍如何替换 GKE on VMware 的高可用性 (HA) 用户集群中失败的 etcd 副本。
此处给出的说明适用于使用 kubeception 的高可用性用户集群;即未启用 Controlplane V2 的用户集群。如果您需要替换已启用 Controlplane V2 的用户集群中的 etcd 副本,请与 Cloud Customer Care 联系。
准备工作
确保管理员集群正常运行。
确保用户集群中的其他两个 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 的容器中创建新 shell。
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
。在此新 shell 中,运行以下命令:
从 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 的十六进制成员 ID。添加名称和对等节点网址与失败副本节点相同的新成员。
etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
其中
MEMBER_NAME
是故障 kube-etcd 副本节点的标识符。 例如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