Introducción
En laboratorios anteriores, aprendió que los Pods aparecen y desaparecen. Si un Pod deja de funcionar y otro lo reemplaza, el nuevo Pod obtiene una dirección IP completamente diferente. ¡Imagínese intentar llamar a un amigo cuyo número de teléfono cambia cada vez que cuelga!
Para resolver este problema, Kubernetes utiliza un Service.
Un Service proporciona una identidad de red estable a una carga de trabajo, aunque los Pods que la respaldan puedan cambiar. Esta separación entre el ciclo de vida de los Pods y el endpoint del Service es una idea fundamental de las redes de Kubernetes.
Este es uno de los modelos mentales más importantes de las redes de Kubernetes: los Pods deben poder reemplazarse, pero los clientes siguen necesitando una dirección confiable. Un Service resuelve esta diferencia colocándose delante de los Pods cambiantes y presentando un nombre estable y una IP virtual.
En este laboratorio, usted:
- Creará un Service para proporcionar una dirección estable a su aplicación.
- Aprenderá cómo el Service sabe a qué Pods enviar las solicitudes mediante Selectors.
- Accederá a su aplicación desde fuera del clúster usando un tipo específico de Service llamado NodePort.
Crear el YAML del Service
En este paso, creará un archivo de configuración para un Service. Utilizaremos un tipo específico llamado NodePort.
Un Service de tipo NodePort abre un puerto específico en cada Node (servidor) del clúster. Es como abrir una puerta concreta de su casa para que pueda entrar el mundo exterior.
NodePort es fácil de entender porque se asigna directamente a un puerto de cada nodo, pero normalmente no es el diseño final para el tráfico público en producción. En entornos grandes, NodePort suele colocarse detrás de un balanceador de carga de la nube o de una capa de ingress. Aquí resulta útil porque permite a los principiantes ver claramente la ruta de red.
Cree un archivo llamado service.yaml en el directorio de su proyecto:
nano service.yaml
Pegue el siguiente contenido. Observe la sección selector: la dejaremos intencionadamente como app: unknown para mostrarle cómo funciona.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 80 ## The port the Service exposes internally
targetPort: 80 ## The port the container is listening on
nodePort: 30008 ## The static door we are opening to the outside
selector:
app: unknown ## This needs to match your Pod's label
Guarde el archivo y salga (Ctrl+X, Y, Enter).
Este archivo define un Service llamado my-service. Escucha en el puerto 30008 (nodePort). Cualquier tráfico que llegue a este puerto se reenviará a los Pods etiquetados como app: unknown (que actualmente no existen).
Corregir el Selector
Un Service utiliza un Selector para encontrar los Pods a los que debe dirigir el tráfico. Funciona como una etiqueta postal. Si la dirección del sobre (el Selector del Service) no coincide con la dirección de la casa (la etiqueta del Pod), el correo nunca llega.
Las etiquetas y los selectores aparecen en todo Kubernetes, no solo en los Services. Son uno de los mecanismos principales de agrupación de la plataforma. En lugar de fijar nombres exactos de Pods, los recursos de Kubernetes suelen encontrar objetos relacionados haciendo coincidir etiquetas. Así, el sistema sigue siendo flexible cuando se recrean los Pods.
En el paso de configuración, iniciamos automáticamente una aplicación web para usted. Vamos a buscar su «etiqueta de dirección».
Ejecute este comando para ver las etiquetas de los Pods que están en ejecución:
kubectl get pods --show-labels
Debería ver algo parecido a: web-app-xxxxx ... app=web-app
La etiqueta es app=web-app. Sin embargo, nuestro Service está buscando app: unknown. Vamos a corregirlo.
Edite el archivo service.yaml:
nano service.yaml
Cambie la sección selector para que coincida con la etiqueta de su Pod:
selector:
app: web-app
Guarde el archivo y salga. Ahora el Service sabe exactamente adónde debe enviar el tráfico.
Aplicar y verificar
Ahora que la dirección es correcta, vamos a activar el Service.
Cuando aplica este manifiesto, Kubernetes crea un objeto Service y configura reglas de red internas para que las solicitudes que llegan al Service puedan reenviarse a los endpoints de los Pods coincidentes. La idea importante es que el Service no ejecuta su aplicación. Es una abstracción de red situada delante de los Pods de la aplicación.
Aplique la configuración al clúster:
kubectl apply -f service.yaml
Debería ver: service/my-service created.
Para confirmar que el Service está activo y en ejecución, consulte la lista de Services:
kubectl get svc my-service
Verá:
- NAME: my-service
- TYPE: NodePort
- PORT(S): 80:30008/TCP
Esto confirma que su «número de teléfono» está activo y esperando llamadas en el puerto 30008.
Acceder a la aplicación
Ha llegado el momento de la verdad. ¿Podemos acceder a la aplicación desde «fuera» (su terminal)?
La aplicación está expuesta en el puerto 30008 del Node de Kubernetes.
Aquí intervienen tres puertos, y los principiantes suelen confundirlos. nodePort es el puerto abierto externamente en el nodo; port es el puerto expuesto por la abstracción del Service; y targetPort es el puerto dentro del contenedor que realmente proporciona la aplicación. Mantener claras estas funciones evitará confusiones más adelante.
Primero, obtenga la dirección IP del nodo de Minikube:
minikube ip
Supongamos que es 192.168.49.2. La dirección completa de su aplicación es http://192.168.49.2:30008.
Podemos utilizar curl para visitar esta dirección y comprobar que la aplicación responde:
curl http://$(minikube ip):30008
Debería ver el código HTML de la página «Welcome to nginx!».
Esto confirma el recorrido completo de la solicitud:
- Llamó al puerto externo del Node (
30008). - El Service recibió la solicitud.
- Comprobó su Selector (
app: web-app). - Reenvió la solicitud a uno de los Pods que coinciden con esa etiqueta.
- El Pod respondió con la página web.
Resumen
En este laboratorio, resolvió el problema de las direcciones IP cambiantes de los Pods mediante un Service.
Ha completado correctamente estas tareas:
- Creó un NodePort Service (
service.yaml) para abrir una puerta de acceso a su aplicación. - Configuró un Selector para indicar al Service qué Pods debe gestionar.
- Accedió a la aplicación en ejecución desde el exterior mediante su dirección estable.
Los Services son el elemento que conecta las aplicaciones de Kubernetes y permite que las distintas partes del sistema se comuniquen entre sí de forma confiable.


