En este documento, se describe cómo reemplazar una réplica de etcd con errores en un clúster de usuario de alta disponibilidad (HA) para Google Distributed Cloud.
Las instrucciones que se indican aquí se aplican a un clúster de usuario con alta disponibilidad que usa kubeception, es decir, un clúster de usuario que no tiene habilitado Controlplane V2. Si necesitas reemplazar una réplica de etcd en un clúster de usuario que tiene habilitado Controlplane V2, comunícate con Atención al cliente de Cloud.
Antes de comenzar
Asegúrate de que el clúster de administrador funcione correctamente.
Asegúrate de que los otros dos miembros de etcd en el clúster de usuario funcionen de forma correcta. Si falló más de un miembro de etcd, consulta Recuperación ante daños o pérdidas de datos de etcd.
Reemplaza una réplica de etcd con errores
Crea una copia de seguridad de un etcd PodDisruptionBudget (PDB) para que puedas restablecerlo más tarde.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE
Aquí:
ADMIN_CLUSTER_KUBECONFIGes la ruta al archivo kubeconfig para el clúster de administrador.USER_CLUSTER_NAMEes el nombre del clúster de usuario que contiene la réplica de etcd con errores.PATH_TO_PDB_FILEes la ruta de acceso en la que deseas guardar el archivo PDB de etcd, por ejemplo,/tmp/etcpdb.yaml.
Borra 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 ...Desvía el nodo de réplica etcd con errores.
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 errores.Crea un nuevo shell en el contenedor de uno de los pods de kube-etcd en funcionamiento.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
En el ejemplo anterior,
KUBE_ETCD_PODes el nombre del Pod de kube-etcd en funcionamiento. Por ejemplo,kube-etcd-0.Desde este shell nuevo, ejecuta los siguientes comandos:
Quita el nodo de réplica de etcd con errores del clúster de etcd.
Primero, enumera todos los miembros del clúster de etcd:
etcdctl member list -w table
El resultado muestra todos los IDs de los miembros. Determina el ID del miembro de la réplica con errores.
A continuación, quita la réplica con errores:
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
En el ejemplo anterior,
MEMBER_IDes el ID de miembro hexadecimal del Pod de réplica de etcd con errores.Agrega un miembro nuevo con el mismo nombre y la misma URL de par que el nodo de réplica con errores.
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 errores. Por ejemplo,kube-etcd-1okube-etcd2.
Enumera los Pods de etcd que administran el depósito de etcd para el clúster de usuario. Los Pods se ejecutan en el clúster de administrador:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcdEn el resultado, se muestran 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 funcionan como planos de control para el clúster de usuario:
NAME ... NODE kube-etcd-0 ... node-abc kube-etcd-1 ... node-yyy kube-etcd-2 ... node-zzz
Toma nota de los nombres del Pod y de los nombres del nodo del plano de control para usarlos en el manifiesto del Pod que crearás en el siguiente paso.
Ten en cuenta que cada Pod de etcd se llama
kube-etcdjunto con un número. Este número se llama número de miembro del Pod. Identifica al Pod como un miembro en particular del clúster de etcd que conserva los datos del objeto del 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.Además, observa que cada Pod del clúster de etcd se ejecuta en su propio nodo.
Crea un manifiesto de Pod que describa un Pod de utilidad que ejecutes de forma temporal para restablecer datos etcd. Guarda el siguiente manifiesto del 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_NAMEReemplaza lo siguiente:
NODE_NAMEes el nodo en el que se ejecuta el Podkube-etcd-0.USER_CLUSTER_NAMEes el nombre del clúster de usuario.GKE_ON_PREM_VERSION: La versión del clúster en la que deseas realizar el restablecimiento de etcd (por ejemplo, 1.31.100-gke.136).KUBE_ETCD_SECRET_NAME: es el nombre del secreto que usa etcd en el clúster de usuarios, a partir dekube-etcd-certs.
Crea el Pod de utilidad en el 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 utilidad.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
Borra el pod de utilidad.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Desacordonar el nodo con errores.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
Abre StatefulSet de kube-etcd en el 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 ...Restablece el PDB de etcd que se borró en el paso 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml