Un controlador Ingress es un componente fundamental en Kubernetes que actúa como un proxy inverso, proporcionando enrutamiento de tráfico configurable y terminación TLS para los servicios expuestos dentro del clúster. Los recursos Ingress de Kubernetes se utilizan para definir las reglas de entrada y las rutas para dirigir el tráfico a los distintos servicios que se ejecutan en el clúster.
¿Qué es Ingress en Kubernetes?
En Kubernetes, el término "Ingress" se refiere al flujo de tráfico de red entrante hacia un entorno de aplicaciones contenerizadas nativas de la nube. Más específicamente, Ingress es un objeto API de Kubernetes que define un conjunto de reglas y configuraciones para gestionar cómo se enruta el tráfico externo a los servicios dentro del clúster.
En lugar de exponer servicios individuales directamente a Internet (por ejemplo, mediante NodePort o LoadBalancer), Ingress crea una capa de acceso controlado que enruta de forma inteligente las solicitudes basándose en varios criterios, como nombres de host y rutas.
Componentes Clave
- Recurso Ingress: Define las reglas de enrutamiento del tráfico.
- Controlador Ingress: Implementa las reglas definidas en el recurso Ingress.
Los controladores Ingress monitorizan continuamente la API de Kubernetes en busca de cambios en los recursos Ingress en todos los espacios de nombres.
Funcionalidades Clave de un Controlador Ingress
- Proxy Inverso: Actúa como intermediario entre los clientes externos y los servicios internos.
- Enrutamiento de Tráfico: Dirige el tráfico a los servicios correctos basándose en reglas configurables.
- Terminación TLS: Descifra el tráfico HTTPS, liberando a los servicios internos de esta tarea.
- Balanceo de Carga: Distribuye el tráfico entre múltiples instancias de un servicio.
Beneficios de Utilizar un Controlador Ingress
- Consolidación de la Infraestructura: Permite consolidar varias aplicaciones detrás de una infraestructura compartida, reduciendo los costos de equilibrio de carga y mejorando la utilización de los recursos.
- Ciclos de Desarrollo Acelerados: Los equipos de desarrollo pueden implementar y probar nuevas características sin involucrar a los administradores de red ni configurar equilibradores de carga externos.
- Observabilidad Mejorada: Proporciona análisis detallados sobre los patrones de uso de la aplicación, el comportamiento de los usuarios y los cuellos de botella en el rendimiento.
- Aplicación Automatizada de la Seguridad: Permite aplicar la autenticación, la autorización, la limitación de velocidad, las reglas WAF (firewall de aplicaciones web) y la protección contra DDoS a través de las políticas del controlador Ingress.
- Portabilidad de la Nube: Proporciona una funcionalidad coherente en diferentes proveedores de servicios en la nube y en on-premises.
- Capacidades de Escalado Dinámico: Puede ajustar automáticamente los patrones de enrutamiento en función de las condiciones del tráfico en tiempo real, la capacidad del backend y las políticas configuradas.
- Enrutamiento Inteligente: Los controladores Ingress de Kubernetes examinan las solicitudes entrantes y toman decisiones de enrutamiento basadas en reglas predefinidas, como nombres de host y nombres DNS.
- Reducción de Costos: Al consolidar la infraestructura, se reducen los costos operativos y de hardware.
- Seguridad Mejorada: Permite la aplicación centralizada de políticas de seguridad.
- Flexibilidad: Permite la creación de entornos separados para probar nuevas características.
- Compartir APIs Internas: Facilita el compartir de forma segura las API internas con partners y proveedores.
- Cumplimiento Normativo: Permite implementar las políticas necesarias de información de registro, control de acceso y gobierno de datos.
Implementación de un Controlador Ingress NGINX en AKS
Este artículo muestra cómo implementar el controlador de entrada NGINX en un clúster de Azure Kubernetes Service (AKS), utilizando Helm 3 para la instalación. Se asume que ya se tiene un clúster de AKS con Azure Container Registry (ACR) integrado.
Lea también: Nutrición canina específica
Prerrequisitos
- Un clúster de AKS con ACR integrado.
- Helm 3 instalado y configurado.
- CLI de Azure versión 2.0.64 o posterior, o Azure PowerShell versión 5.9.0 o posterior.
Instalación Básica
Para crear un controlador de entrada NGINX básico sin personalizar los valores predeterminados, se utiliza Helm. La siguiente configuración usa la configuración predeterminada para simplificar:
helm install ingress-nginx ingress-nginx/ingress-nginxSi se desea habilitar la conservación de direcciones IP de origen del cliente, se puede agregar el siguiente parámetro al comando de instalación:
helm install ingress-nginx ingress-nginx/ingress-nginx --set controller.service.externalTrafficPolicy=LocalLa dirección IP de origen del cliente se almacena en el encabezado de la solicitud en X-Forwarded-For.
Instalación Personalizada
Para una instalación más personalizada, se pueden seguir los siguientes pasos:
Crear un espacio de nombres:
Lea también: Elige tu Tinte Ideal
kubectl create namespace ingress-basicInstalar el controlador Ingress con Helm:
helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-basic \ --set controller.replicaCount=2 \ --set controller.nodeSelector."kubernetes\.io/os"=linux \ --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linuxEste comando crea un espacio de nombres de Kubernetes para los recursos de entrada denominado
ingress-basicy está diseñado para funcionar en ese espacio de nombres. Se implementan dos réplicas de los controladores de entrada NGINX con el parámetro--set controller.replicaCount. El controlador de entrada se debe programar en un nodo con Linux. Los nodos de Windows Server no deben ejecutar el controlador de entrada.(Opcional) Asignar una dirección IP interna:
helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-basic \ --set controller.service.loadBalancerIP=<YOUR_INTERNAL_IP_ADDRESS> \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=trueSe deben usar los parámetros
--set controller.service.loadBalancerIPy--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=truepara asignar una dirección IP interna al controlador de entrada. Se necesita proporcionar una dirección IP interna que no esté en uso dentro de la red virtual.
Implementación de Aplicaciones de Demostración
Para verificar el funcionamiento del controlador Ingress, se pueden implementar dos aplicaciones de demostración en el clúster de AKS:
Lea también: Explorando CDB
# aks-helloworld-one.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: aks-helloworld-onespec: replicas: 1 selector: matchLabels: app: aks-helloworld-one template: metadata: labels: app: aks-helloworld-one spec: containers: - name: aks-helloworld-one image: mcr.microsoft.com/azuredocs/aks-helloworld:v1 ports: - containerPort: 8080 env: - name: TITLE value: "Welcome to Hello World one!"---apiVersion: v1kind: Servicemetadata: name: aks-helloworld-onespec: type: ClusterIP ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: aks-helloworld-one# aks-helloworld-two.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: aks-helloworld-twospec: replicas: 1 selector: matchLabels: app: aks-helloworld-two template: metadata: labels: app: aks-helloworld-two spec: containers: - name: aks-helloworld-two image: mcr.microsoft.com/azuredocs/aks-helloworld:v1 ports: - containerPort: 8080 env: - name: TITLE value: "Hello World two - App Two!"---apiVersion: v1kind: Servicemetadata: name: aks-helloworld-twospec: type: ClusterIP ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: aks-helloworld-twoAplicar los manifiestos:
kubectl apply -f aks-helloworld-one.yaml -n ingress-basickubectl apply -f aks-helloworld-two.yaml -n ingress-basicConfiguración del Recurso Ingress
Para enrutar el tráfico a cada aplicación, se crea un recurso Ingress de Kubernetes:
# ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: hello-world-ingress namespace: ingress-basic annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - http: paths: - path: /hello-world-one pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80 - path: /hello-world-two pathType: Prefix backend: service: name: aks-helloworld-two port: number: 80Aplicar el manifiesto Ingress:
kubectl apply -f ingress.yaml -n ingress-basicEn este ejemplo, el tráfico a la dirección EXTERNAL_IP/hello-world-one se enruta al servicio denominado aks-helloworld-one. El tráfico a la dirección EXTERNAL_IP/hello-world-two se enruta al servicio aks-helloworld-two.
Prueba del Controlador Ingress
Para probar las rutas para el controlador de entrada, se puede acceder a las dos aplicaciones a través de un navegador web. Se debe abrir un navegador web en la dirección IP del controlador de entrada NGINX, como EXTERNAL_IP. A continuación, agregar la ruta de acceso /hello-world-two a la dirección IP, como EXTERNAL_IP/hello-world-two.
Eliminación de Recursos
Para eliminar el espacio de nombres de ejemplo completo, se utiliza el comando kubectl delete y se especifica el nombre del espacio de nombres:
kubectl delete namespace ingress-basicAlternativas a NGINX Ingress Controller
Además de NGINX Ingress Controller, existen otras opciones populares:
- Traefik Ingress Controller: Diseñado para entornos modernos nativos de la nube, con un énfasis en la detección automática de servicios y la facilidad de uso.
- HAProxy Ingress Controller: Proporciona un rendimiento robusto para escenarios de alto tráfico.
- Istio Gateway: Ofrece características avanzadas de gestión de tráfico, seguridad y observabilidad.
- AWS Load Balancer Controller, Google Cloud Load Balancer, Azure Application Gateway Ingress Controller: Controladores ofrecidos por proveedores de servicios en la nube que se integran con sus plataformas.
- Ambassador y Emissary-Ingress: Controladores basados en el proxy Envoy que ofrecen una gestión del tráfico de alto rendimiento.
- YARP (Yet Another Reverse Proxy): Se puede integrar con Kubernetes como proxy inverso que administra la entrada de tráfico HTTP/HTTPS a un clúster de Kubernetes. Requiere compilación e implementación manual.
Consideraciones Adicionales
- Rendimiento: El tráfico externo fluye a través de los controladores Ingress, lo que los convierte en potenciales cuellos de botella en entornos de producción.
- Seguridad: Es crucial configurar correctamente las políticas de seguridad en el controlador Ingress.
- Monitoreo: Implementar un monitoreo adecuado para garantizar la disponibilidad y el rendimiento del controlador Ingress.
- Actualizaciones: Mantener el controlador Ingress actualizado con las últimas versiones para corregir vulnerabilidades y obtener nuevas características.
tags: #ingress #controller #kubernetes #tutorial #español
