etcd deja de estar en buen estado después de eliminar uno de los nodos maestros, estoy buscando una solución

etcd deja de estar en buen estado después de eliminar uno de los nodos maestros, estoy buscando una solución

Tengo una configuración de clústeres de Kubernetes con kubeadm, 3 nodos maestros. Un día, uno de los nodos maestros necesitaba ser desmantelado (migración de infraestructura), así que eliminé ese nodo maestro ejecutando 'kubectl eliminar nodo ***'. Hasta hace unos días, instalé una nueva máquina virtual e intenté volver a unirla al clúster como maestro, pero falló al verificar el estado de salud de 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

Luego reviso los registros del pod de etcd en reposo, parece que comienza a informar que etcd no está en buen estado desde que se eliminó el nodo maestro.

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

Puede ver en lo anterior que el error se informa continuamente durante días. Creo que esto podría deberse a que etcd aún recuerda el nodo que ya eliminó. Si es así, me gustaría eliminar permanentemente ese nodo también en etcd para evitar un estado incorrecto.

No estoy seguro de si alguna vez te encontraste con este problema y obtuviste una solución.

Gracias.

Respuesta1

Finalmente descubrí una resolución.

Primero, debe conectarse a cualquiera de los pods de etcd para eliminar el nodo maestro eliminado que aún permanece en el clúster de etcd y asegurarse de que el clúster finalmente esté en buen estado.

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

En segundo lugar, hay un mapa de configuración llamado kubeadm-config en el espacio de nombres kube-public, que aún recuerda el nodo maestro eliminado como uno de los puntos finales de la API. Esto impedirá que se una a un nuevo nodo maestro en la etapa de verificación del estado de salud del clúster etcd, porque kubeadm leerá ese mapa de configuración y tomará el eliminado como un nodo etcd para verificar. Así que exporte ese espacio de nombres a un archivo yaml, edite el archivo y vuelva a aplicarlo para eliminarlo de la lista de puntos finales de la 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: …

Versión probada: 1.14.3

información relacionada