Service en Kubernetes


Explicamos el Service en Kubernetes y daremon un ejemplo de ClusterIP NodePort LoadBalancer

oscar Escrito por oscar 29 July 2025 62 0

¿Qué es un Service en Kubernetes?

En Kubernetes, un Service es un recurso que permite exponer una aplicación (Pod) de forma estable y accesible dentro o fuera del clúster. Proporciona una IP fija y un nombre DNS para acceder a los Pods que coinciden con un selector. Los servicios permiten la comunicación entre pods dentro de un clúster y también pueden exponer aplicaciones al exterior.

Funcionalidades principales de los servicios

  • Descubrimiento de pods: Los servicios identifican y dirigen el tráfico a los pods correctos, incluso cuando se crean o eliminan pods.
  • Balanceo de carga: Distribuir el tráfico de red entre los pods que pertenecen al mismo servicio, asegurando alta disponibilidad y rendimiento.
  • Redes estables: Proporcionan una dirección IP y un nombre DNS estables para acceder a la aplicación, independientemente de los cambios en los pods subyacentes.

🧩 Tipos de Service

Kubernetes proporciona varios tipos de Service, y los tres más usados son:

Tipo de Service Visibilidad Propósito principal
ClusterIP Interno Comunicación entre Pods dentro del clúster
NodePort Externo Exponer la app desde cualquier nodo usando un puerto
LoadBalancer Externo (cloud) Exponer con IP pública y balanceador de carga automático

📊 Comparativa resumen

Característica ClusterIP NodePort LoadBalancer
Acceso externo ❌ No ✅ Sí (limitado) ✅ Sí (IP pública)
Balanceo de carga ❌ No ❌ No ✅ Sí
Casos de uso Comunicación interna Desarrollo, pruebas Producción en la nube
IP pública ❌ No ❌ No (usa IP del nodo) ✅ Automática en cloud

🔹 ClusterIP (por defecto)

📌 ¿Qué hace?

Crea una IP interna accesible solo dentro del clúster de Kubernetes. No se puede acceder desde fuera.

📦 ¿Para qué sirve?

Ideal para microservicios que se comunican entre sí, por ejemplo:

  • Backend accediendo a base de datos.
  • Frontend accediendo al backend.

🔹 NodePort

📌 ¿Qué hace?

Expone el servicio fuera del clúster asignando un puerto en cada nodo del clúster (por defecto entre 30000-32767).

📦 ¿Para qué sirve?

Permite acceder a la app desde el navegador o desde fuera del clúster, ideal para pruebas o entornos de desarrollo.

💡 Forma de acceso:

http://<IP-del-nodo>:<NodePort>

🔹 LoadBalancer

📌 ¿Qué hace?

Crea un balanceador de carga externo (si estás en un proveedor cloud como GKE, EKS, AKS) y asigna una IP pública para acceder desde fuera del clúster.

📦 ¿Para qué sirve?

Ideal para producción. Permite que múltiples usuarios accedan a la app a través de un punto único de entrada con balanceo de carga automático.

✅ Precondiciones

  • Realizar la instalación correcta de un entorno de trabajo para kubernetes, tengo una Guía completa de comandos Minikube
  • Asegúrate de que Minikube está corriendo Abre PowerShell o CMD y ejecuta: minikube start
  • Revisa los comandos de kubectl
  • Valida si estas en el contexto correcto del clustes de minikube, en Contexto en kubectl te explico como.

📘 Ejemplo

Ahora vamos a hacer un ejemplo práctico paso a paso usando los tres tipos de servicios en Kubernetes (ClusterIP, NodePort, y LoadBalancer). Usaremos una aplicación sencilla en un Pod, como un contenedor nginx, y veremos cómo se comporta al ser expuesta con cada tipo de servicio.

Paso 1: Crear un Deployment de prueba (nginx)

Creamos un Deployment llamado nginx-deployment con 2 réplicas de nginx.

📄 Archivo: nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

📌 Aplica el deployment:

kubectl apply -f nginx-deployment.yaml

Verifica los pods:

kubectl get pods

Respuesta:

NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-96b9d695-kffq4   1/1     Running   0          2m48s

🔵 Paso 2: Crear un Service ClusterIP

Este servicio será accesible solo dentro del clúster.

📄 Archivo: nginx-clusterip.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

📌 Aplica el servicio:

kubectl apply -f nginx-clusterip.yaml

🔎 Verifica:

kubectl get svc nginx-clusterip

Respuesta:

NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx-clusterip   ClusterIP   10.108.19.55   <none>        80/TCP    24s

🧪 Puedes probarlo desde dentro del clúster:

Vamos a crear un pod temporal llamado curl-test con una imagen que tenga instalado curl y que inicie en modo interactivo, el siguiente comando nos ayudara a crear el pod que luego se borrara al salir de la shell:

kubectl run curl-test --image=curlimages/curl -it --rm -- /bin/sh

Dentro del contenedor ejecutamos:

curl nginx-clusterip

Como respuesta, debemos ver el html de inicio de nginx

🟡 Paso 3: Crear un Service NodePort

Expone el servicio fuera del clúster a través de un puerto alto (ej: 30080).

📄 Archivo: nginx-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

📌 Aplica el servicio:

kubectl apply -f nginx-nodeport.yaml

Respuesta: service/nginx-nodeport created

🔎 Verifica que se ha creado correctamente:

kubectl get svc nginx-nodeport

Respuesta:

NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-nodeport   NodePort   10.105.98.208   <none>        80:30080/TCP   54s

🧪 Abre en tu navegador:

http://<IP-del-nodo>:30080

✅ Si estás en Minikube:

minikube service nginx-nodeport

Respuesta:

|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | nginx-nodeport |          80 | http://192.168.49.2:30080 |
|-----------|----------------|-------------|---------------------------|
🏃  Starting tunnel for service nginx-nodeport.
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | nginx-nodeport |             | http://127.0.0.1:51132 |
|-----------|----------------|-------------|------------------------|
🎉  Opening service default/nginx-nodeport in default browser...
❗  Because you are using a Docker driver on windows, the terminal needs to be open to run it.

Debemos ver e el navegador en inicio de nginx

🟢 Paso 4: Crear un Service LoadBalancer

Este método es ideal si estás en la nube o usando minikube tunnel.

📄 Archivo: nginx-loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

📌 Aplica el servicio:

kubectl apply -f nginx-loadbalancer.yaml

🔎 Verifica:

kubectl get svc nginx-loadbalancer

Respuesta:

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-loadbalancer   LoadBalancer   10.102.58.254   <pending>     80:31548/TCP   10s

🧪 Si estás usando Minikube, primero abre un túnel:

minikube tunnel

Luego abre: http://<EXTERNAL-IP>

✅ Limpieza (opcional)

kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-clusterip.yaml
kubectl delete -f nginx-nodeport.yaml
kubectl delete -f nginx-loadbalancer.yaml

Comentario

Debe aceptar antes de enviar