本页面介绍如何为 GKE on VMware 替换高可用性 (HA) 用户集群中失败的 etcd 副本。
准备工作
确保管理员集群正常运行。
确保用户集群中的其他两个 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
标志的值更改为new
。containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...
恢复第 1 步中删除的 etcd PDB。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml