Tipos de Servicio en Kubernetes: Cluster IP, NodePort e Ingress
Resumen
¿Cuáles son los tipos de servicio de Kubernetes?
Kubernetes es una herramienta poderosa para la gestión de contenedores en la nube, y entender los tipos de servicios que ofrece es fundamental para optimizar la comunicación dentro de los clústeres. A continuación, exploramos los tipos principales de servicios que Kubernetes proporciona, y cuándo es mejor utilizarlos.
¿Qué es el Cluster IP?
El Cluster IP es uno de los servicios base en Kubernetes. Al utilizar Cluster IP, se asigna una dirección IP interna a un servicio, permitiendo que sea accesible solo dentro del clúster de Kubernetes. Es especialmente útil para servicios que no necesitan comunicarse con el exterior, como sucede en aplicaciones como Online Boutique, donde solo el frontend expone su servicio hacia afuera. Los servicios internos se comunican entre sí, como el inventario, moneda y checkout, usando Cluster IP.
¿Cómo funciona el NodePort?
Cuando necesitas que servicios sean accesibles desde fuera del clúster, pero no deseas crear un Load Balancer, la opción NodePort mapea un puerto en cada nodo del clúster a un servicio específico. Las peticiones que llegan a cualquier nodo pueden ser redirigidas a un pod específico mediante reglas de IP Tables configuradas por QProxy. Aunque puede ser menos eficiente que otras soluciones, es adecuado para entornos internos como una Virtual Private Cloud (VPC).
¿Por qué usar Load Balancer?
Para exponer un servicio directamente a la internet, el tipo de servicio Load Balancer es la solución más sencilla. En Google Kubernetes Engine (GKE), esto genera un balanceador de carga de Google Cloud con una IP única, permitiendo dirigir tráfico desde internet a tus servicios. Sin embargo, es importante ser consciente de los costos, ya que cada servicio expuesto con un Load Balancer incurrirá en cargos por la IP y el servicio de equilibrado.
¿Qué es y cómo se utiliza el Ingress?
El Ingress no es en sí un tipo de servicio, sino un recurso que ofrece reglas inteligentes para gestionar el tráfico. Se comporta como un router, permitiendo una entrada única al clúster y es capaz de manejar rutas basadas en encabezados, nombres de host o URLs.
¿Cómo configurar un Ingress Gateway?
Configurar un Ingress Gateway en GKE es un proceso sencillo. Primero, se define el nombre del gateway en los metadatos, lo que será crucial para pasos posteriores. Se utiliza un selector para vincular un puerto específico. El Ingress Gateway también ofrece características avanzadas como SSL y reglas de autorización. Usualmente deberás establecer un wildcard para entornos de demostración o pruebas y especificar servicios virtuales para el enrutado del tráfico.
Las Destination Rules permiten definir políticas sobre cómo se debe gestionar el tráfico hacia un servicio. Esto es útil para realizar despliegues canarios, distribuyendo tráfico entre diferentes versiones de un servicio. Las Destination Rules facilitan especificar reglas sobre cómo y cuánto tráfico debe ir a cada versión.
¿Cómo se monitorean los servicios en Kubernetes?
La observabilidad es clave en la gestión de servicios en Kubernetes. Tools como Anthor Service Mesh proporcionan consolas donde se pueden examinar:
Golden Signals: como la tasa de peticiones, errores, latencias y recursos usados (CPU, memoria, disco).
Gráficas de topología: para visualizar dónde están desplegados los servicios y cómo se interconectan.
Métricas: detalladas, mostrando peticiones por segundo, errores y latencias.
Observando estas métricas, los desarrolladores pueden realizar ajustes críticos en la escalabilidad y asegurarse que el sistema funcione eficientemente incluso ante picos de demanda.
Es fascinante ver cómo estas herramientas permiten un control minucioso y facilitan la gestión a gran escala, brindando mayor seguridad y eficiencia operacional. La invitación es a seguir explorando y experimentando para aprovechar al máximo la infraestructura que Kubernetes y sus herramientas afines ofrecen.
Cluster IP
-Asigna una IP interna al cluster para el servicio
-El servicio no es expuesto a recursos fuera del cluster
NodePort
-Genera un mapeo de cada nodo del cluster a un servicio
-Las peticiones que llegan a un nodo alcanzan los pods en el cluster por reglas de iptables (config. por kube-proxy)
-Las peticiones pueden ser enrutadas a cualquier pod
-Utilizado para exponer servicios dentro de una VPC
Load Balancer
-La manera estándar de exponer tu servicio al internet
-En GKE, genera un balanceador de carga que te da una IP única (dirigir trafico al servicio)
-Cada vez que expones un servicio, se generará una IP por servicio (se vuelve caro)
Ingress
-Actua como router inteligente que sirve como la entrada al cluster
-En GKE, el controlador de Ingress genera un balanceador de carga HTTP(S)
-Es la manera más útil de exponer múltiples servicios usando una IP única
-Más funcionalidades de caja (SSL, Routing, Auth,etc)
Istio Ingress es una característica de Istio que permite exponer servicios de una malla de servicios a Internet o a otros clústeres de Kubernetes. Istio Ingress proporciona un control centralizado sobre el tráfico entrante y saliente de los servicios, lo que facilita la implementación de funciones como el balanceo de carga, la seguridad y la supervisión.
Istio Ingress funciona mediante la creación de un gateway, que es un servidor proxy que recibe y dirige el tráfico entrante y saliente de los servicios de la malla. El gateway se configura mediante un recurso Gateway de Istio, que especifica el protocolo, el puerto y el host que se utilizarán para exponer el servicio.
Istio Ingress admite una variedad de protocolos y configuraciones de seguridad, lo que lo hace adecuado para una amplia gama de aplicaciones. Por ejemplo, Istio Ingress se puede utilizar para exponer un servicio HTTP a Internet, o para exponer un servicio TCP a otro clúster de Kubernetes.
Aquí hay algunos de los beneficios de usar Istio Ingress:
Facilidad de uso: Istio Ingress proporciona un control centralizado sobre el tráfico entrante y saliente de los servicios, lo que facilita la implementación de funciones como el balanceo de carga, la seguridad y la supervisión.
Escalabilidad: Istio Ingress se puede escalar para manejar grandes volúmenes de tráfico.
Seguridad: Istio Ingress admite una variedad de protocolos y configuraciones de seguridad, lo que lo hace adecuado para aplicaciones que requieren un alto nivel de seguridad.
Aquí hay algunos ejemplos de cómo se puede usar Istio Ingress:
Para exponer un servicio web a Internet: Istio Ingress se puede usar para exponer un servicio web a Internet, lo que permite a los usuarios acceder al servicio desde cualquier lugar.
Para exponer un servicio a otro clúster de Kubernetes: Istio Ingress se puede usar para exponer un servicio a otro clúster de Kubernetes, lo que permite a los servicios de diferentes clústeres comunicarse entre sí.
Para implementar un balanceador de carga: Istio Ingress se puede usar para implementar un balanceador de carga, lo que distribuye el tráfico entrante entre varios pods de un servicio.
Para obtener más información sobre Istio Ingress, consulte la documentación de Istio.
Para lograr un despliegue canario sin interrupciones, debes aprovechar las capacidades de una malla de servicio utilizando un recurso de configuración avanzado, como un DestinationRule. En lugar de reemplazar todos tus pods de golpe, puedes tener dos versiones de tu aplicación corriendo simultáneamente (por ejemplo, v1 y v2), ambas etiquetadas bajo el mismo servicio principal. Configurando reglas de enrutamiento, puedes indicarle al router inteligente que envíe exactamente el 95% del tráfico a la versión estable y solo un 5% a la nueva versión. Esto te permite monitorear de cerca las métricas de error y latencia de la nueva actualización con usuarios reales, pero limitando el impacto si algo sale mal. Una vez que compruebas que la nueva versión es completamente estable, simplemente ajustas los pesos en tu archivo YAML para migrar el 100% del tráfico de forma gradual y segura.
Deberías usar Cluster IP por defecto para cualquier microservicio que no necesite ser accedido directamente desde Internet. Imagina que tu aplicación es un restaurante: el frontend es el área de mesas donde interactúan los clientes, pero la cocina, la bodega y la oficina del gerente deben permanecer estrictamente privadas. Al asignar un Cluster IP a servicios críticos como bases de datos, sistemas de inventario o procesadores de pago, creas un entorno seguro donde la comunicación ocurre exclusivamente de forma interna dentro del clúster. Esto reduce drásticamente la superficie de ataque de tu infraestructura. Si un usuario malintencionado intenta acceder a tu base de datos desde el exterior, simplemente no encontrará una ruta de red válida. Utiliza este tipo de servicio como tu primera línea de defensa arquitectónica para mantener el tráfico estrictamente de pod a pod, garantizando que solo los servicios autorizados puedan comunicarse entre sí.
Es mejor optar por Ingress porque actúa como un recepcionista inteligente para tu clúster, en lugar de contratar a un guardia de seguridad exclusivo para cada puerta. Si usas el tipo de servicio LoadBalancer para cada microservicio que deseas exponer, tu proveedor de nube creará un balanceador de carga físico o virtual independiente para cada uno. Esto multiplicará tus costos de infraestructura rápidamente por cada IP pública reservada. Con un Ingress Gateway, generas un único punto de entrada (una sola IP pública y un solo balanceador de carga) que recibe todo el tráfico externo. A partir de ahí, Ingress lee las reglas de enrutamiento basadas en la URL, el hostname o los encabezados HTTP, y decide a qué servicio interno enviar la petición. Además, centraliza tareas críticas como la terminación SSL (HTTPS) y la autorización, haciendo que tu arquitectura sea mucho más económica y fácil de administrar.
Increíble 🤟
Me encantó esta clase, actualmente uso microservicios pero no entendía la parte del yaml y las etiquetas, adicional a ello había hecho un laboratorio en https://www.qwiklabs.com/ para entender los SLO, pero con esta clase lo entendí.