Has llegado al final del recorrido técnico. Durante once módulos has construido, roto, arreglado, asegurado y escalado la plataforma Rutas Norte: desde el primer Pod suelto hasta un clúster de producción con Ingress, TLS, políticas de red, almacenamiento persistente, observabilidad completa y despliegues canario gobernados por GitOps. Ese conocimiento es exactamente el que mide la certificación CKA (Certified Kubernetes Administrator). Lo único que te separa del certificado es el formato: un examen práctico, en un terminal, contrarreloj, con un cronómetro que no perdona la duda.

Esta lección convierte el curso que acabas de hacer en un plan de estudio para el CKA. Vas a ver qué certifica exactamente, cómo es el examen por dentro, qué dominios entran y con qué peso, y —lo más importante— una tabla que mapea cada objetivo oficial del temario con la lección de este curso donde lo estudiaste. A partir de ahí tendrás un plan de seis semanas y una batería de ocho tareas tipo examen resueltas con el comando exacto y su tiempo objetivo.

Aviso imprescindible. Los datos concretos del examen (precio, duración exacta, número de intentos incluidos, porcentaje de aprobado y reparto de los dominios) cambian con el tiempo. Todo lo que leas aquí es orientativo y corresponde al momento de escribir esta lección. Antes de matricularte, consulta siempre el temario oficial vigente en la web de la Linux Foundation / CNCF (training.linuxfoundation.org y cncf.io/certification/cka). El programa de certificación revisa los objetivos con cada versión de Kubernetes.

Contenido

  1. Qué certifica el CKA y a quién va dirigido
  2. El formato del examen por dentro
  3. Los dominios del temario y su peso orientativo
  4. Mapa completo: cada objetivo del CKA y su lección en este curso
  5. Habilidades específicas del CKA que conviene practicar aparte
  6. Plan de estudio de seis semanas
  7. Recursos oficiales y el simulador de prácticas
  8. Ocho tareas tipo CKA resueltas contrarreloj

  1. Qué certifica el CKA y a quién va dirigido

El CKA certifica que sabes administrar y operar un clúster de Kubernetes. No es una certificación sobre teoría de contenedores ni sobre desarrollo de aplicaciones: es la certificación del perfil que mantiene el clúster vivo.

1.1 El perfil que mide

La persona con CKA es la que, en una organización como Rutas Norte, se encarga de:

Responsabilidad Ejemplo en Rutas Norte
Instalar y mantener el clúster Montar el clúster con kubeadm, unir nodos nuevos, actualizar de 1.30 a 1.31
Gestionar el plano de control Diagnosticar un kube-apiserver que no arranca, hacer copia de etcd
Operar nodos Drenar nodo-3 para cambiar el disco, gestionar taints y cordones
Configurar el acceso Crear el Role que permite al equipo de soporte leer logs en rutas-norte-pro
Dar servicio de red y almacenamiento Publicar tienda-web con Ingress, aprovisionar el PVC de postgres-reservas
Resolver problemas El worker-notificaciones está en CrashLoopBackOff y hay que averiguar por qué

1.2 Su lugar entre las tres certificaciones

  • CKA: administrar el clúster. Nodos, plano de control, etcd, RBAC, red, almacenamiento y diagnóstico.
  • CKAD: desarrollar sobre el clúster; manifiestos de aplicación y velocidad con kubectl (lección 12-02).
  • CKS: asegurar el clúster; endurecimiento, políticas y detección (lección 12-03). Exige CKA vigente.

El CKA es el punto de entrada natural si tu trabajo es de plataforma, SRE o infraestructura.

1.3 Requisitos previos y qué NO entra

No hay requisitos formales: cualquiera puede matricularse. Los requisitos reales son prácticos: manejo cómodo de la línea de comandos de Linux (systemctl, journalctl, permisos de fichero, vim), comprensión de contenedores, y haber tocado un clúster de verdad —el kilometraje que te ha dado este curso.

Y conviene saber qué no cae. No hay preguntas tipo test: todo es práctico. No entran Helm, Kustomize ni Argo CD en profundidad, ni los proveedores gestionados (EKS/AKS/GKE), ni Prometheus o Grafana como productos —sí kubectl top y el metrics-server—, ni desarrollo de aplicaciones. El examen se centra en Kubernetes puro.


  1. El formato del examen por dentro

Este es el apartado que más gente subestima. Conocer Kubernetes y aprobar el CKA son cosas distintas, y la diferencia está aquí.

2.1 Características del examen

Aspecto Descripción orientativa
Tipo 100 % práctico, sin preguntas teóricas
Entorno Terminal en el navegador, supervisado remotamente
Duración En torno a dos horas
Número de tareas Aproximadamente entre 15 y 20
Puntuación de aprobado Aproximadamente un 66 %
Intentos La matrícula suele incluir un segundo intento gratuito
Validez En torno a dos años (ver lección 12-04)
Documentación permitida , la documentación oficial y solo esa

Repito: todos estos números son orientativos. Verifica el temario y las condiciones vigentes en la web oficial antes de pagar la matrícula.

2.2 Varios clústeres y el cambio de contexto

Esta es la trampa número uno del examen y la que más puntos regala a los descuidados.

El examen no te da un clúster: te da varios, cada uno con un nombre de contexto distinto. Cada tarea empieza indicándote en qué contexto debes trabajar, con un comando que puedes copiar y pegar:

kubectl config use-context rutas-norte-pro

Si resuelves la tarea perfectamente en el clúster equivocado, la puntuación es cero. No hay puntuación parcial por buena intención.

Comandos que debes tener automatizados en el dedo:

# Ver todos los contextos disponibles
kubectl config get-contexts

# Ver en cuál estoy AHORA
kubectl config current-context

# Cambiar de contexto
kubectl config use-context <nombre>

# Fijar un namespace por defecto en el contexto actual
kubectl config set-context --current --namespace=rutas-norte-pro

Hábito obligatorio: el primer comando de cada tarea es el use-context que te dan. Sin excepciones, ni siquiera cuando "es el mismo de antes".

2.3 Puntuación por tarea y puntuaciones parciales

Cada tarea tiene un peso en puntos que se muestra en el enunciado (por ejemplo, "Task weight: 7 %"). La suma de todas da 100.

Lo relevante:

  • Existen puntuaciones parciales. Si una tarea pide crear un Deployment con 3 réplicas, exponerlo con un Service y añadirle una sonda, y solo haces las dos primeras cosas, te llevas parte de los puntos. Nunca dejes una tarea en blanco.
  • La corrección es automática y por estado final del clúster. Nadie mira cómo lo hiciste. Si el objeto existe con la configuración pedida, puntúa; da igual si lo creaste con kubectl create, con un YAML o editando a mano.
  • Eso significa que la vía imperativa es tan válida como la declarativa, y mucho más rápida.

2.4 La documentación permitida: el arma decisiva

Durante el examen puedes abrir una pestaña adicional del navegador para consultar:

  • https://kubernetes.io/docs/ (incluida la referencia de la API y el blog)
  • La documentación de los subproyectos oficiales que se enlazan desde ahí (por ejemplo kubernetes.io/docs/reference/kubectl/)

No puedes usar buscadores generales, foros, notas propias, otras webs ni herramientas de IA. Está supervisado.

Esto cambia por completo la estrategia de estudio: no necesitas memorizar YAML. Necesitas saber dónde está cada ejemplo y adaptarlo en segundos. Un manifiesto de PersistentVolume, una NetworkPolicy o un Ingress con TLS son largos de escribir y fáciles de copiar.

Páginas que conviene tener localizadas mentalmente (se detalla más en la lección 12-04):

Necesito... Buscar en kubernetes.io
Manifiesto de PV / PVC "persistent volumes"
NetworkPolicy de ejemplo "network policies"
Ingress con reglas de ruta "ingress"
Backup de etcd "operating etcd clusters for kubernetes"
Actualizar el clúster "upgrading kubeadm clusters"
RBAC (Role/RoleBinding) "using rbac authorization"
Static pods "static pods"
Sondas "configure liveness readiness startup probes"

2.5 El entorno de trabajo

  • El terminal es un navegador. Copiar y pegar funciona, pero con atajos particulares (habitualmente Ctrl+Shift+C / Ctrl+Shift+V en Linux). Practícalo.
  • El editor disponible es vim (y nano). Si no manejas vim con soltura mínima, dedícale un par de horas antes del examen.
  • Tienes acceso sudo a los nodos vía ssh cuando la tarea lo requiere (por ejemplo, para arreglar el kubelet).
  • Hay un bloc de notas en la interfaz del examen para apuntar cosas; úsalo para llevar la lista de tareas pendientes.

  1. Los dominios del temario y su peso orientativo

El temario oficial del CKA se organiza en cinco dominios. Este es el reparto publicado en el momento de escribir esta lección; verifícalo en la web oficial, porque el programa se revisa periódicamente.

Dominio Peso orientativo De qué va
Arquitectura, instalación y configuración del clúster ~25 % Montar el clúster, RBAC, actualizarlo, etcd, alta disponibilidad, gestores de paquetes de Helm/Kustomize a nivel básico
Carga de trabajo y planificación ~15 % Deployments, escalado, rollouts, ConfigMaps y Secrets, planificación de pods, autoescalado
Servicios y redes ~20 % Services, DNS, Ingress, CNI, NetworkPolicies
Almacenamiento ~10 % StorageClasses, PV, PVC, modos de acceso, volúmenes en pods
Resolución de problemas ~30 % Diagnóstico de aplicaciones, del clúster, de nodos, de red, logs y monitorización

Fíjate bien en el reparto: resolución de problemas es el dominio más pesado, casi un tercio del examen. No es un tema que se estudie leyendo: se entrena rompiendo cosas y arreglándolas. Es exactamente lo que hiciste en el módulo 7 (07-06) y en el módulo 11 (11-06).

3.1 Cómo se traduce el peso en tiempo

Con dos horas y ~17 tareas, la media es de unos 7 minutos por tarea, pero el reparto real es muy desigual:

Tareas de 2-4 %  →  objetivo 3-4 minutos  (crear un Secret, escalar un Deployment)
Tareas de 5-7 %  →  objetivo 6-8 minutos  (Ingress con TLS, NetworkPolicy, PV+PVC+Pod)
Tareas de 8-10 % →  objetivo 10-12 minutos (backup/restore de etcd, upgrade de nodo,
                                            plano de control roto)

Deja 10 minutos finales sin asignar para revisar. Es el mejor uso posible de esos minutos.


  1. Mapa completo: cada objetivo del CKA y su lección en este curso

Esta es la sección que convierte el curso en un plan de estudio. Cada objetivo del temario está enlazado con la lección donde lo trabajaste. Repasar el CKA es, literalmente, releer estas lecciones y volver a hacer sus ejercicios en un clúster real.

4.1 Arquitectura, instalación y configuración del clúster (~25 %)

Objetivo oficial Lección del curso
Gestionar el control de acceso basado en roles (RBAC) 08-01-control-de-acceso-basado-en-roles
Preparar la infraestructura para instalar un clúster 10-02-kubeadm, 01-04-configuracion-de-un-cluster-kubernetes
Crear y gestionar clústeres con kubeadm 10-02-kubeadm
Gestionar el ciclo de vida del clúster (actualizaciones) 10-02-kubeadm
Implementar y configurar una infraestructura de alta disponibilidad 10-02-kubeadm, 09-05-alta-disponibilidad-y-pdb
Usar Helm y Kustomize para instalar componentes 10-03-helm, 10-04-kustomize
Comprender la interfaz de extensión (CNI, CSI, CRI, ...) 04-01-redes-de-cluster, 05-04-clases-de-almacenamiento, 01-02-arquitectura-de-kubernetes
CRDs, operadores y componentes de la API agregada 06-06-definiciones-de-recursos-personalizados, 06-07-operadores-y-el-patron-controlador
ServiceAccounts y acceso a la API 03-06-serviceaccounts-y-acceso-a-la-api

4.2 Carga de trabajo y planificación (~15 %)

Objetivo oficial Lección del curso
Comprender los despliegues y realizar rollouts y rollbacks 02-03-deployments, 02-04-actualizaciones-rollbacks-y-estrategias
Usar ConfigMaps y Secrets para configurar aplicaciones 03-01-configmaps, 03-02-secrets, 03-03-variables-de-entorno
Configurar escalado de aplicaciones 09-01-autoescalado-horizontal-de-pods, 02-03-deployments
Comprender las primitivas para crear cargas robustas 02-01-pods, 02-02-replicasets, 06-01-statefulsets, 06-02-daemonsets
Configurar Pods y contenedores: recursos y límites 03-04-cuotas-y-limites-de-recursos, 03-05-limitranges-y-clases-de-qos
Planificación: afinidad, taints, tolerations, nodeSelector 06-05-planificacion-afinidad-taints-y-tolerations
Jobs y CronJobs 06-03-trabajos-y-cronjobs
Etiquetas y selectores 02-07-etiquetas-selectores-y-anotaciones

4.3 Servicios y redes (~20 %)

Objetivo oficial Lección del curso
Comprender la conectividad entre pods 04-01-redes-de-cluster
Tipos de Service y endpoints 04-02-tipos-de-servicios
Usar el DNS del clúster 04-03-dns-interno-y-descubrimiento-de-servicios
Configurar y usar Ingress y IngressClass 04-04-controladores-de-ingress
Configurar TLS en Ingress 04-05-tls-y-certificados-con-cert-manager
Usar NetworkPolicies 04-06-politicas-de-red, 08-04-seguridad-de-red
Elegir e instalar un plugin CNI 04-01-redes-de-cluster
Gateway API (conocimiento básico) 04-04-controladores-de-ingress

4.4 Almacenamiento (~10 %)

Objetivo oficial Lección del curso
Implementar StorageClasses y aprovisionamiento dinámico 05-04-clases-de-almacenamiento, 05-05-aprovisionamiento-dinamico-expansion-y-snapshots
Configurar volúmenes: tipos, modos de acceso, reclaim policy 05-01-volumenes, 05-02-volumenes-persistentes
Gestionar PersistentVolumeClaims 05-03-reclamaciones-de-volumenes-persistentes
Usar almacenamiento en cargas de trabajo 05-01-volumenes, 06-01-statefulsets
Copias de seguridad y restauración 05-06-copias-de-seguridad-y-restauracion

4.5 Resolución de problemas (~30 %)

Objetivo oficial Lección del curso
Depurar aplicaciones (pods, contenedores, eventos) 07-06-depuracion-y-eventos-del-cluster
Monitorizar aplicaciones y componentes del clúster 07-02-servidor-de-metricas-y-kubectl-top, 07-03-monitoreo-con-prometheus
Gestionar logs de contenedores 07-05-registro-centralizado-con-efk, 07-06-depuracion-y-eventos-del-cluster
Diagnosticar fallos del clúster y de los nodos 07-06-depuracion-y-eventos-del-cluster, 11-06-operacion-en-produccion
Resolver problemas de red y de servicios 04-03-dns-interno-y-descubrimiento-de-servicios, 04-06-politicas-de-red
Verificaciones de salud y sondas 07-01-verificaciones-de-salud-y-sondas
Incidencias y runbooks 11-06-operacion-en-produccion

  1. Habilidades específicas del CKA que conviene practicar aparte

El curso te ha dado el conocimiento, pero hay siete procedimientos que en el examen aparecen casi con seguridad y que hay que tener memorizados como una coreografía. Repásalos hasta que salgan sin pensar.

5.1 Montar un clúster con kubeadm y unir nodos

En el nodo de control:

# Inicializar el plano de control
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# Configurar kubectl para el usuario actual
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Instalar el CNI (el manifiesto exacto lo da el enunciado)
kubectl apply -f https://raw.githubusercontent.com/.../calico.yaml

En el nodo trabajador:

sudo kubeadm join 10.0.0.10:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

Si el token caducó (dura 24 h), se regenera desde el nodo de control:

kubeadm token create --print-join-command

Comprobación: kubectl get nodes -o wide debe mostrar todos los nodos en Ready.

5.2 Actualizar la versión del clúster

Procedimiento canónico (siempre: plano de control primero, después los trabajadores, de uno en uno).

# --- En el nodo de control ---
# 1. Permitir la nueva versión en el repositorio (ajustar la minor en la URL del repo)
sudo apt-get update
sudo apt-cache madison kubeadm    # ver versiones disponibles

# 2. Actualizar kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get install -y kubeadm=1.31.1-1.1
sudo apt-mark hold kubeadm

# 3. Ver el plan y aplicar
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.31.1

# 4. Drenar el nodo, actualizar kubelet y kubectl, y devolverlo al servicio
kubectl drain nodo-control --ignore-daemonsets
sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.31.1-1.1 kubectl=1.31.1-1.1
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon nodo-control
# --- En cada nodo trabajador ---
sudo apt-get install -y kubeadm=1.31.1-1.1
sudo kubeadm upgrade node          # ¡ojo: "node", no "apply"!
kubectl drain nodo-1 --ignore-daemonsets
sudo apt-get install -y kubelet=1.31.1-1.1 kubectl=1.31.1-1.1
sudo systemctl daemon-reload && sudo systemctl restart kubelet
kubectl uncordon nodo-1

Trampas clásicas: olvidar --ignore-daemonsets en el drain (falla siempre, porque hay DaemonSets del CNI y de kube-proxy); usar upgrade apply en un trabajador; olvidar el uncordon final.

5.3 Copia y restauración de etcd

Es la tarea que más puntos vale y la que más gente falla. Memorízala.

Copia de seguridad:

ETCDCTL_API=3 etcdctl snapshot save /opt/backup-etcd.db \
  --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

Verificar la copia:

ETCDCTL_API=3 etcdctl --write-out=table snapshot status /opt/backup-etcd.db

Restauración:

# 1. Restaurar en un directorio NUEVO
sudo ETCDCTL_API=3 etcdctl snapshot restore /opt/backup-etcd.db \
  --data-dir=/var/lib/etcd-restaurado

# 2. Apuntar el pod estático de etcd al nuevo directorio
sudo vim /etc/kubernetes/manifests/etcd.yaml
#    En volumes: cambiar hostPath.path de /var/lib/etcd a /var/lib/etcd-restaurado

# 3. El kubelet recrea el pod solo. Esperar y comprobar.
sudo systemctl restart kubelet
kubectl get pods -n kube-system

Claves que se olvidan:

  • Los certificados de etcd están en /etc/kubernetes/pki/etcd/, no en /etc/kubernetes/pki/.
  • Si el enunciado te da rutas de certificados distintas, usa las suyas.
  • Hay que restaurar a un directorio nuevo, no sobre el existente.
  • Lo que se modifica es el volumen hostPath, no solo el argumento --data-dir del contenedor. Cambia ambos si el manifiesto los tiene desalineados.

5.4 Gestión de certificados

sudo kubeadm certs check-expiration     # caducidad de todos los certificados
sudo kubeadm certs renew all            # renovar todos
sudo kubeadm certs renew apiserver      # renovar solo uno

Tras renovar hay que reiniciar los pods estáticos del plano de control —moviendo temporalmente los manifiestos fuera de /etc/kubernetes/manifests/ o reiniciando el kubelet— y regenerar ~/.kube/config si ha cambiado el certificado de administración.

También puede pedirse aprobar una CSR para un usuario nuevo:

kubectl get csr
kubectl certificate approve soporte-rutas-norte
kubectl get csr soporte-rutas-norte -o jsonpath='{.status.certificate}' | base64 -d > soporte.crt

El manifiesto de la CertificateSigningRequest (grupo certificates.k8s.io/v1, con el campo request en base64, signerName: kubernetes.io/kube-apiserver-client y usages: ["client auth"]) se copia de la documentación buscando "certificate signing requests": es más rápido y más seguro que escribirlo.

5.5 Drenaje y mantenimiento de nodos

# Marcar como no planificable (los pods existentes siguen)
kubectl cordon nodo-2

# Vaciar el nodo (los DaemonSets no se pueden desalojar: hay que ignorarlos)
kubectl drain nodo-2 --ignore-daemonsets --delete-emptydir-data

# Devolverlo al servicio
kubectl uncordon nodo-2
Flag Cuándo se necesita
--ignore-daemonsets Casi siempre: hay DaemonSets de red y de logs
--delete-emptydir-data Si algún pod usa emptyDir (por ejemplo el sidecar de logs)
--force Si hay pods "huérfanos" sin controlador (un Pod suelto)
--grace-period=0 Solo si el enunciado pide inmediatez

5.6 Diagnóstico de un plano de control roto

Este es el escenario estrella del dominio de resolución de problemas. La secuencia mental es siempre la misma:

# 1. ¿Responde la API?
kubectl get nodes
#    Si da "connection refused" → el apiserver no está arriba.

# 2. ¿Está el kubelet vivo? (en el nodo de control, por ssh)
sudo systemctl status kubelet
sudo journalctl -u kubelet -n 50 --no-pager

# 3. ¿Qué contenedores del plano de control corren?
sudo crictl ps -a
sudo crictl logs <container-id>

# 4. ¿Están bien los manifiestos de los pods estáticos?
ls -l /etc/kubernetes/manifests/
sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml

Causas típicas que te van a poner, y su síntoma:

Causa introducida Síntoma Arreglo
Error de sintaxis en kube-apiserver.yaml La API no responde, crictl ps no muestra apiserver Corregir el YAML; el kubelet lo recrea solo
Ruta equivocada en un volumen del manifiesto El contenedor arranca y muere Corregir hostPath
--etcd-servers con puerto malo apiserver en bucle, logs de conexión Corregir el argumento
staticPodPath cambiado en /var/lib/kubelet/config.yaml Ningún pod estático arranca Restaurar staticPodPath: /etc/kubernetes/manifests y reiniciar kubelet
kubelet parado o deshabilitado Nodo NotReady sudo systemctl enable --now kubelet
Permisos incorrectos en /etc/kubernetes/pki/* apiserver no lee sus claves chmod/chown correctos (claves 600, root:root)
kubeconfig del kubelet apuntando mal Nodo NotReady, logs de autenticación Corregir /etc/kubernetes/kubelet.conf

Regla de oro: los pods estáticos no se gestionan con kubectl. Se gestionan editando ficheros en /etc/kubernetes/manifests/, y el kubelet reacciona en segundos.

5.7 RBAC

Aparece en prácticamente todos los exámenes. Estos cuatro comandos resuelven el 90 % de los casos:

# Role limitado a un namespace
kubectl create role lector-reservas \
  --verb=get,list,watch --resource=pods,pods/log \
  -n rutas-norte-pro

# Vincularlo a una ServiceAccount
kubectl create rolebinding lector-reservas-binding \
  --role=lector-reservas \
  --serviceaccount=rutas-norte-pro:soporte \
  -n rutas-norte-pro

# ClusterRole y ClusterRoleBinding (ámbito de clúster)
kubectl create clusterrole lector-nodos --verb=get,list --resource=nodes
kubectl create clusterrolebinding lector-nodos-binding \
  --clusterrole=lector-nodos --serviceaccount=rutas-norte-pro:soporte

Y la comprobación que siempre hay que dejar hecha:

kubectl auth can-i list pods \
  --as=system:serviceaccount:rutas-norte-pro:soporte \
  -n rutas-norte-pro
# yes

  1. Plan de estudio de seis semanas

Este plan asume entre 8 y 10 horas semanales y que ya has hecho el curso. La regla que lo gobierna: por cada hora de lectura, dos horas de teclado.

Semana Foco Lecciones a repasar Objetivo medible al terminar
1 Fundamentos y velocidad con kubectl 01-05, 01-06, 02-01 a 02-07 Crear un Deployment de 3 réplicas, exponerlo, escalarlo y verificarlo en menos de 2 minutos
2 Cargas de trabajo, configuración y planificación 03-01 a 03-05, 06-01 a 06-03, 06-05, 09-01 Consumir un ConfigMap y un Secret de las cuatro formas posibles sin abrir la documentación
3 Redes 04-01 a 04-06 Escribir de memoria una NetworkPolicy de denegación por defecto y un Ingress con TLS
4 Almacenamiento y administración del clúster 05-01 a 05-06, 10-02, 08-01 Montar un clúster con kubeadm desde cero en dos VMs y actualizarlo una versión menor completa
5 etcd, certificados y resolución de problemas 07-01, 07-02, 07-06 y los apartados 5.3 a 5.7 de esta lección Backup y restore de etcd sin documentación; arreglar los siete fallos de la tabla del apartado 5.6
6 Simulacros Lección 12-05 y el simulador oficial Dos simulacros completos cronometrados, corregidos, con repaso dirigido de los dominios flojos

Cómo usarlo. La semana 6 no es para aprender nada nuevo: es para medir, corregir y descansar. Deja el último día para preparar el entorno físico del examen (ver 12-04) y no toques temas nuevos en las últimas 48 horas.


  1. Recursos oficiales y el simulador de prácticas

7.1 Los que importan

Recurso Para qué
Página oficial del CKA (Linux Foundation) Temario vigente, precio, condiciones, política de reintentos
Curriculum en el repositorio cncf/curriculum de GitHub El PDF con los objetivos exactos por dominio
kubernetes.io/docs La única documentación permitida en el examen: familiarízate con su buscador
Handbook del candidato (Candidate Handbook) Requisitos del entorno, identificación, normas de la supervisión
Simulador de prácticas incluido con la matrícula Entorno prácticamente idéntico al examen

7.2 El simulador incluido

La matrícula suele incluir acceso a un simulador de examen (habitualmente dos sesiones de unas 36 horas cada una, en un entorno equivalente al real). Consejos de uso:

  • No lo gastes pronto. Úsalo cuando ya te sientas razonablemente preparado, en la semana 6.
  • Su dificultad suele ser superior a la del examen real. Si sacas un 60 % ahí, vas bien.
  • Lo valioso no es la nota, sino el solucionario: léelo entero, incluidas las tareas que acertaste, porque casi siempre hay una forma más rápida.

7.3 Entorno de práctica propio

No hace falta nada de pago. Con kind tienes un clúster de un nodo de control y dos trabajadores en menos de un minuto (repasa 10-01):

kind create cluster --name cka --config kind-cka.yaml   # 1 control-plane + 2 workers
kubectl get nodes

Ahora bien, para practicar kubeadm, etcd y el plano de control roto necesitas máquinas de verdad (VMs con Multipass, Vagrant o similar): kind ejecuta el plano de control dentro de contenedores y no reproduce fielmente ni systemctl ni los pods estáticos del host.


  1. Ocho tareas tipo CKA resueltas contrarreloj

Practica estas ocho como si fueran el examen: cronómetro en marcha, solo kubernetes.io abierto. Los escenarios son de Rutas Norte.


Tarea 1 — Crear un Deployment y exponerlo (peso ~4 %, objetivo: 4 min)

Contexto: kubectl config use-context rutas-norte-dev

En el namespace rutas-norte-dev, crea un Deployment llamado tienda-web con la imagen nginx:1.27-alpine y 3 réplicas. Expónlo con un Service ClusterIP llamado tienda-web-svc en el puerto 80.

kubectl config use-context rutas-norte-dev

kubectl create deployment tienda-web \
  --image=nginx:1.27-alpine --replicas=3 -n rutas-norte-dev

kubectl expose deployment tienda-web \
  --name=tienda-web-svc --port=80 --target-port=80 -n rutas-norte-dev

Comprobación:

kubectl get deploy,svc,endpoints -n rutas-norte-dev -l app=tienda-web
NAME                         READY   UP-TO-DATE   AVAILABLE
deployment.apps/tienda-web   3/3     3            3

NAME                     TYPE        CLUSTER-IP      PORT(S)
service/tienda-web-svc   ClusterIP   10.96.140.22    80/TCP

NAME                       ENDPOINTS
endpoints/tienda-web-svc   10.244.1.5:80,10.244.2.7:80,10.244.2.8:80

La trampa: si endpoints sale vacío, el selector no casa. kubectl expose lo hereda bien; escribirlo a mano es donde se rompe.


Tarea 2 — Copia de seguridad y restauración de etcd (peso ~8 %, objetivo: 10 min)

Contexto: kubectl config use-context rutas-norte-pro

Haz una copia de seguridad de etcd en /opt/etcd-rutas-norte.db. Después, restaura la copia previa /opt/snapshot-anterior.db en el directorio /var/lib/etcd-restore. Los certificados están en /etc/kubernetes/pki/etcd/.

# Copia
sudo ETCDCTL_API=3 etcdctl snapshot save /opt/etcd-rutas-norte.db \
  --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

# Verificación de la copia
sudo ETCDCTL_API=3 etcdctl --write-out=table snapshot status /opt/etcd-rutas-norte.db

# Restauración
sudo ETCDCTL_API=3 etcdctl snapshot restore /opt/snapshot-anterior.db \
  --data-dir=/var/lib/etcd-restore

# Reapuntar el pod estático
sudo vim /etc/kubernetes/manifests/etcd.yaml

En el manifiesto, el volumen queda así:

  volumes:
  - hostPath:
      path: /var/lib/etcd-restore   # antes: /var/lib/etcd
      type: DirectoryOrCreate
    name: etcd-data

Comprobación:

sudo crictl ps | grep etcd
kubectl get nodes

La trampa: snapshot save no necesita sudo si tu usuario lee los certificados, pero restore escribe en /var/lib, así que sí. Y hay que cambiar el hostPath del volumen, no basta con el --data-dir del contenedor.


Tarea 3 — Drenar un nodo para mantenimiento (peso ~4 %, objetivo: 3 min)

Contexto: kubectl config use-context rutas-norte-pro

El nodo nodo-2 va a recibir mantenimiento. Vacíalo de cargas de trabajo sin eliminar los DaemonSets, y asegúrate de que no se planifiquen pods nuevos en él.

kubectl drain nodo-2 --ignore-daemonsets --delete-emptydir-data

Comprobación:

kubectl get nodes
NAME     STATUS                     ROLES    VERSION
nodo-1   Ready                      <none>   v1.30.4
nodo-2   Ready,SchedulingDisabled   <none>   v1.30.4
kubectl get pods -A -o wide --field-selector spec.nodeName=nodo-2
# Solo deben quedar pods de DaemonSets (CNI, kube-proxy)

La trampa: drain ya hace cordon. Si falla por un pod suelto sin controlador, añade --force.


Tarea 4 — RBAC para el equipo de soporte (peso ~6 %, objetivo: 6 min)

Contexto: kubectl config use-context rutas-norte-pro

Crea la ServiceAccount soporte en rutas-norte-pro. Concédele permiso para ver pods y leer sus logs en ese namespace, y nada más. Verifica el resultado.

kubectl create serviceaccount soporte -n rutas-norte-pro

kubectl create role soporte-lectura \
  --verb=get,list,watch \
  --resource=pods,pods/log \
  -n rutas-norte-pro

kubectl create rolebinding soporte-lectura-binding \
  --role=soporte-lectura \
  --serviceaccount=rutas-norte-pro:soporte \
  -n rutas-norte-pro

Comprobación:

kubectl auth can-i get pods --as=system:serviceaccount:rutas-norte-pro:soporte -n rutas-norte-pro
# yes
kubectl auth can-i delete pods --as=system:serviceaccount:rutas-norte-pro:soporte -n rutas-norte-pro
# no
kubectl auth can-i get pods --as=system:serviceaccount:rutas-norte-pro:soporte -n rutas-norte-dev
# no

La trampa: pods/log es un subrecurso independiente. Sin él, kubectl logs falla aunque puedas listar pods.


Tarea 5 — PV, PVC y Pod que lo usa (peso ~7 %, objetivo: 8 min)

Contexto: kubectl config use-context rutas-norte-pre

Crea un PersistentVolume pv-informes de 2Gi, modo ReadWriteOnce, hostPath en /mnt/informes, con storageClassName: manual. Crea un PVC pvc-informes de 1Gi que lo consuma, y un Pod informes-ocupacion con imagen busybox:1.36 que lo monte en /datos y ejecute sleep 3600.

# informes.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-informes
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: /mnt/informes
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-informes
  namespace: rutas-norte-pre
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: informes-ocupacion
  namespace: rutas-norte-pre
spec:
  containers:
  - name: informes
    image: busybox:1.36
    command: ["sleep", "3600"]
    volumeMounts:
    - name: datos
      mountPath: /datos
  volumes:
  - name: datos
    persistentVolumeClaim:
      claimName: pvc-informes
kubectl apply -f informes.yaml

Comprobación:

kubectl get pv,pvc -n rutas-norte-pre
NAME                          CAPACITY   ACCESS MODES   STATUS   CLAIM
persistentvolume/pv-informes   2Gi        RWO            Bound    rutas-norte-pre/pvc-informes

NAME                                 STATUS   VOLUME        CAPACITY
persistentvolumeclaim/pvc-informes   Bound    pv-informes   2Gi

La trampa: si el storageClassName no coincide exactamente entre PV y PVC, el PVC se queda en Pending para siempre. Y el PV es de ámbito de clúster: no lleva namespace.


Tarea 6 — Nodo NotReady (peso ~8 %, objetivo: 8 min)

Contexto: kubectl config use-context rutas-norte-pro

El nodo nodo-3 aparece como NotReady. Investiga y devuélvelo al estado Ready sin reinstalar nada.

kubectl get nodes
kubectl describe node nodo-3 | tail -20

# Entrar al nodo
ssh nodo-3
sudo systemctl status kubelet
sudo journalctl -u kubelet -n 40 --no-pager

Salida típica del diagnóstico:

● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; disabled)
     Active: inactive (dead)
sudo systemctl enable --now kubelet
sudo systemctl status kubelet
exit

kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
nodo-3   Ready    <none>   42d   v1.30.4

La trampa: enable además de start. Si solo haces start, el corrector puede reiniciar el nodo y volverás a suspender. Si el kubelet arranca pero muere, mira journalctl: suele ser una ruta mal puesta en /var/lib/kubelet/config.yaml o un kubeconfig inválido.


Tarea 7 — NetworkPolicy de aislamiento (peso ~7 %, objetivo: 7 min)

Contexto: kubectl config use-context rutas-norte-pro

En rutas-norte-pro, postgres-reservas solo debe aceptar tráfico entrante en el puerto 5432 desde pods con la etiqueta app=api-reservas del mismo namespace. Todo lo demás, denegado.

# np-postgres.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-solo-api
  namespace: rutas-norte-pro
spec:
  podSelector:
    matchLabels:
      app: postgres-reservas
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: api-reservas
    ports:
    - protocol: TCP
      port: 5432
kubectl apply -f np-postgres.yaml

Comprobación:

# Debe funcionar
kubectl run test-ok --rm -it --image=busybox:1.36 \
  --labels=app=api-reservas -n rutas-norte-pro --restart=Never \
  -- nc -zv postgres-reservas 5432

# Debe fallar (timeout)
kubectl run test-ko --rm -it --image=busybox:1.36 \
  --labels=app=intruso -n rutas-norte-pro --restart=Never \
  -- nc -zv -w 3 postgres-reservas 5432

La trampa: declarar policyTypes: [Ingress] es lo que hace que la política deniegue todo lo no permitido. Si lo omites y no hay reglas de egress, el comportamiento no es el que esperas. Y el CNI debe soportar NetworkPolicies (Calico sí; el CNI por defecto de kind, no).


Tarea 8 — Actualizar un nodo trabajador (peso ~9 %, objetivo: 12 min)

Contexto: kubectl config use-context rutas-norte-pro

Actualiza el nodo trabajador nodo-1 de la versión 1.30.4 a la 1.31.1. El plano de control ya está en 1.31.1.

# Desde el nodo de control
kubectl drain nodo-1 --ignore-daemonsets --delete-emptydir-data

# En nodo-1 por ssh
ssh nodo-1
sudo apt-get update
sudo apt-mark unhold kubeadm
sudo apt-get install -y kubeadm=1.31.1-1.1
sudo apt-mark hold kubeadm

sudo kubeadm upgrade node

sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.31.1-1.1 kubectl=1.31.1-1.1
sudo apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet
exit

# De vuelta en el nodo de control
kubectl uncordon nodo-1

Comprobación:

kubectl get nodes
NAME          STATUS   ROLES           VERSION
nodo-control  Ready    control-plane   v1.31.1
nodo-1        Ready    <none>          v1.31.1

La trampa: en trabajadores es kubeadm upgrade node, nunca upgrade apply. Y si el repositorio de paquetes está pinneado a la minor 1.30, primero hay que cambiar la URL del repositorio de pkgs.k8s.io a v1.31, o apt no verá la versión nueva.


Errores Comunes y Consejos

Errores que cuestan puntos en el examen

Error Consecuencia Prevención
No ejecutar el use-context de la tarea Cero puntos en una tarea perfecta Primer comando de cada tarea, siempre
Olvidar el -n <namespace> pedido El objeto se crea en default y no puntúa Usar kubectl config set-context --current --namespace=X
Escribir YAML desde cero Se te va el tiempo y metes errores de indentación Usar --dry-run=client -o yaml o copiar de la documentación
Perseverar en una tarea difícil Dejas 4 tareas fáciles sin hacer Límite de tiempo por tarea; marcar y saltar
No verificar lo hecho Crees que puntúas y no Un kubectl get/describe de cierre por tarea
Dejar la tarea en blanco Pierdes la puntuación parcial Haz siempre la parte que sepas
Usar apt-get upgrade en vez de instalar la versión exacta Rompes el clúster apt-get install -y kubelet=<version>
Restaurar etcd sobre /var/lib/etcd La restauración falla o corrompe Restaurar a un directorio nuevo
drain sin --ignore-daemonsets El comando falla y pierdes minutos Ponlo siempre

Consejos de preparación

  1. Practica en un clúster real, no leyendo. El CKA se aprueba con las manos.
  2. Cronometra desde el día uno. Saber hacer algo en 15 minutos no sirve si el objetivo son 6.
  3. Domina kubectl explain. kubectl explain pod.spec.containers.livenessProbe --recursive te ahorra abrir el navegador.
  4. Ten la documentación en la cabeza como un mapa. No memorices YAML: memoriza en qué página está.
  5. Aprende a leer eventos. kubectl describe pod y kubectl get events --sort-by=.lastTimestamp resuelven la mitad del dominio de troubleshooting.
  6. Trabaja con sudo cómodo. Muchas tareas de administración son en el nodo, no en kubectl.
  7. Simula el entorno del examen. Mismo navegador, mismo terminal, mismo teclado. Reduce fricción el día D.

Ejercicios

Ejercicio 1 — Construye tu propio mapa de estudio

Toma el temario oficial vigente del CKA (descárgalo del repositorio cncf/curriculum) y, para cada objetivo, anota en una tabla propia tres cosas: la lección de este curso donde se cubre, tu nivel de confianza del 1 al 5, y si sabrías resolverlo sin documentación. Ordena la tabla por confianza ascendente: ese orden es tu plan de repaso.

Ejercicio 2 — Bloque cronometrado de administración

En un clúster de tres nodos montado con kubeadm (o VMs), resuelve en 30 minutos seguidos y sin pausas:

  1. Copia de seguridad de etcd en /opt/backup.db y verificación con snapshot status.
  2. Drenar nodo-1, actualizar su kubelet a la siguiente versión de parche, devolverlo al servicio.
  3. Crear la ServiceAccount auditor con permisos de solo lectura sobre pods y services en todos los namespaces, y demostrarlo con auth can-i.

Ejercicio 3 — Rompe y arregla el plano de control

Provoca deliberadamente estos tres fallos, de uno en uno, y arregla cada uno midiendo el tiempo:

  1. Cambia el puerto de --secure-port en /etc/kubernetes/manifests/kube-apiserver.yaml a 6444.
  2. Renombra /etc/kubernetes/pki/etcd/server.key a server.key.bak.
  3. Cambia staticPodPath en /var/lib/kubelet/config.yaml a /etc/kubernetes/manifiestos.

Objetivo: diagnosticar y arreglar cada uno en menos de 6 minutos.


Soluciones

Solución al Ejercicio 1

No hay solución única, pero tu tabla debe parecerse a esta (extracto); el criterio decisivo es la última columna:

Objetivo Lección Confianza ¿Sin docs?
Backup/restore de etcd 05-06 + apartado 5.3 2 No
Crear un Deployment y escalarlo 02-03 5
NetworkPolicy de denegación 04-06 3 No
Actualizar el clúster 10-02 2 No
Diagnosticar un pod en CrashLoop 07-06 4

Todo lo que tenga confianza ≤ 3 y "No" en la última columna va a las semanas 4 y 5 del plan. La trampa habitual es puntuarse alto en lo que se entiende pero nunca se ha ejecutado: si no lo has hecho con las manos esta semana, la confianza es 3 como mucho.

Solución al Ejercicio 2

Bloque de etcd (objetivo 8 min):

sudo ETCDCTL_API=3 etcdctl snapshot save /opt/backup.db \
  --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

sudo ETCDCTL_API=3 etcdctl --write-out=table snapshot status /opt/backup.db
+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 8f2e91ac |    41207 |       1382 |     5.9 MB |
+----------+----------+------------+------------+

Bloque de nodo (objetivo 15 min):

kubectl drain nodo-1 --ignore-daemonsets --delete-emptydir-data

ssh nodo-1 '
  sudo apt-get update &&
  sudo apt-mark unhold kubelet kubectl &&
  sudo apt-get install -y kubelet=1.30.5-1.1 kubectl=1.30.5-1.1 &&
  sudo apt-mark hold kubelet kubectl &&
  sudo systemctl daemon-reload && sudo systemctl restart kubelet'

kubectl uncordon nodo-1
kubectl get nodes

Para un cambio solo de parche (1.30.4 → 1.30.5) basta con actualizar el kubelet; en un cambio de versión menor haría falta además sudo kubeadm upgrade node.

Bloque de RBAC (objetivo 7 min): al ser "todos los namespaces", exige ClusterRole + ClusterRoleBinding:

kubectl create serviceaccount auditor -n rutas-norte-pro
kubectl create clusterrole auditor-lectura --verb=get,list,watch --resource=pods,services
kubectl create clusterrolebinding auditor-lectura-binding \
  --clusterrole=auditor-lectura --serviceaccount=rutas-norte-pro:auditor

kubectl auth can-i list services --as=system:serviceaccount:rutas-norte-pro:auditor -A   # yes
kubectl auth can-i create pods  --as=system:serviceaccount:rutas-norte-pro:auditor -A    # no

El error clásico es usar Role+RoleBinding: solo cubriría un namespace. El segundo error es ClusterRole con RoleBinding, que restringe los permisos a un namespace concreto —útil en otros casos, pero no es lo pedido.

Solución al Ejercicio 3

Fallo provocado Síntoma Arreglo
--secure-port=6444 en el apiserver kubectl responde The connection to the server ... was refused; el contenedor arranca y muere Devolver 6443 y ajustar también el puerto en livenessProbe y readinessProbe: el manifiesto lo repite en tres sitios y cambiar solo uno deja el pod en bucle
server.key de etcd renombrada La API no responde; los logs de etcd muestran no such file or directory Restaurar el nombre y dejarlo en chmod 600, root:root. Con permisos incorrectos el síntoma es idéntico, y el arreglo es solo el chmod/chown
staticPodPath cambiado Todos los pods del plano de control desaparecen a la vez; esa simultaneidad lo delata frente a un fallo aislado Restaurar staticPodPath: /etc/kubernetes/manifests en /var/lib/kubelet/config.yaml y reiniciar el kubelet

La secuencia de diagnóstico es siempre la misma, y merece la pena automatizarla:

kubectl get nodes                              # ¿responde la API?
sudo systemctl status kubelet                  # ¿vive el kubelet?
sudo journalctl -u kubelet -n 40 --no-pager
sudo crictl ps -a                              # ¿qué contenedores del plano de control hay?
sudo crictl logs <container-id>
ls -l /etc/kubernetes/manifests/

Diferencia clave que este ejercicio graba: los manifiestos de /etc/kubernetes/manifests/ los relee el kubelet solo, en segundos; /var/lib/kubelet/config.yaml requiere sudo systemctl restart kubelet para surtir efecto.


Conclusión

El CKA no mide si sabes Kubernetes en abstracto: mide si sabes operar un clúster con las manos y con prisa. Después de once módulos construyendo Rutas Norte, el conocimiento ya lo tienes; lo que esta lección te ha dado es la traducción de ese conocimiento al lenguaje del examen.

Los puntos que debes llevarte:

  • El CKA certifica el perfil de administración: nodos, plano de control, etcd, red, almacenamiento, RBAC y, sobre todo, diagnóstico (el dominio de mayor peso, en torno al 30 %).
  • El examen es práctico, cronometrado y con varios clústeres. El use-context es el primer comando de cada tarea, sin excepción.
  • Hay puntuación parcial: nunca dejes una tarea vacía.
  • Puedes consultar la documentación oficial y solo esa. Estudia dónde está cada cosa, no memorices YAML.
  • La tabla del apartado 4 convierte este curso en tu plan de estudio: cada objetivo oficial tiene su lección.
  • Siete procedimientos hay que tenerlos automatizados: kubeadm, upgrade, etcd, certificados, drain, plano de control roto y RBAC.
  • Consulta siempre el temario oficial vigente en la web de la Linux Foundation / CNCF antes de matricularte: pesos, duración y condiciones cambian.

En la siguiente lección cambiamos de perfil. Si el CKA es la certificación de quien mantiene el clúster, el CKAD es la de quien construye sobre él: menos etcd y más manifiestos de aplicación, menos administración y mucha más velocidad con kubectl. Veremos en qué se diferencian, qué dominios entran y cómo se entrena la competencia que decide ese examen: hacer muchas cosas correctas en muy poco tiempo.

Curso de Kubernetes

Módulo 1: Introducción a Kubernetes

Módulo 2: Componentes Principales de Kubernetes

Módulo 3: Gestión de Configuración y Secretos

Módulo 4: Redes en Kubernetes

Módulo 5: Almacenamiento en Kubernetes

Módulo 6: Conceptos Avanzados de Kubernetes

Módulo 7: Monitoreo y Registro

Módulo 8: Seguridad en Kubernetes

Módulo 9: Escalado y Rendimiento

Módulo 10: Ecosistema y Herramientas de Kubernetes

Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real

Módulo 12: Preparación para la Certificación de Kubernetes

© Copyright 2026. Todos los derechos reservados