En esta página, se describe cómo reemplazar una réplica de etcd con errores en un clúster de usuario de alta disponibilidad (HA) para clústeres de Anthos alojados en VMware (GKE On-Prem).
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/etcdpdb.yaml
Donde:
ADMIN_CLUSTER_KUBECONFIG
es la ruta al archivo kubeconfig para el clúster de administrador.USER_CLUSTER_NAME
es el nombre del clúster de usuario que contiene la réplica de etcd con errores.
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-state
aexisting
.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_NAME
es 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_POD
es 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.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID
En el ejemplo anterior,
MEMBER_ID
es el ID del nodo de réplica de etcd con errores. Para obtener el ID, ejecuta el siguiente comando:ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member list -w fields
En el comando anterior, se muestran todos los miembros del clúster de etcd. El resultado es similar al siguiente:
sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields "ClusterID" : 6963206042588294154 "MemberID" : 4645269864592341793 "Revision" : 0 "RaftTerm" : 15 "ID" : 2279696924967222455 "Name" : "kube-etcd-2" "PeerURL" : "https://kube-etcd-2.kube-etcd:2380" "ClientURL" : "https://kube-etcd-2.kube-etcd:2379" "IsLearner" : false "ID" : 3728561467092418843 "Name" : "kube-etcd-1" "PeerURL" : "https://kube-etcd-1.kube-etcd:2380" "ClientURL" : "https://kube-etcd-1.kube-etcd:2379" "IsLearner" : false "ID" : 4645269864592341793 "Name" : "kube-etcd-0" "PeerURL" : "https://kube-etcd-0.kube-etcd:2380" "ClientURL" : "https://kube-etcd-0.kube-etcd:2379" "IsLearner" : false sh-5.0#
El
MemberID
del resultado anterior es el ID de miembro del Pod de kube-etcd en funcionamiento. A continuación, obtén elID
del nodo de réplica etcd con errores. En el ejemplo anterior,kube-etcd-0
tiene unID
del4645269864592341793
,kube-etcd-1
tiene unID
de3728561467092418843
ykube-etcd-2
tiene unID
de2279696924967222455
.Una vez que tengas el miembro
ID
, conviértelo de decimal a hexadecimal, porque el comandomember remove
acepta un miembro hexadecimalID
, mientras quemember list
muestra un decimal. Puedes usarprintf
para realizar la conversión. En este ejemplo parakube-etcd-2
, será la siguiente:printf '%x\n' 2279696924967222455
El resultado del comando anterior es el
MEMBER_ID
que debes usar para el comandomember remove
.Agrega un miembro nuevo con el mismo nombre y la misma URL de par que el nodo de réplica con errores.
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
Donde
MEMBER_NAME
es el identificador del nodo de réplica de kube-etcd con errores. Por ejemplo,kube-etcd-1
okube-etcd2
.
Sigue los pasos 1 a 3 en Implementa pods de utilidad para crear un pod de utilidad en el clúster de administrador. Este pod se usa para acceder al PersistentVolume (PV) del miembro de etcd que falló en el clúster de usuario.
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 -- 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-state
anew
.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