Saltar a contenido

Backup y Restore de etcd

Conceptos Fundamentales antes de Empezar

Para interactuar con etcd, utilizamos la herramienta de línea de comandos etcdctl.

  • Regla de oro del examen: Asegúrate siempre de usar la versión 3 de la API. Por defecto, la CLI puede intentar usar la v2. Debes forzarla exportando esta variable de entorno antes de ejecutar cualquier comando:
export ETCDCTL_API=3
  • ¿Dónde están los datos de conexión? En un clúster levantado con kubeadm, etcd corre como un Static Pod en el nodo Control Plane. No necesitas adivinar sus certificados ni sus endpoints; puedes extraerlos directamente leyendo su manifiesto:
cat /etc/kubernetes/manifests/etcd.yaml

Allí encontrarás las rutas físicas de las llaves que necesitas para autenticarte.

Fase 1: Creación del Backup (Snapshot)

Hacer un respaldo consiste en pedirle a etcdctl que guarde un archivo de "snapshot". Para que el comando funcione de forma segura, debes proporcionarle obligatoriamente:

  1. El Endpoint de conexión (--endpoints)
  2. El Certificado CA (--cacert)
  3. El Certificado del Servidor (--cert)
  4. La Llave Privada (--key)

El Comando Maestro de Backup:

etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /srv/data/etcd-snapshot.db

(Puedes cambiar /srv/data/etcd-snapshot.db por la ruta exacta que te pida el examen).

Validación del Backup:

Una vez creado el archivo, verifica que no esté corrupto y que la API lo reconozca como un snapshot válido usando:

etcdctl --write-out=table snapshot status /srv/data/etcd-snapshot.db

Si ves una tabla detallando el tamaño, la revisión y el hash del snapshot, ¡el backup fue exitoso!

Fase 2: Restauración del Clúster (Restore)

Imagina que el clúster colapsó o que alguien borró accidentalmente un Namespace crítico. Para restaurar el estado, debemos inyectar el snapshot guardado.

[!WARNING] Cuando restauras un snapshot, etcdctl creará un nuevo directorio de datos. NUNCA debes sobrescribir el directorio de datos original mientras el proceso esté activo, ya que corromperías la base de datos.

Paso 1: Ejecutar el comando de restauración

Para restaurar, no necesitas los certificados --cert ni --key, solo debes indicarle el nuevo directorio de destino mediante el flag --data-dir:

etcdctl snapshot restore /srv/data/etcd-snapshot.db \
  --data-dir=/var/lib/etcd-from-backup

Esto creará la estructura de base de datos restaurada en una carpeta limpia llamada /var/lib/etcd-from-backup.

Paso 2: Apuntar el componente etcd a la nueva ruta

Ahora que los datos están listos en la nueva carpeta, debes indicarle al clúster que lea de allí. Como etcd es un Static Pod, simplemente editamos su manifiesto YAML. El kubelet detectará el cambio y reiniciará el Pod automáticamente.

  1. Abre el archivo del manifiesto:
sudo vi /etc/kubernetes/manifests/etcd.yaml
  1. Busca la sección de volumes (la carpeta de la máquina host) y actualiza el hostPath para que apunte al nuevo directorio:
# Busca esta sección dentro de etcd.yaml y modifícala:
- name: etcd-data
  hostPath:
    path: /var/lib/etcd-from-backup  # <- Cambia la ruta antigua por la nueva
    type: DirectoryOrCreate
  1. Guarda y cierra el archivo (:wq).

Validación Post-Desastre y Troubleshooting

Al modificar el archivo etcd.yaml, el API Server perderá conexión temporalmente (unos 20 o 30 segundos) mientras el Pod estático de etcd se destruye y vuelve a nacer con los nuevos datos.

Comandos de verificación rápida:

# 1. Monitorea los pods del sistema operativo hasta que vuelvan a estar Running
kubectl get pods -n kube-system

# 2. Comprueba que tus antiguos recursos/pods que habías perdido volvieron a la vida
kubectl get all -A

Tips de Velocidad para el Examen CKA

  • No memorices las rutas de los certificados: Al iniciar la pregunta, haz un cat /etc/kubernetes/manifests/etcd.yaml. Copia y pega las rutas de --trusted-ca-file, --cert-file y --key-file directamente en tu bloc de notas para armar tu comando de etcdctl.

  • Cuidado con los permisos: Asegúrate de ejecutar los comandos de restauración y edición con sudo si estás interactuando directamente en las rutas /var/lib/ o /etc/kubernetes/.

  • No reinicies la máquina: No es necesario reiniciar el nodo completo ni el servicio de kubelet. Modificar el archivo en /etc/kubernetes/manifests/ gatilla el reinicio automático del contenedor.