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