У меня есть кластеры Kubernetes с kubeadm, 3 главных узла. Однажды один из главных узлов нужно было вывести из эксплуатации (миграция инфраструктуры), поэтому я удалил этот главный узел, запустив 'kubectl delete node ***'. Несколько дней назад я установил новую виртуальную машину и попытался снова присоединить ее к кластеру в качестве главного узла, но при проверке состояния работоспособности 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
Затем я проверяю журналы модуля rest etcd, похоже, он начинает сообщать о нездоровье 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, чтобы удалить удаленный главный узел, который все еще остается в кластере 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 есть configmap, называемый kubeadm-config, он все еще помнит удаленный главный узел как одну из конечных точек api. Это заблокирует присоединение к новому главному узлу на этапе проверки состояния работоспособности кластера etcd, поскольку kubeadm прочитает этот configmap и возьмет удаленный узел как узел 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