En Kubernetes, los servicios son un recurso fundamental que permite la comunicación entre diferentes componentes de una aplicación, así como con el mundo exterior. Los servicios proporcionan una abstracción sobre los pods, permitiendo el descubrimiento y la comunicación de manera estable y confiable. En esta sección, exploraremos los diferentes tipos de servicios que Kubernetes ofrece y cómo se utilizan.
Tipos de Servicios en Kubernetes
Kubernetes soporta varios tipos de servicios, cada uno diseñado para diferentes casos de uso. Los tipos de servicios más comunes son:
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- ClusterIP
ClusterIP es el tipo de servicio por defecto en Kubernetes. Este tipo de servicio expone el servicio internamente dentro del clúster, asignándole una dirección IP interna accesible solo desde dentro del clúster.
Características:
- No es accesible desde fuera del clúster.
- Utilizado para la comunicación interna entre los pods.
Ejemplo de YAML para un servicio ClusterIP:
apiVersion: v1 kind: Service metadata: name: my-clusterip-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP
- NodePort
NodePort expone el servicio en cada nodo del clúster en un puerto específico. Este tipo de servicio permite el acceso externo al clúster a través de la IP del nodo y el puerto asignado.
Características:
- Accesible desde fuera del clúster.
- Asigna un puerto en el rango 30000-32767 en cada nodo.
Ejemplo de YAML para un servicio NodePort:
apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30007 type: NodePort
- LoadBalancer
LoadBalancer crea un balanceador de carga externo que distribuye el tráfico a los pods del servicio. Este tipo de servicio es ideal para aplicaciones que necesitan ser accesibles desde fuera del clúster y requieren balanceo de carga.
Características:
- Proporciona una IP externa para el servicio.
- Utiliza el balanceador de carga del proveedor de nube (AWS, GCP, Azure, etc.).
Ejemplo de YAML para un servicio LoadBalancer:
apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
- ExternalName
ExternalName mapea un servicio a un nombre DNS externo. Este tipo de servicio no asigna una IP ni abre puertos, sino que actúa como un alias para un nombre DNS externo.
Características:
- No expone el servicio dentro del clúster.
- Utilizado para redirigir el tráfico a servicios externos.
Ejemplo de YAML para un servicio ExternalName:
apiVersion: v1 kind: Service metadata: name: my-externalname-service spec: type: ExternalName externalName: example.com
Comparación de Tipos de Servicios
Tipo de Servicio | Accesibilidad | Uso Principal | Requiere Balanceador de Carga |
---|---|---|---|
ClusterIP | Interna | Comunicación interna entre pods | No |
NodePort | Externa | Acceso externo al clúster | No |
LoadBalancer | Externa | Acceso externo con balanceo de carga | Sí |
ExternalName | Externa | Redirección a servicios externos | No |
Ejercicio Práctico
Ejercicio 1: Crear un Servicio NodePort
-
Crea un archivo YAML llamado
nodeport-service.yaml
con el siguiente contenido:apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 nodePort: 30007 type: NodePort
-
Aplica el archivo YAML para crear el servicio:
kubectl apply -f nodeport-service.yaml
-
Verifica que el servicio se ha creado correctamente:
kubectl get services
Solución del Ejercicio
Al ejecutar los comandos anteriores, deberías ver una salida similar a la siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nodeport-service NodePort 10.96.0.1 <none> 80:30007/TCP 1m
Esto indica que el servicio my-nodeport-service
ha sido creado y está accesible en el puerto 30007 de cada nodo del clúster.
Conclusión
En esta sección, hemos explorado los diferentes tipos de servicios en Kubernetes y sus usos. Entender cuándo y cómo utilizar cada tipo de servicio es crucial para diseñar aplicaciones escalables y accesibles en Kubernetes. En la próxima sección, profundizaremos en los controladores de Ingress, que proporcionan una forma más avanzada de gestionar el acceso externo a los servicios en Kubernetes.
Curso de Kubernetes
Módulo 1: Introducción a Kubernetes
- ¿Qué es Kubernetes?
- Arquitectura de Kubernetes
- Conceptos y Terminología Clave
- Configuración de un Clúster de Kubernetes
- CLI de Kubernetes (kubectl)
Módulo 2: Componentes Principales de Kubernetes
Módulo 3: Gestión de Configuración y Secretos
Módulo 4: Redes en Kubernetes
Módulo 5: Almacenamiento en Kubernetes
Módulo 6: Conceptos Avanzados de Kubernetes
Módulo 7: Monitoreo y Registro
- Monitoreo con Prometheus
- Registro con Elasticsearch, Fluentd y Kibana (EFK)
- Verificaciones de Salud y Sondas
- Servidor de Métricas
Módulo 8: Seguridad en Kubernetes
- Control de Acceso Basado en Roles (RBAC)
- Políticas de Seguridad de Pods
- Seguridad de Red
- Seguridad de Imágenes
Módulo 9: Escalado y Rendimiento
- Autoescalado Horizontal de Pods
- Autoescalado Vertical de Pods
- Autoescalado de Clúster
- Ajuste de Rendimiento
Módulo 10: Ecosistema y Herramientas de Kubernetes
Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real
- Despliegue de una Aplicación Web
- CI/CD con Kubernetes
- Ejecución de Aplicaciones con Estado
- Gestión Multi-Clúster