Tipos de servicios: ClusterIP, NodePort, LoadBalancer y ExternalName
Clase 10 de 24 • Curso de Kubernetes
Resumen
¿Cómo exponer aplicaciones en Kubernetes?
A la hora de trabajar con Kubernetes, uno de los retos más importantes es aprender a exponer nuestras aplicaciones al mundo exterior. Es decir, habilitar la conexión de nuestras aplicaciones desplegadas en un clúster con usuarios externos. En el ecosistema de Kubernetes, existen cuatro componentes principales que se utilizan para esta tarea: NodePort, ClusterIP, LoadBalancer y ExternalName.
¿Qué es un NodePort?
El concepto de NodePort es esencial dentro de Kubernetes. Este tipo de servicio nos permite exponer un pod en un puerto específico de cada nodo del clúster. Es notable que en escenarios más avanzados, como en el uso de MiniCube, puedes crear clústeres de múltiples nodos.
Para configurarlo, lo primero que debes hacer es definir este servicio en un archivo YAML. Un ejemplo básico incluye los siguientes elementos:
- Metadata para relacionar el servicio con un ReplicaSet, Deployment o Pod.
- El
containerPort
que el deployment utiliza (e.g., 8080). - El
nodePort
que permite conectar el tráfico externo hacia el pod.
Aquí te muestro cómo se vería un archivo de configuración:
apiVersion: v1
kind: Service
metadata:
name: hello-nodeport
spec:
selector:
app: HelloNodePort
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007
Para implementar este servicio, utiliza el comando:
kubectl apply -f deployment-nodeport.yaml
¿Para qué sirve un ClusterIP?
El servicio tipo ClusterIP es usado cuando se desea exponer aplicaciones dentro del mismo clúster. Esta funcionalidad es ideal cuando varios microservicios o aplicaciones necesitan comunicarse entre sí dentro del clúster.
La configuración es bastante parecida al NodePort, pero enfocada en la conectividad interna. Aquí, el servicio toma una dirección IP específica del rango CIDR asignado al clúster.
apiVersion: v1
kind: Service
metadata:
name: hello-cluster-ip
spec:
selector:
app: HelloClusterIP
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 8080
Para desplegar este servicio, usa:
kubectl apply -f deployment-clusterip.yaml
¿Cómo se gestiona un LoadBalancer?
Este es el servicio adecuado cuando se trabaja en entornos de nube como AWS, GCP o Azure. Al detectarse un servicio tipo LoadBalancer, el proveedor de la nube automáticamente despliega una instancia que gestionará el tráfico.
Aquí tienes un ejemplo de configuración:
apiVersion: v1
kind: Service
metadata:
name: hello-loadbalancer
spec:
selector:
app: HelloLoadBalancer
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
El comando para aplicarlo es:
kubectl apply -f deployment-loadbalancer.yaml
¿Qué es un ExternalName y cuándo usarlo?
El servicio ExternalName es muy útil para conectar Kubernetes con recursos de terceros, como bases de datos externas. A diferencia de los tipos anteriores, ExternalName no gestiona pods directos, sino que encapsula la URL del recurso externo, facilitando su uso y refactorización en grandes aplicaciones.
apiVersion: v1
kind: Service
metadata:
name: my-database-service
spec:
type: ExternalName
externalName: database.example.com
Para crear este recurso simplemente ejecuta:
kubectl apply -f externalname.yaml
Estos son los cuatro tipos fundamentales de servicios en Kubernetes para exponer aplicaciones. Cada uno tiene su caso de uso específico y ofrecen una forma distinta de gestionar el tráfico hacia y desde tus aplicaciones. Explora y decide cuál es el mejor para tus necesidades, y no dejes de compartir tu experiencia en los comentarios.