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:
- ¿Dónde están los datos de conexión? En un clúster levantado con
kubeadm,etcdcorre como un Static Pod en el nodo Control Plane. No necesitas adivinar sus certificados ni sus endpoints; puedes extraerlos directamente leyendo su manifiesto:
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:
- El Endpoint de conexión (
--endpoints) - El Certificado CA (
--cacert) - El Certificado del Servidor (
--cert) - 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:
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,
etcdctlcreará 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:
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.
- Abre el archivo del manifiesto:
- 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
- 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-filey--key-filedirectamente en tu bloc de notas para armar tu comando deetcdctl. -
Cuidado con los permisos: Asegúrate de ejecutar los comandos de restauración y edición con
sudosi 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.