Estoy bastante confundido acerca de los roles de Ingress y Load Balancer en Kubernetes.
Según tengo entendido, Ingress se usa para asignar el tráfico entrante de Internet a los servicios que se ejecutan en el clúster.
La función del equilibrador de carga es reenviar el tráfico a un host. En ese sentido, ¿cómo difiere el ingreso del balanceador de carga? Además, ¿cuál es el concepto de equilibrador de carga dentro de kubernetes en comparación con Amazon ELB y ALB?
kubernetes
load-balancing
arunkjn
fuente
fuente
Respuestas:
Balanceador de carga: un servicio de Kubernetes LoadBalancer es un servicio que apunta a equilibradores de carga externos que NO están en su clúster de kubernetes, pero existen en otros lugares. Pueden trabajar con sus pods, suponiendo que sus pods sean enrutables externamente. Google y AWS proporcionan esta capacidad de forma nativa. En términos de Amazon, este mapa directamente con ELB y kubernetes cuando se ejecuta en AWS puede aprovisionar y configurar automáticamente una instancia de ELB para cada servicio LoadBalancer implementado.
Ingreso: Una entrada es realmente solo un conjunto de reglas para pasar a un controlador que las está escuchando. Puede implementar un montón de reglas de ingreso, pero no pasará nada a menos que tenga un controlador que pueda procesarlas. Un servicio LoadBalancer podría escuchar las reglas de ingreso, si está configurado para hacerlo.
También puede crear un servicio NodePort , que tiene una IP enrutable externamente fuera del clúster, pero apunta a un pod que existe dentro de su clúster. Esto podría ser un controlador de entrada.
Un controlador de ingreso es simplemente un pod que está configurado para interpretar las reglas de ingreso. Uno de los controladores de ingreso más populares soportados por kubernetes es nginx. En términos de Amazon, ALB puede usarse como un controlador de ingreso.
Por ejemplo, este controlador nginx puede ingerir las reglas de ingreso que ha definido y traducirlas a un archivo nginx.conf que carga y comienza en su pod.
Digamos, por ejemplo, que definió un ingreso de la siguiente manera:
Si luego inspecciona su dispositivo controlador nginx, verá la siguiente regla definida en
/etc/nginx.conf
:Nginx acaba de crear una regla para enrutar
http://kubernetes.foo.bar/app
para apuntar al servicioappsvc
en su clúster.Aquí hay un ejemplo de cómo implementar un clúster de kubernetes con un controlador de ingreso nginx. ¡Espero que esto ayude!
fuente
Encontré este artículo muy interesante que explica las diferencias entre NodePort, LoadBalancer e Ingress.
Del contenido presente en el artículo:
LoadBalancer:
Ingreso:
fuente
TL: DR
Comencemos con un caso de uso práctico: tiene múltiples Apis respaldados por paquetes de implementación de servicios (ASIP para mayor claridad y brevedad) para implementar bajo un solo nombre de dominio. Como es un desarrollador de vanguardia, implementó una arquitectura de microservicios que requiere implementaciones separadas para cada ASIP para que puedan actualizarse o escalarse individualmente. Por supuesto, estos ASIP están encapsulados en un contenedor acoplable individual y están disponibles para Kubernetes (K8) desde el repositorio del contenedor.
Digamos ahora que desea implementar esto en los GKE K8 de Google. Para implementar una disponibilidad sostenida, cada instancia de ASIP (réplica) se implementa en diferentes nodos (VM) donde cada VM tiene su propia dirección IP interna en la nube. Cada implementación de ASIP se configura en un archivo apropiado llamado "implement.yaml" en el que se especifica, entre otras cosas, la cantidad de réplicas de los AS8 K8 dados que se deben implementar.
El siguiente paso es exponer la API al mundo exterior y canalizar solicitudes a una de las instancias ASIP implementadas. Como tenemos muchas réplicas del mismo ASIP ejecutándose en diferentes nodos, necesitamos algo que distribuya la solicitud entre esas réplicas. Para resolver esto, podemos crear y aplicar un archivo "service.yaml" que configurará un servicio K8s (KServ) que estará expuesto externamente y será accesible a través de una dirección IP. Este KServ se encargará de la distribución de solicitudes de la API entre sus ASIP configurados. Tenga en cuenta que un KServ será reconfigurado automáticamente por el maestro K8s cuando un nodo de ASIP falla y se reinicia. La dirección IP interna nunca se reutiliza en tal caso y se debe informar al KServ de la ubicación de implementación del nuevo ASIP.
Pero tenemos otros paquetes de servicio Api que se expondrán en el mismo nombre de dominio. Girar un nuevo KServ creará una nueva dirección IP externa y no podremos exponerla en el mismo nombre de dominio. Bueno, aquí es donde entra Ingress.
El ingreso se encuentra entre Internet y todos los KServices a los que exponemos en el mundo exterior. Ingress es capaz de proporcionar equilibrio de carga, terminación SSL y alojamiento virtual basado en nombres. La última capacidad es capaz de enrutar una solicitud entrante al servicio correcto mediante el análisis de su URL. Por supuesto, Ingress debe configurarse y aplicarse con un archivo ... "ingress.yaml" que especificará las reescrituras y las rutas necesarias para enviar una solicitud al KServ correcto.
Internet -> Ingress -> Servicios K8s -> Réplicas
Entonces, con la entrada correcta, la configuración de KServices y ASIP, podemos exponer de forma segura muchas API que usan el mismo nombre de dominio.
fuente
Hay 4 formas de permitir que los pods en su clúster reciban tráfico externo:
1.) Pod usando HostNetworking: verdadero y (Permite que 1 pod por nodo escuche directamente los puertos en el nodo host. Minikube, metal desnudo y rasberry pi a veces funcionan Esta ruta, que puede permitir que el nodo host escuche en el puerto 80/443, permite no usar un equilibrador de carga o configuraciones avanzadas de equilibrador de carga en la nube, también omite los servicios de Kubernetes que pueden ser útiles para evitar SNAT / lograr un efecto similar de externalTrafficPolicy: Local en escenarios donde no es compatible como en AWS.)
2.) Servicio NodePort
3.) Servicio LoadBalancer (que se basa en el Servicio NodePort)
4.) Controlador de entrada + Objetos de entrada (que se basa en lo anterior)
Supongamos que tiene 10 sitios web alojados en su clúster y desea exponerlos a todos al tráfico externo.
* Si usa el tipo de servicio LoadBalancer, generará 10 equilibradores de carga de la nube de HA (cada uno cuesta dinero)
* Si usa el controlador de tipo de ingreso generará 1 equilibrador de carga de la nube de HA (ahorrará dinero), y apuntará a un ingreso Controlador ejecutándose en su clúster.
Un controlador de ingreso es:
(los objetos de Ingress pueden considerarse fragmentos de configuración declarativos de un equilibrador de carga de capa 7).
El L7 LB / Ingress Controller dentro de su clúster Balanzas de carga / tráfico de proxy inverso a los Servicios IP del clúster dentro de su Clúster, también puede terminar HTTPS si tiene un Kubernetes Secret de tipo TLS cert y un objeto Ingress que lo hace referencia).
fuente
Ingress: Ingress Object + Ingress Controller
Objeto de entrada:
Al igual que un objeto de servicio, excepto que no hace nada por sí solo. Un objeto de ingreso solo describe una forma de enrutar el tráfico de la capa 7 a su clúster, especificando cosas como la ruta de solicitud, el dominio de solicitud y el servicio kubernetes de destino, mientras que un objeto de servicio realmente crea servicios
Controlador de entrada:
Un servicio que:
Por ejemplo, el controlador de ingreso Nginx, podría usar un servicio para escuchar en los puertos 80 y 443 y luego leer nuevos objetos de ingreso y analizarlos en nuevas secciones del servidor {} que coloca dinámicamente en su nginx.conf
LoadBalancer: proveedor de equilibrador de carga externo + tipo de servicio
Proveedor externo de equilibrador de carga:
Los proveedores de equilibradores de carga externos generalmente se configuran en nubes como AWS y GKE y proporcionan una forma de asignar IP externas a través de la creación de equilibradores de carga externos. Esta funcionalidad se puede utilizar designando un servicio como tipo "LoadBalancer".
Tipo de servicio:
Cuando el tipo de servicio se establece en LoadBalancer, Kubernetes intenta crear y luego programar un equilibrador de carga externo con entradas para los pods de Kubernetes, asignándoles así direcciones IP externas.
El controlador de servicio de Kubernetes automatiza la creación del equilibrador de carga externo, las comprobaciones de estado (si es necesario), las reglas de firewall (si es necesario) y recupera la IP externa del LoadBalancer recién creado o configurado que fue asignado por el proveedor de la nube y lo completa en el objeto de servicio
Relaciones:
Los servicios de Ingress Controller a menudo se aprovisionan como el tipo LoadBalancer, de modo que las solicitudes http y https se pueden enviar / enrutar a servicios internos específicos a través de una IP externa.
Sin embargo, un LoadBalancer no es estrictamente necesario para esto. Dado que, mediante el uso de hostNetwork o hostPort, técnicamente puede vincular un puerto en el host a un servicio (lo que le permite visitarlo a través de la IP externa: puerto de los hosts). Aunque oficialmente esto no se recomienda, ya que utiliza puertos en el nodo real.
Referencias
https://kubernetes.io/docs/concepts/configuration/overview/#services
https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/
https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#external-load-balancer-providers
https://kubernetes.io/docs/concepts/services-networking/ingress/
fuente
En palabras simples, el equilibrador de carga distribuye las solicitudes entre múltiples servicios de back-end (del mismo tipo), mientras que la entrada es más como una puerta de enlace API (proxy inverso) que enruta la solicitud a un servicio de back-end específico basado, por ejemplo, en la URL.
fuente