Reduzca los costos de AWS con Kubernetes Ingress con Classic ELB Balancer


Hace unos meses escribí un artículo sobre el controlador Kubernetes Nginx Ingress , que ocupa el segundo lugar en popularidad en este blog. Su tema principal es el uso de Kubernetes Ingress para implementaciones locales. Sin embargo, la mayoría de los usuarios usan Kubernetes en la nube de AWS y servicios de nube pública de otros proveedores. Sin embargo, el problema es que AWS crea un nuevo ELB (Elastic Load Balancer) para cada servicio de tipo LoadBalancer. Esto puede ser un regalo demasiado caro. Si usa el Kubernetes Ingress, solo necesitará un ELB.


Como funciona


Para una mejor comprensión, daré algunos diagramas. Sin un controlador Ingress, se creará un equilibrador ELB clásico separado para cada servicio proporcionado:



Al usar Ingress, solo necesitará uno de esos equilibradores de ELB, que dirige todas las solicitudes a los proxys de Ingress que se ejecutan en el clúster:



Considere el costo del Classic Load Balancer:


Debe pagar por cada hora completa o incompleta del equilibrador de carga Classic Load Balancer y por cada gigabyte de datos transferidos con él.

Esto significa que cuando use un clúster en la región este de los EE. UU., Deberá pagar aproximadamente $ 18.25 por cada servicio brindado. También debe pagar por cada gigabyte de datos procesados. Ingress le permite reducir los costos de AWS con una gran cantidad de servicios. Por supuesto, para garantizar una alta disponibilidad, puede usar varias réplicas del pod de proxy Ingress.


Implementar Nginx Ingress


Hay una gran cantidad de opciones disponibles para el controlador Ingress, por ejemplo, Traefik , Voyager (para HAProxy), Contour (para Envoy ) o incluso el controlador Ingress AWS ALB (versión alfa), que es ligeramente diferente del resto. En esta publicación, miro el controlador Ingress Nginx , ahora el más común. A diferencia del artículo anterior sobre el controlador Ingress Nginx , esta vez uso Helm para la implementación:


cat > values.yaml <<EOF controller: replicaCount: 2 config: use-proxy-protocol: "true" service: annotations: service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*' EOF helm install --name ingress \ --namespace ingress \ -f values.yaml \ stable/nginx-ingress 

Nota Hay un problema con Helm que los booleanos no se analizan como cadenas cuando se usa el argumento set. Por lo tanto, creé un archivo con valores y no --set valores predeterminados a través de --set y --set-string .


Al verificar el ingreso del hogar, se muestran dos servicios, el controlador y el lado del servidor de manera predeterminada:


 kubectl get pod -n ingress --selector=app=nginx-ingress NAME READY STATUS RESTARTS AGE ingress-nginx-ingress-controller-8689c87db7-jlwxv 1/1 Running 0 5m ingress-nginx-ingress-controller-8689c87db7-kv859 1/1 Running 0 5m ingress-nginx-ingress-default-backend-5f5888cc9b-jdjrp 1/1 Running 0 5m 

Algunos puntos deben explicarse aquí. Como todas las solicitudes se procesarán bajo el controlador Ingress, es deseable tener al menos dos de sus réplicas. Esto es esencialmente un servidor proxy interno. El controlador utiliza el back-end predeterminado para enrutar recursos de Ingreso inexistentes. El lado del servidor es bastante simple por defecto. Para obtener las direcciones IP de origen en el registro de proxy de Ingress, activé el protocolo proxy para Nginx y ELB usando las siguientes dos configuraciones:


 --set controller.service.annotations."service\\.beta\\.kubernetes\\.io/aws-load-balancer-proxy-protocol"='*' \ --set-string controller.config.use-proxy-protocol=true \ 

El protocolo de conexión proxy está diseñado para comunicar servidores proxy sin perder datos del cliente.


Y como beneficio adicional, ahora puede obtener fácilmente DNS automático. Primero cree un registro DNS A utilizando metacaracteres, como *.test.example.com , que apuntará al controlador Ingress ELB. La dirección ELB se puede obtener con este comando:


 kubectl get svc ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' -n ingress a00950ebcfd0411e740ee0207cf10ce8-1089949860.eu-west-1.elb.amazonaws.com 

Luego, al crear el punto de entrada Ingress con el host site1.test.example.com , puede ingresar inmediatamente esta línea en el navegador. DNS resolverá el nombre sin configuración adicional. Usar un registro DNS con metacaracteres no es una buena idea, pero funciona. Para configurar DNS en detalle, puede usar DNS externo para Kubernetes.


Conclusión


El uso del controlador Ingress realmente ayuda a lograr un mayor nivel de automatización. ¡Pero recuerde que si falla, todos sus puntos finales externos también fallarán! En el siguiente artículo, mostraré cómo configurar la actualización automática y la instalación de certificados SSL usando Let's Encrypt. Después de eso, puede usar DNS automático con puntos finales SSL de forma predeterminada. Sigue las noticias.

Source: https://habr.com/ru/post/es423809/


All Articles