我有一个使用 kubeadm 设置的 Kubernetes 集群,有 3 个主节点。有一天,其中一个主节点需要退役(基础设施迁移),因此我通过运行“kubectl delete node ***”删除了该主节点。直到几天前,我安装了一个新的 VM 并尝试将其作为主节点重新加入集群,但在检查 etcd 运行状况时失败了。
[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: error syncing endpoints with etc: dial tcp 10.233.42.22:2379: connect: no route to host
然后我检查其余 etcd pod 的日志,看起来自从主节点被删除后它就开始报告 etcd 不健康。
rafthttp: health check for peer 55ab807fd1dc1d4 could not connect: dial tcp 10.233.42.22:2380: i/o timeout
kubectl logs etcd-ne1-prd-lnxstgivt01.ubisoft.org -n kube-system | grep 'could not connect: dial tcp 10.233.42.22:2380: i/o timeout' | awk '{ print $1 }' | uniq
2019-08-12
2019-08-13
2019-08-14
2019-08-15
2019-08-16
2019-08-17
2019-08-18
2019-08-19
2019-08-20
2019-08-21
2019-08-22
从上面可以看出,错误持续报告了好几天。我想这可能是因为 etcd 仍然记得已经删除的节点。如果是这样,我想在 etcd 中永久删除该节点,以避免不健康状态。
不确定您是否遇到过此问题并找到了解决方案。
谢谢。
答案1
最后我终于找到了解决办法。
首先,您需要附加到任意 etcd pod 来删除仍然保留在 etcd 集群中的已删除的主节点,并确保集群最终是健康的。
**List current nodes to get failed node id**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
55ab807fd1dc1d4: name=ae1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.233.42.22:2380 clientURLs=https://10.233.42.22:2379 isLeader=false
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true
**Remove the dead one**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member remove 55ab807fd1dc1d4
Removed member 55ab807fd1dc1d4 from cluster
**Verify it is removed**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true
其次,kube-public 命名空间中有一个名为 kubeadm-config 的配置映射,它仍将已删除的主节点记为 api 端点之一。这将阻止您在检查 etcd 集群健康状态阶段加入新的主节点,因为 kubeadm 将读取该配置映射并将已删除的节点作为要检查的 etcd 节点。因此,将该命名空间导出到 yaml 文件,编辑该文件并将其应用回去以将其从 api 端点列表中删除。
kubectl get configmap kubeadm-config -n kube-system -o yaml
apiVersion: v1
data:
…
ClusterStatus: |
apiEndpoints:
ae1-prd-lnxstgivt01.ubisoft.org:
advertiseAddress: 10.233.42.22
bindPort: 6443
ne1-prd-lnxstgivt01.ubisoft.org:
advertiseAddress: 10.136.66.170
bindPort: 6443
pdc-prd-lnxstginvt01.ubisoft.org:
advertiseAddress: 10.0.1.31
bindPort: 6443
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterStatus
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: …
测试版本:1.14.3