Módulo 4 · Kubernetes para entrevistas
This content is not available in your language yet.
Curso 04 · Cloud · 180 min
Por qué esto importa en la entrevista
Sección titulada «Por qué esto importa en la entrevista»Kubernetes aparece en casi todas las vacantes senior, pero no te van a preguntar por kubectl: te van a preguntar por qué se reinicia tu pod, por qué el rollout tira 502s y cómo dimensionas recursos. Este módulo cubre exactamente eso.
Modelo mental: bucles de reconciliación
Sección titulada «Modelo mental: bucles de reconciliación»Kubernetes no “ejecuta” tu despliegue: compara el estado deseado con el real y actúa, para siempre. Todo lo demás se deduce de ahí (por eso los cambios son eventualmente consistentes y por eso borrar un pod no sirve de nada si su Deployment sigue vivo).
Qué pasa exactamente al hacer kubectl apply -f deploy.yaml (pregunta clásica):
kubectlmanda el YAML al API server, que autentica, autoriza (RBAC), pasa por admission controllers (mutantes y validantes: defaults, políticas, sidecars) y persiste en etcd.- El Deployment controller ve el nuevo estado y crea/actualiza un ReplicaSet.
- El ReplicaSet controller crea los Pods (sin nodo asignado).
- El scheduler elige nodo por: requests que caben, taints/tolerations, afinidades, topology spread.
- El kubelet del nodo arranca los contenedores vía CRI, monta volúmenes, ejecuta las probes.
- Al pasar readiness, el endpoint controller añade la IP del pod al Endpoints/EndpointSlice del Service, y kube-proxy (o el CNI) actualiza las reglas de red.
Contar esta cadena con soltura es una respuesta de 90 segundos que impresiona.
Probes: la fuente de más incidentes autoinfligidos
Sección titulada «Probes: la fuente de más incidentes autoinfligidos»| Probe | Si falla | Debe comprobar |
|---|---|---|
startupProbe |
reinicia (protege durante el arranque) | que el proceso terminó de arrancar (JVM lentas) |
livenessProbe |
reinicia el contenedor | solo estado irrecuperable del proceso |
readinessProbe |
lo saca del Service (no reinicia) | si puede atender ahora (dependencias críticas) |
Los dos errores clásicos: liveness que comprueba la BD (si la BD parpadea, Kubernetes reinicia todos tus pods a la vez y conviertes una degradación en un apagón) y timeouts demasiado ajustados (una pausa de GC de 2 s dispara el reinicio; ver curso 01).
Recursos: requests, limits y las dos muertes
Sección titulada «Recursos: requests, limits y las dos muertes»resources: requests: { cpu: "200m", memory: "256Mi" } # lo que el scheduler reserva limits: { memory: "512Mi" } # tope duro de memoria- CPU es comprimible: superar el límite produce throttling (latencia, no muerte). Se ve en
container_cpu_cfs_throttled_seconds_total. Por eso muchos equipos no ponen límite de CPU en servicios sensibles a latencia, manteniendo requests correctos — es una postura defendible que conviene saber argumentar en ambos sentidos. - Memoria no es comprimible: superar el límite = OOMKilled (137), inmediato y sin piedad.
- QoS:
Guaranteed(requests == limits) >Burstable>BestEffort(sin requests). Bajo presión del nodo, se desalojan primero los BestEffort. Si tu servicio es crítico, no lo dejes sin requests. - Runtimes con GC necesitan que el heap se configure por debajo del límite:
MaxRAMPercentage(JVM),GOMEMLIMIT(Go),--max-old-space-size(Node). Conectar esto con el módulo de tu lenguaje es exactamente lo que buscan.
Los cinco estados que debes diagnosticar sin buscar
Sección titulada «Los cinco estados que debes diagnosticar sin buscar»| Estado | Causas típicas | Qué miras |
|---|---|---|
Pending |
no cabe (requests), no hay nodo con las taints toleradas, PVC sin enlazar | kubectl describe pod → eventos del scheduler |
CrashLoopBackOff |
el proceso muere al arrancar: config, permisos, dependencia caída, comando mal | kubectl logs --previous |
OOMKilled (137) |
límite de memoria < uso real; heap mal configurado | describe → Last State, métricas de memoria |
ImagePullBackOff |
tag inexistente, credenciales de registro, red | eventos del pod |
Error/Completed inesperado |
señal no manejada, exit code | logs, código de salida |
kubectl describe pod <p> # eventos: el 80% de las respuestas están aquíkubectl logs <p> --previous # logs del contenedor que muriókubectl get events --sort-by=.lastTimestampkubectl top pod / kubectl top nodekubectl debug -it <p> --image=nicolaka/netshoot --target=<contenedor>Rollouts sin perder peticiones
Sección titulada «Rollouts sin perder peticiones»strategy: rollingUpdate: { maxSurge: 1, maxUnavailable: 0 } # nunca por debajo de la capacidadterminationGracePeriodSeconds: 45lifecycle: preStop: { exec: { command: ["sh","-c","sleep 5"] } } # margen para que dejen de enviarte tráficoEl punto fino (y la pregunta que separa): cuando un pod se elimina, el SIGTERM y la retirada del endpoint ocurren en paralelo, y la propagación a kube-proxy/ingress tarda. Por eso hace falta el preStop sleep (o poner readiness en rojo y esperar) y que la aplicación cierre ordenadamente. Sin las dos cosas, hay 502s en cada deploy.
Complementos: PodDisruptionBudget para que un drenaje de nodo no te deje sin réplicas, topologySpreadConstraints para repartir entre zonas, y estrategias canary/blue-green con Argo Rollouts o Flagger cuando el cambio es arriesgado.
Escalado
Sección titulada «Escalado»- HPA: por CPU (default, a menudo inadecuado) o por métricas custom/externas; con KEDA puedes escalar por lag de Kafka, longitud de cola SQS, etc. — que es lo correcto para consumidores.
- VPA: ajusta requests; útil para descubrir el dimensionado correcto (modo recomendación) más que para aplicarlo automáticamente en servicios con HPA.
- Cluster Autoscaler / Karpenter: añade nodos. Recuerda la latencia de arranque de nodo (1–3 min): el autoescalado de pods no sirve si no hay dónde ponerlos.
Configuración, secretos y seguridad básica
Sección titulada «Configuración, secretos y seguridad básica»ConfigMappara configuración,Secretpara credenciales — pero los Secrets son base64, no cifrado: activa cifrado en reposo en etcd, RBAC estricto y, mejor, External Secrets Operator o CSI driver del gestor de secretos de tu nube.- RBAC: roles mínimos por ServiceAccount; nada de
cluster-adminpara aplicaciones. - Pod Security / políticas (Kyverno, Gatekeeper): sin root, sin privilegios, sin
hostPath, filesystem de solo lectura, imágenes firmadas y por digest. - NetworkPolicy: por defecto todo pod habla con todos. Una política de denegación por defecto + permisos explícitos es la mejora de seguridad más rentable del clúster.
Errores comunes que delatan a un no-senior
Sección titulada «Errores comunes que delatan a un no-senior»- Liveness con dependencias externas.
maxUnavailablepor defecto sinPodDisruptionBudgeten servicios críticos.- No configurar el heap del runtime respecto al límite del contenedor.
- Confundir
PendingconCrashLoopBackOffa la hora de diagnosticar. - Creer que los Secrets están cifrados.
- Escalar por CPU un consumidor de cola.
- No conocer
kubectl describecomo primera herramienta.
🧪 Laboratorio
Sección titulada «🧪 Laboratorio»Con kind o minikube:
- Provoca los cinco estados de la tabla, uno por uno, y diagnostícalos solo con
describe,logs --previousy eventos. - OOMKilled a propósito: un servicio con heap mal configurado; arréglalo con
MaxRAMPercentage/GOMEMLIMITy demuéstralo. - Cero 502 en rollout: carga con
vegeta,kubectl rollout restart, cuenta errores; añade readiness + preStop + graceful shutdown hasta llegar a cero. Este ejercicio, hecho de verdad, responde tres preguntas del banco. - Throttling: pon
limits.cpu: 100ma un servicio con carga y observanr_throttledy el p99. Súbelo y compara. - KEDA: escala un consumidor por el lag de una cola y grafica réplicas vs lag.
- NetworkPolicy: deniega todo por defecto en un namespace y habilita solo lo necesario; verifica con
netshootqué deja de funcionar.
✅ Autoevaluación
Sección titulada «✅ Autoevaluación»- Cuenta qué pasa desde
kubectl applyhasta que el pod recibe tráfico. - Diferencia entre liveness y readiness, y por qué liveness no debe tocar la BD.
- ¿Qué ocurre al superar el límite de CPU? ¿Y el de memoria?
- Pod en
Pending: ¿qué miras y qué causas manejas? - ¿Por qué hay 502s durante un rollout y cómo se eliminan (dos mecanismos)?
- ¿Por qué HPA por CPU es mala idea para un consumidor de Kafka?
- ¿Están cifrados los Secrets? ¿Qué haces al respecto?
🎯 Preguntas del banco que ya puedes responder
Sección titulada «🎯 Preguntas del banco que ya puedes responder»cloud/aws/02-microservicios-en-aws.md— EKS y desplieguescloud/azure/02-microservicios-y-casos.md— AKS y casoscloud/gcp/02-microservicios-y-casos.md— GKE, límites y casosgolang-microservicios/03-casos-y-problemas.md— 16 (502 en rollouts) ·typescript-microservicios/03-casos-y-problemas.md— 15, 16
Anterior: Módulo 3 · Siguiente: Módulo 5 · Fiabilidad y costos