¿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