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 保留。
