使用Classic ELB Balancer通过Kubernetes Ingress降低AWS成本


几个月前,我写了一篇有关Kubernetes Nginx Ingress控制器的文章,在该博客上排名第二。 它的主要主题是使用Kubernetes Ingress进行本地部署。 但是,大多数用户在AWS云中使用Kubernetes,并从其他提供商使用公共云服务。 但是,问题在于,AWS为LoadBalancer类型的每个服务创建一个新的ELB(弹性负载平衡器)。 这可能太昂贵了。 如果使用Kubernetes Ingress,则只需一个ELB。


如何运作?


为了更好地理解,我将给出一些图表。 如果没有Ingress控制器,将为提供的每种服务创建一个单独的经典ELB平衡器:



使用Ingress时,您只需要一个这样的ELB平衡器,即可将所有请求定向到集群中运行的Ingress代理:



考虑经典负载均衡器的成本:


您必须为负载均衡器Classic负载均衡器的每个完整或不完整的小时以及与其一起传输的每千兆字节数据付费。

这意味着在美国东部地区使用群集时,您将必须为所提供的每项服务支付大约18.25美元。 您还必须为每千兆字节的处理数据付费。 Ingress允许您通过大量服务来降低AWS成本。 当然,为了确保高可用性,您可以使用Ingress代理Pod的多个副本。


部署Nginx Ingress


Ingress控制器有很多选项可用,例如TraefikVoyager (对于HAProxy), Contour (对于Envoy ),甚至是Ingress AWS ALB控制器(alpha版本),与其他选项略有不同。 在本文中,我将介绍现在最常用的Ingress Nginx控制器。 与Ingress Nginx控制器上的前一篇文章不同,这次我使用Helm进行部署:


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 

注意事项 Helm存在一个问题 ,即使用set参数时,布尔值不会解析为字符串。 因此,我创建了一个带有值的文件,并且没有通过--set--set-string --set默认值。


检查炉膛入口将显示两个服务,默认情况下是控制器和服务器端:


 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 

这里应该解释一些要点。 由于所有请求都将在Ingress控制器下通过,因此希望至少有两个副本。 这实际上是一个内部代理服务器。 控制器使用默认后端来路由不存在的Ingress资源。 默认情况下,服务器端非常简单。 为了在Ingress代理日志中获取源IP地址,我使用以下两个设置激活了Nginx和ELB的代理协议:


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

代理连接协议旨在与代理服务器进行通信,而不会丢失客户端数据。


另外,您现在可以轻松获得自动DNS。 首先使用元字符(例如*.test.example.com创建DNS A记录,该记录将指向Ingress ELB控制器。 可以使用以下命令获取ELB地址:


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

然后,在使用site1.test.example.com主机创建Ingress入口点时, site1.test.example.com可以立即在浏览器中输入此行。 DNS无需其他配置即可解析名称。 将DNS记录与元字符一起使用不是一个好主意,但它可以工作。 要详细配置DNS,您可以将外部DNS用于Kubernetes。


结论


使用Ingress控制器确实有助于实现更高的自动化水平。 但是请记住,如果失败,那么所有外部端点也会失败! 在下一篇文章中,我将展示如何使用Let's Encrypt配置SSL证书的自动更新和安装。 之后,默认情况下,您可以将自动DNS与SSL端点一起使用。 关注新闻。

Source: https://habr.com/ru/post/zh-CN423809/


All Articles