Capitulo 17: Alta Disponibilidad
Capitulo 17: Alta Disponibilidad
< Volver al Indice del Tutorial
El Problema: Single Point of Failure
Un cluster K3s con un solo server funciona bien para desarrollo y pruebas, pero en produccion es un riesgo. Si ese unico server cae, pierdes acceso al API server, no puedes programar nuevos pods y los nodos agent quedan huerfanos.
Los pods existentes en los agents siguen corriendo, pero sin control plane no hay:
- Reprogramacion de pods si un agent falla
- Nuevos deployments o actualizaciones
- Auto-healing de pods caidos
- Acceso a kubectl
Para produccion necesitas alta disponibilidad (HA): multiples servers donde si uno cae, los demas mantienen el cluster operativo.
Opciones de HA en K3s
K3s ofrece dos mecanismos para HA:
Embedded etcd (Recomendado)
K3s incluye etcd embebido como base de datos distribuida. Los servers forman un cluster etcd entre si y replican los datos automaticamente.
Ventajas:
- Sin dependencias externas
- Configuracion simple
- etcd es el estandar de Kubernetes
Requisitos:
- Minimo 3 servers (numero impar obligatorio)
- Con 3 servers toleras la caida de 1
- Con 5 servers toleras la caida de 2
- Latencia baja entre servers (misma red o datacenter)
External Datastore
Usar una base de datos externa (MySQL, PostgreSQL, etcd externo) como almacen compartido.
Ventajas:
- Reutilizar infraestructura de base de datos existente
- La base de datos puede tener su propio esquema de HA
Desventajas:
- Dependencia externa adicional
- Mas componentes que mantener
- La base de datos se convierte en otro punto de fallo
Para la mayoria de los casos, embedded etcd es la opcion recomendada.
Configurar Cluster HA con Embedded etcd
Paso 1: Inicializar el Primer Server
El primer server arranca el cluster etcd con --cluster-init:
curl -sfL https://get.k3s.io | sh -s - server \
--cluster-init \
--tls-san mi-balanceador.ejemplo.com
El flag --cluster-init activa etcd embebido en lugar de SQLite. El flag --tls-san agrega el dominio del balanceador al certificado TLS (lo explicamos mas adelante).
Obtener el token para unir nodos adicionales:
cat /var/lib/rancher/k3s/server/node-token
Paso 2: Unir Servers Adicionales
En el segundo y tercer server:
curl -sfL https://get.k3s.io | sh -s - server \
--server https://IP_PRIMER_SERVER:6443 \
--token TOKEN_DEL_PASO_1 \
--tls-san mi-balanceador.ejemplo.com
Cada server adicional se une al cluster etcd y replica los datos. Repite este paso hasta tener al menos 3 servers.
Paso 3: Unir Agents
Los agents se unen igual que en un cluster normal, pero puedes apuntarlos a cualquier server:
curl -sfL https://get.k3s.io | K3S_URL=https://IP_CUALQUIER_SERVER:6443 \
K3S_TOKEN=TOKEN sh -
En produccion, los agents deben apuntar a la IP del balanceador, no a un server especifico.
Balanceador de Carga Externo
Con multiples servers necesitas un balanceador frente a ellos. Sin balanceador, si el server al que apuntan los agents cae, los agents pierden comunicacion aunque los otros servers esten bien.
Por que es Necesario
┌──────────────┐
│ Balanceador │
│ (nginx/HAProxy)│
└──────┬───────┘
│
┌────────────┼────────────┐
│ │ │
┌─────┴─────┐ ┌───┴───┐ ┌─────┴─────┐
│ Server 1 │ │Server2│ │ Server 3 │
└───────────┘ └───────┘ └───────────┘
El balanceador distribuye las conexiones entre los servers disponibles y detecta si uno cae para dejar de enviarle trafico.
Configurar con Nginx
stream {
upstream k3s_servers {
server 10.0.0.1:6443;
server 10.0.0.2:6443;
server 10.0.0.3:6443;
}
server {
listen 6443;
proxy_pass k3s_servers;
}
}
Configurar con HAProxy
frontend k3s_frontend
bind *:6443
mode tcp
default_backend k3s_servers
backend k3s_servers
mode tcp
balance roundrobin
server server1 10.0.0.1:6443 check
server server2 10.0.0.2:6443 check
server server3 10.0.0.3:6443 check
Fixed Registration Address y TLS-SAN
El flag --tls-san agrega IPs o dominios adicionales al certificado TLS del API server. Sin esto, las conexiones a traves del balanceador fallan por error de certificado.
# Agregar IP del balanceador
--tls-san 10.0.0.100
# Agregar dominio
--tls-san mi-cluster.ejemplo.com
# Multiples valores
--tls-san 10.0.0.100 --tls-san mi-cluster.ejemplo.com
Debes usar --tls-san en todos los servers del cluster con los mismos valores.
Verificar Alta Disponibilidad
Verificar Nodos
kubectl get nodes
Deberias ver todos los servers y agents con estado Ready:
NAME STATUS ROLES AGE
server-1 Ready control-plane,etcd,master 10m
server-2 Ready control-plane,etcd,master 8m
server-3 Ready control-plane,etcd,master 6m
agent-1 Ready <none> 4m
Verificar etcd
kubectl get endpoints -n kube-system
Simular Caida
Para probar HA, apaga uno de los servers:
# En server-2
sudo systemctl stop k3s
Desde otro server, verifica que el cluster sigue operativo:
kubectl get nodes
# server-2 deberia aparecer como NotReady
kubectl run test --image=nginx
# Deberia funcionar correctamente
Cuando levantes el server nuevamente, se reincorpora automaticamente:
sudo systemctl start k3s
Consideraciones de Produccion
- Numero impar de servers: etcd requiere quorum (mayoria). Con 3 servers, el quorum es 2.
- Latencia: Los servers deben estar en la misma red o con latencia baja (<10ms).
- Almacenamiento: etcd es sensible a la velocidad de disco. Usa SSDs para los servers.
- Monitoreo: Configura alertas para detectar cuando un server cae.
- No escalar indefinidamente: 3 o 5 servers es lo recomendado. Mas servers agregan latencia a etcd sin beneficio significativo.
Siguiente: Capitulo 18: Seguridad —>