etcd становится неработоспособным после удаления одного из главных узлов, я ищу исправление

etcd становится неработоспособным после удаления одного из главных узлов, я ищу исправление

У меня есть кластеры 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

Связанный контент