Capitulo 20: Tips de Produccion
Capitulo 20: Tips de Produccion
< Volver al Indice del Tutorial
Backup y Restore de etcd
Los backups son la red de seguridad de tu cluster. Sin ellos, una falla catastrofica significa reconstruir todo desde cero.
Crear Snapshots
# Snapshot manual
k3s etcd-snapshot save --name backup-pre-actualizacion
# Listar snapshots existentes
k3s etcd-snapshot list
Por defecto, K3s crea snapshots automaticos cada 12 horas y retiene los ultimos 5. Puedes configurar esto:
# En /etc/rancher/k3s/config.yaml
etcd-snapshot-schedule-cron: "0 */6 * * *" # Cada 6 horas
etcd-snapshot-retention: 10 # Retener 10 snapshots
etcd-snapshot-dir: /mnt/backups/etcd # Directorio personalizado
Restaurar desde Snapshot
# Detener K3s
sudo systemctl stop k3s
# Restaurar (resetea el cluster al estado del snapshot)
k3s server --cluster-reset \
--cluster-reset-restore-path=/var/lib/rancher/k3s/server/db/snapshots/NOMBRE-SNAPSHOT
# Reiniciar K3s
sudo systemctl start k3s
En un cluster HA, despues de restaurar en un server, los demas servers deben unirse nuevamente.
Actualizaciones de K3s
Actualizacion Manual
# Verificar version actual
k3s --version
# Actualizar (reinstalar con la nueva version)
curl -sfL https://get.k3s.io | sh -
# Para una version especifica
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.30.0+k3s1 sh -
Actualiza primero los servers, luego los agents. En clusters HA, actualiza un server a la vez.
System Upgrade Controller
Para actualizaciones automaticas y controladas, usa el system-upgrade-controller de Rancher:
# Instalar el controlador
kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml
Crear planes de actualizacion:
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: server-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: Exists
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
channel: https://update.k3s.io/v1-release/channels/stable
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: agent-plan
namespace: system-upgrade
spec:
concurrency: 2
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
prepare:
args: ["prepare", "server-plan"]
image: rancher/k3s-upgrade
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
channel: https://update.k3s.io/v1-release/channels/stable
El agent-plan espera a que el server-plan termine antes de actualizar los agents.
Resource Limits y Requests
Siempre define resources en tus pods. Sin limits, un pod puede consumir todos los recursos del nodo y afectar a los demas.
containers:
- name: app
image: mi-app:1.0
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
- requests: Recursos garantizados. El scheduler usa esto para colocar pods.
- limits: Maximo que puede consumir. Si excede memoria, el pod es terminado (OOMKilled).
LimitRange por Namespace
Aplica defaults automaticamente a pods que no definen resources:
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: produccion
spec:
limits:
- default:
cpu: 500m
memory: 256Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
ResourceQuota por Namespace
Limita el consumo total de un namespace:
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
namespace: staging
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
Horizontal Pod Autoscaler (HPA)
Escala automaticamente el numero de replicas basandose en metricas de CPU o memoria.
Prerequisito: Metrics Server
K3s incluye metrics-server por defecto. Verifica que funciona:
kubectl top nodes
kubectl top pods
Crear HPA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
Cuando el uso promedio de CPU supera 70% o memoria supera 80%, HPA crea mas replicas. Cuando baja, las reduce.
Liveness y Readiness Probes
Liveness Probe
Detecta si el contenedor esta colgado. Si falla, Kubernetes reinicia el pod:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
Readiness Probe
Detecta si el pod esta listo para recibir trafico. Si falla, el pod se remueve del Service:
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
Siempre usa ambas probes. Sin readiness probe, el trafico llega a pods que aun estan arrancando. Sin liveness probe, pods colgados siguen recibiendo trafico.
Pod Disruption Budgets
Garantizan disponibilidad durante actualizaciones y mantenimiento de nodos:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: web-app
Con minAvailable: 2, Kubernetes no permite drenar un nodo si eso dejaria menos de 2 replicas de web-app corriendo. Esto previene downtime durante rolling updates del cluster.
Registry Privado
Para pull de imagenes desde registries privados, configura K3s con /etc/rancher/k3s/registries.yaml:
mirrors:
docker.io:
endpoint:
- "https://mi-mirror.ejemplo.com"
mi-registry.ejemplo.com:
endpoint:
- "https://mi-registry.ejemplo.com"
configs:
"mi-registry.ejemplo.com":
auth:
username: usuario
password: password
tls:
insecure_skip_verify: false
Reinicia K3s despues de modificar este archivo:
sudo systemctl restart k3s
Los agents tambien necesitan este archivo si descargan imagenes directamente.
Checklist de Produccion
Antes de considerar tu cluster listo para produccion, verifica cada punto:
Infraestructura
- HA habilitado con 3+ servers
- Backups automaticos de etcd configurados
- Backups probados con restauracion real
- Proceso de actualizacion documentado y probado
Monitoring y Observabilidad
- Prometheus y Grafana instalados
- Alertas configuradas para nodos, pods y recursos
- Logs centralizados
- Dashboards para metricas clave
Seguridad
- Network Policies con default deny
- RBAC con menor privilegio
- Secrets encriptados at rest
- TLS en todos los Ingress
- Pod Security Standards en modo enforce
- kube-bench ejecutado y remediado
Aplicaciones
- Resource limits en todos los pods
- Liveness y readiness probes configuradas
- Pod Disruption Budgets definidos
- HPA configurado para workloads variables
Operaciones
- GitOps configurado con Flux
- Registry privado configurado
- Proceso de rollback documentado
- Runbooks para incidentes comunes
Esta checklist no es exhaustiva pero cubre los fundamentos. Cada entorno tiene requisitos adicionales segun su contexto.