如果您使用 kubeadm 部署了 etcd,在 Kubernetes 集群中手动选择 etcd Leader 的步骤与先前描述的步骤略有不同。下面是手动选择 etcd Leader 的步骤:
- 确定当前的 etcd Leader:您可以使用 kubectl 命令和一个特殊的 Pod,称为
etcd-leader-0,来查看当前的 Leader 节点。首先,您需要获取 Pod 的名称:
kubectl get pods -n kube-system | grep etcd-leader
该命令将输出类似于以下内容的行:
etcd-leader-0 1/1 Running 0 6d
- 获取当前的 Leader IP 地址:通过运行以下命令,您可以获取当前 Leader 的 IP 地址:
kubectl exec -n kube-system etcd-leader-0 -- sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt endpoint status" | grep "is leader"
该命令将输出类似于以下内容的行:
fcf74043f88248a7 is leader
其中 fcf74043f88248a7 是当前 etcd Leader 节点的 ID。
暂停当前的 Leader:在手动更改 etcd Leader 之前,您需要暂停当前的 Leader。此步骤可能因您要执行的任务而异。
更改 etcd 配置:在更改 etcd Leader 之前,您需要更改 etcd 的配置以指定新的 Leader 节点。在 Kubernetes 中,etcd 配置存储在 ConfigMap 中,并称为
etcd-config。您可以使用以下命令获取该 ConfigMap:
kubectl get cm -n kube-system etcd-config -o yaml
- 更新 ConfigMap:在 ConfigMap 中,找到名为
initial-cluster-state的行,并将其值更改为existing。然后查找名为initial-cluster的行并将其更新为包含所有 etcd 节点的列表,其中新的 Leader 节点在第一个位置。例如:
initial-cluster: etcd-0=https://10.240.0.2:2380,etcd-1=https://10.240.0.3:2380,etcd-2=https://10.240.0.4:2380
- 保存更改:使用以下命令将更新后的 ConfigMap 保存回 Kubernetes 中:
kubectl apply -f <updated-etcd-config.yaml>
- 手动选择新的 Leader:现在您可以手动选择新的 etcd Leader。首先,您需要使用 kubectl 命令和新的 Leader IP 地址启动一个新的 Pod。例如:
kubectl run --rm -it --restart=Never --image=quay.io/coreos/etcd:v3.3.13 etcd-manager \
-- /bin/sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://<new-leader-ip>:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt elect <new-leader-name>"
其中,<new-leader-ip> 是您要选择的新 Leader 节点的 IP 地址,<new-leader-name> 是您选择的新 Leader 的名称。
- 恢复 Kubernetes 集群:一旦您手动更改了 etcd Leader,您应该再次启动之前暂停的服务,并确保所有组件都正在正常运行。
请注意,手动更改 etcd Leader 可能会破坏您的 Kubernetes 集群状态,并导致不可预测的行为。因此,这种方法应该只在必要时使用,并且应该谨慎使用。




