想实现高可用?先搞定负载均衡原理

2023-01-05 10:00

Kubernetes 入口是一种包含一组路由规则的 API 对象,用于规范外部/内部用户访问在集群中运行的 Kubernetes 服务的方式。入口控制器负责读取入口资源信息并进行恰当的处理。由于不同的入口控制器都可完成此作业,根据进入 Kubernetes 集群的流量和负载类型选择正确的入口控制器十分重要。


在本文中,我们将讨论如何在 Amazon EKS 上使用 NGINX 入口控制器,以及如何在它前面设置内部网络负载均衡器 (NLB)。


什么是网络负载均衡器?


Amazon NLB在开放系统互联 (OSI) 模型的第四层发挥作用。它每秒可以处理数百万个请求。在负载均衡器收到连接请求后,它会从默认规则的目标组中选择一个目标。它会尝试在侦听器配置中指定端口为选定的目标打开一个 TCP 连接。

暴露在 Kubernetes 上的应用程序


Amazon NLB在开放系统互联 (OSI) 模型的第四层发挥作用。它每秒可以处理数百万个请求。在负载均衡器收到连接请求后,它会从默认规则的目标组中选择一个目标。它会尝试在侦听器配置中指定端口为选定的目标打开一个 TCP 连接。


本文将通过一个例子来介绍如何使用入口资源并在它前面设置 Internal NLB(内部网络负载均衡器)。

上图演示了一个网络负载均衡器位于入口资源前的场景。此负载均衡器将流量路由到您的集群上的某个 Kubernetes 服务(或入口),然后该服务将执行服务特定的路由。带有入口定义的 NLB 兼具 NLB 和入口资源的优点。


如何将网络负载均衡器用于 Kubernetes 中的 NGINX 入口资源

1.首先为集群的 NGINX 入口创建强制资源:

  • wget

  • https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml


注释掉官方默认创建的的ingress-nginx-controller的SVC:

kubectl apply -f deploy.yaml


2.为入口控制器创建 内部NLB:kubectl apply -f nlb-service.yaml nlb-service.yaml内容如下图所示:


3.然后创建两个服务(apple.yaml 和 banana.yaml)以演示该入口将如何路由我们的请求。 我们将运行两个 Web 应用程序,每个应用程序将都输出一个略微不同的应答。下面的每个文件都含有一个服务定义和一个 Pod 定义。

创建资源:

  • kubectl apply -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/apple.yaml

  • kubectl apply -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/banana.yaml

4.定义入口资源以将流量路由至上面创建的服务

现在声明一个入口以将对 /apple 的请求路由到第一个服务,将对 /banana 的请求路由到第二个服务。检查入口的 rules 字段,该字段将声明转交请求的方式:

部署ingress:

  • kubectl   apply -f ingress-example.yaml


kubectl   apply -f ingress-example.yaml


至此可以看到部署的ingress已成功绑定所创建的NLB:


5.设置 Route 53 以将您的域名指向该内部NLB:


6.在集群内部测试访问应用程序:

至此,我们可以看到通过请求不同的路径能转发到不同的服务。


注意:

启用客户端 IP 保留的负载均衡器不支持发夹或环回。如果实例是其注册的负载均衡器的客户端,并且启用了客户端 IP 保留,则仅当请求被路由到不同的实例时,连接才会成功。否则,当源IP地址和目的IP地址相同,连接超时。


解决方法:

需要禁用客户端 IP 保留。


云与应用现代化
——
扫描关注微信公众号
获取更多云端资讯
联系我们
——

模板表单-2(1)

  • 姓名*

  • 电话*

  • 邮箱*

  • 公司*

  • 职称*

  • 地址*

  • 需求*