En este documento se describe cómo sustituir una réplica de etcd que ha fallado en un clúster de usuario de alta disponibilidad (HA) de Google Distributed Cloud.
Las instrucciones que se indican aquí se aplican a un clúster de usuario de alta disponibilidad que usa kubeception, es decir, un clúster de usuario que no tiene habilitado Controlplane V2. Si necesitas sustituir una réplica de etcd en un clúster de usuario que tenga habilitado Controlplane V2, ponte en contacto con Cloud Customer Care.
Antes de empezar
Asegúrate de que el clúster de administrador funciona correctamente.
Asegúrate de que los otros dos miembros de etcd del clúster de usuario funcionan correctamente. Si se ha producido un error en más de un miembro de etcd, consulta Recuperación tras una corrupción o pérdida de datos de etcd.
Reemplazar una réplica de etcd con fallos
Crea una copia de seguridad del PodDisruptionBudget (PDB) de etcd para poder restaurarlo más adelante.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE
Donde:
ADMIN_CLUSTER_KUBECONFIGes la ruta al archivo kubeconfig del clúster de administrador.USER_CLUSTER_NAMEes el nombre del clúster de usuario que contiene la réplica de etcd con fallos.PATH_TO_PDB_FILEes la ruta en la que quieres guardar el archivo PDB de etcd. Por ejemplo,/tmp/etcpdb.yaml.
Elimina el PodDisruptionBudget (PDB) de etcd.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
Ejecuta el siguiente comando para abrir el StatefulSet de kube-etcd en tu editor de texto:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Cambia el valor de la marca
--initial-cluster-stateaexisting.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...Drena el nodo de réplica de etcd con fallos.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
Donde
NODE_NAMEes el nombre del nodo de réplica de etcd con fallos.Crea un nuevo shell en el contenedor de uno de los pods de kube-etcd que funcionan.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
Donde
KUBE_ETCD_PODes el nombre del pod de kube-etcd en funcionamiento. Por ejemplo,kube-etcd-0.En este nuevo shell, ejecuta los siguientes comandos:
Elimina el nodo de réplica de etcd con fallos del clúster de etcd.
Primero, enumera todos los miembros del clúster de etcd:
etcdctl member list -w table
En la salida se muestran todos los IDs de miembro. Determina el ID de miembro de la réplica fallida.
A continuación, elimina la réplica que ha fallado:
export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379 etcdctl member remove MEMBER_ID
Donde
MEMBER_IDes el ID hexadecimal del pod de réplica de etcd fallido.Añade un nuevo miembro con el mismo nombre y la misma URL de peer que el nodo de réplica que ha fallado.
etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
Donde
MEMBER_NAMEes el identificador del nodo de réplica de kube-etcd con fallos. Por ejemplo,kube-etcd-1okube-etcd2.
Lista los pods de etcd que gestionan el almacén de etcd de tu clúster de usuarios. Estos pods se ejecutan en el clúster de administrador:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcdLa salida muestra los pods de etcd y los nodos en los que se ejecutan los pods. Los nodos que se muestran en el resultado son nodos del clúster de administrador que actúan como planos de control de tu clúster de usuario:
NAME ... NODE kube-etcd-0 ... node-abc kube-etcd-1 ... node-yyy kube-etcd-2 ... node-zzz
Anota los nombres de los pods y los nombres de los nodos del plano de control para usarlos en el manifiesto de los pods que crearás en el siguiente paso.
Observa que cada pod de etcd se llama
kube-etcdseguido de un número. Este número se denomina número de miembro del pod. Identifica el pod como un miembro concreto del clúster de etcd que contiene los datos del objeto de tu clúster de usuario. En esta guía se usa el marcador de posición MEMBER_NUMBER para hacer referencia al número de miembro del pod de etcd.También puedes observar que cada pod de tu clúster de etcd se ejecuta en su propio nodo.
Crea un manifiesto de Pod que describa un Pod de utilidad que ejecutes temporalmente para restaurar los datos de etcd. Guarda el siguiente manifiesto de Pod en el directorio actual en un archivo llamado
etcd-utility-MEMBER_NUMBER.yaml:apiVersion: v1 kind: Pod metadata: name: etcd-utility-MEMBER_NUMBER namespace: USER_CLUSTER_NAME spec: containers: - command: ["/bin/sh"] args: ["-ec", "while :; do echo '.'; sleep 5 ; done"] image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION name: etcd-utility volumeMounts: - mountPath: /var/lib/etcd name: data - mountPath: /etcd.local.config/certificates name: etcd-certs nodeSelector: kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME kubernetes.io/hostname: NODE_NAME tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 - effect: NoSchedule key: node.kubernetes.io/unschedulable operator: Exists volumes: - name: data persistentVolumeClaim: claimName: data-kube-etcd-MEMBER_NUMBER - name: etcd-certs secret: defaultMode: 420 secretName: KUBE_ETCD_SECRET_NAMEHaz los cambios siguientes:
NODE_NAME: el nodo en el que se ejecuta el podkube-etcd-0.USER_CLUSTER_NAME: el nombre del clúster de usuarios.GKE_ON_PREM_VERSION: la versión del clúster en el que quieres realizar la restauración de etcd (por ejemplo, 1.31.100-gke.136).KUBE_ETCD_SECRET_NAME: el nombre del secreto que usa etcd en el clúster de usuario, que empieza porkube-etcd-certs.
Crea el pod de utilidad en tu clúster de administrador:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
Limpia el directorio de datos de etcd desde el pod de la utilidad.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
Elimina el Pod de utilidad.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Deja de acordonar el nodo que ha fallado.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
Abre el StatefulSet kube-etcd en tu editor de texto.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Cambia el valor de la marca
--initial-cluster-stateanew.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...Restaura el PDB de etcd que se ha eliminado en el paso 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml