etcd torna-se insalubre depois de excluir um nó mestre, estou procurando uma solução

etcd torna-se insalubre depois de excluir um nó mestre, estou procurando uma solução

Eu tenho uma configuração de clusters Kubernetes com kubeadm, 3 nós mestres. Um dia, um dos nós mestres precisa ser desativado (migração de infraestrutura), então excluí esse nó mestre executando 'kubectl delete node ***'. Até alguns dias atrás, instalei uma nova VM e tentei uni-la de volta ao cluster como mestre, mas falhou ao verificar o estado de integridade do 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

Então vou verificar os logs do pod etcd restante, parece que ele começa a relatar que o etcd não está funcionando desde que o nó mestre foi excluído.

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

Você pode ver acima que o erro é relatado continuamente por dias. Acho que isso pode ser porque o etcd ainda se lembra do nó que já foi excluído. Nesse caso, gostaria de excluir permanentemente esse nó também no etcd para evitar o estado não saudável.

Não tenho certeza se você já se deparou com esse problema e conseguiu uma solução.

Obrigado.

Responder1

Finalmente descobri uma resolução.

Primeiro, você precisa se conectar a qualquer pod do etcd para remover o nó mestre excluído que ainda permanece no cluster do etcd e garantir que o cluster esteja finalmente íntegro.

**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

Em segundo lugar, há um configmap chamado kubeadm-config no namespace kube-public, que ainda lembra o nó mestre excluído como um dos pontos finais da API. Isso bloqueará a adesão a um novo nó mestre no estágio de verificação do estado de integridade do cluster etcd, porque o kubeadm lerá esse configmap e considerará o excluído como um nó etcd a ser verificado. Portanto, exporte esse namespace para o arquivo yaml, edite o arquivo e aplique-o novamente para excluí-lo da lista de pontos finais da 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: …

Versão testada: 1.14.3

informação relacionada