Enunciado — Proyecto 11: Services de Kubernetes (ClusterIP, NodePort, LoadBalancer)

4 min

Práctica · Módulo 07 — Kubernetes: conceptos fundamentales · Nivel intermedio

¡Inténtalo primero solo! Realiza el proyecto con este único enunciado. La corrección (manifiestos comentados + comandos) está en el README.md, plegada. No la abras hasta haberlo intentado.


Requisitos previos

  • El clúster Kubernetes de Docker Desktop activado (tipo Kubeadm) — ver el proyecto 10.
  • La imagen demo-k8s:1.0 ya construida (si no: docker build -t demo-k8s:1.0 ./app).

Objetivo

Entender para qué sirve un Service y dominar los tres tipos principales:

  • ClusterIP — acceso interno al clúster + descubrimiento de services por nombre DNS;
  • NodePort — acceso externo mediante un puerto de la máquina;
  • LoadBalancer — acceso externo mediante una IP «pública» (localhost con Docker Desktop).

Todo encima de un mismo Deployment: un solo lote de Pods, tres formas de exponerlos.


El problema a resolver

Los Pods son efímeros: nacen, mueren, cambian de IP. Por tanto no se puede contar con la IP de un Pod. Hace falta una dirección estable que reparta el tráfico hacia los Pods correctos: ese es el papel del Service, que encuentra sus Pods gracias a los labels.


Trabajo a realizar

Parte 1 — El Deployment (los Pods a exponer)

  1. Despliega una app en 3 réplicas que muestre el nombre del Pod (reutiliza demo-k8s:1.0).
  2. Da a los Pods un label claro (p. ej. app: demo-back).

Parte 2 — ClusterIP + descubrimiento de services

  1. Crea un Service ClusterIP llamado demo-clusterip (puerto 80 → 5000).
  2. Demuestra el descubrimiento por DNS: lanza un Pod cliente temporal y llama al service por su nombre:
    curl http://demo-clusterip
  3. Recarga varias veces y comprueba que el nombre del Pod cambia (reparto de carga interno).

Parte 3 — NodePort (acceso externo)

  1. Crea un Service NodePort llamado demo-nodeport (nodePort 30082).
  2. Abre http://localhost:30082 desde el navegador.

Parte 4 — LoadBalancer (acceso externo «cloud»)

  1. Crea un Service LoadBalancer llamado demo-lb (puerto 8090).
  2. Comprueba el EXTERNAL-IP (kubectl get svc) y abre http://localhost:8090.

Parte 5 — Observar y entender

  1. Lista los Services (kubectl get svc) y sitúa: TYPE, CLUSTER-IP, EXTERNAL-IP, PORT(S).
  2. Mira los Endpoints (kubectl get endpoints demo-clusterip): son las IP de los Pods detrás del Service.
  3. Cambia un label de un Pod (o del selector) y observa que sale de los Endpoints.

Preguntas de reflexión

  • ¿Por qué no se puede usar simplemente la IP de un Pod?
  • ¿Qué tipo de Service para: (a) una base de datos interna, (b) un sitio web público en dev local, (c) una API pública en producción cloud?
  • ¿Cómo encuentra un Pod otro service por su nombre? (papel de CoreDNS)
  • ¿Qué contiene la lista de Endpoints de un Service, y quién la actualiza?
  • ¿Qué ocurre si ningún Pod coincide con el selector del Service?

Entregables

  • k8s/deployment.yaml y los tres Services (service-clusterip.yaml, service-nodeport.yaml, service-loadbalancer.yaml).
  • Una captura de kubectl get svc que muestre los 3 tipos.
  • Una captura del descubrimiento por DNS (curl http://demo-clusterip desde un Pod cliente) con 2 nombres de Pod distintos.
  • Una captura de kubectl get endpoints demo-clusterip.

Criterios de éxito

CriterioEsperado
ClusterIPAccesible por nombre DNS desde otro Pod
NodePortAccesible en http://localhost:30082
LoadBalancerEXTERNAL-IP = localhost, accesible en http://localhost:8090
RepartoEl nombre del Pod cambia entre dos peticiones
EndpointsLas IP de los 3 Pods aparecen detrás del Service

¿Bloqueado? El README.md contiene la corrección completa, las nociones están detalladas en 01-CONCEPTS-SERVICES.md, y 02-COMMANDES.md lista todo el kubectl útil — a consultar después de haberlo intentado.