阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

将网络负载均衡器与 Amazon EKS 上的 NGINX 入口控制器配合使用

  • 2019-09-19
  • 本文字数:4428 字

    阅读完需:约 15 分钟

将网络负载均衡器与 Amazon EKS 上的 NGINX 入口控制器配合使用

Kubernetes 入口是一种包含一组路由规则的 API 对象,用于规范外部/内部用户访问在集群中运行的 Kubernetes 服务的方式。入口控制器负责读取入口资源信息并进行恰当的处理。由于不同的入口控制器都可完成此作业,根据进入 Kubernetes 集群的流量和负载类型选择正确的入口控制器十分重要。在本文中,我们将讨论如何在 Amazon EKS 上使用 NGINX 入口控制器,以及如何在它前面设置网络负载均衡器 (NLB)。

什么是网络负载均衡器?

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

暴露您在 Kubernetes 上的应用程序

在 Kubernetes 中,可以通过多种方式来暴露您的应用程序;其中一种方式是使用入口来暴露您的服务。入口不是一种服务类型,而是您的集群的进入点。它允许您将路由规则整合到一个资源中,因为它可以在一个 IP 地址下暴露多个服务。


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

Kubernetes 中的入口


此图演示了流量从外部世界触及入口资源,然后根据入口资源中设置的路径规则分流至要求的 Kubernetes 服务的流程。


Kubernetes 支持一种称为入口的高级别抽象,它基于主机或 URL 的简单 HTTP 路由。入口是 Kubernetes(属于测试版)的一个核心概念。它始终通过第三方代理来实现;这些实现被称为入口控制器。入口控制器负责读取入口资源信息并相应处理数据。不同的入口控制器以不同的方式扩展了规范,从而支持更多的使用案例。


一般来说,您的 Kubernetes 服务会对您的入口实施额外的要求。这方面的例子包括:


  • 基于内容的路由:例如基于 HTTP 方法的路由、请求标头或者特定请求的其他属性。

  • 弹性:例如速率限制、超时。

  • 多协议支持:例如 WebSockets 或 gRPC。

  • 身份验证。

  • 入口控制器是一种作为 Kubernetes Pod 部署的守护程序或部署包,负责观察 API 服务器的终端节点,从而检查对入口资源的更新。其任务是满足对入口的请求。NGINX 入口就是这样的一种实现。本文将该入口控制器作为使用默认值的部署包实现。为满足您的使用案例要求并提高可用性,您可以将它作为守护程序使用或增加副本的数量。

为什么要选择 NGINX 入口控制器而不是 Application Load Balancer (ALB) 入口控制器?

ALB 入口控制器非常优秀,但也有一些使用案例更适合将 NLB 与 NGINX 入口控制器配合使用。我将后文中讨论您需要 NLB 而不是 ALB 的场景,但首先让我们来看入口控制器。


默认情况下,NGINX 入口控制器将会侦听来自所有命名空间的入口事件,并向 NGINX 配置文件添加对应的指令和规则。这样就可以使用一个包含所有入口规则、主机和路径的集中路由文件。


使用 NGINX 入口控制器时,多个环境或多个命名空间的多个入口对象可以使用同一个网络负载均衡器;而如果使用 ALB,每个入口对象都需要一个新的负载均衡器。


此外,使用 NGINX 入口控制器时,基于路径的路由等功能也可以添加到 NLB 中。

为什么需要在入口前使用负载均衡器?

入口在 Kubernetes 中紧密集成,这意味着有关 kubectl 的现有工作流可以轻松扩展管理入口。由于入口控制器一般不会消除对外部负载均衡器的需要,它直接在负载均衡器后增加了一个路由和控制层。


Pod 和节点不保证能在用户期望的整个期限内存续:有时,Pod 非常短暂,容易受到来自 Kubernetes 的终止信号影响,例如:


  • 扩展。

  • 内存或 CPU 饱和。

  • 为了提高资源使用效率而重新调度。

  • 外部因素导致的停机。

  • 负载均衡器(Kubernetes 服务)是一种单一的固定服务终端节点,面向给定的 Pod 集或工作线程节点集。为发挥上述网络负载均衡器 (NLB) 的优点,我们创建了一个带有 NLB 注释的 Kubernetes 服务 (type:loadbalancer),并且此负载均衡器位于入口控制器前面,而此入口控制器本身又是一个 Pod 或 Pod 集。在 AWS,对于由 Autoscaling 组管理的 EC2 计算实例集,应当有一个负载均衡器充当固定可引用地址和负载均衡机制。

带有负载均衡器的入口


此图演示了流量从外部世界触及网络负载均衡器,然后再触及入口资源,然后根据入口资源中设置的路径规则分流至要求的 Kubernetes 服务的流程。


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

与 Application Load Balancer (ALB) 相比,NLB 有哪些优势?

网络负载均衡器每秒能够处理数百万个请求,同时保持极低的延迟,因此非常适合 TCP 流量的负载均衡。NLB 专为处理突增和波动流量模式而优化,同时每个可用区使用单个静态 IP 地址。使用 NLB 的优势包括:


  • 静态 IP/弹性 IP 地址:对于您在 NLB 上启用的每个可用区 Zone (AZ),您都有一个网络接口。 可用区内的每个负载均衡器节点均使用该网络接口来获取静态 IP 地址。 您也可以使用弹性 IP,从而为每个可用区分配一个固定 IP 地址。

  • 可扩展性:能够处理波动的工作负载,可扩展至每秒处理数百万个请求。

  • 可用区隔离:网络负载均衡器可以用于单区内的应用程序架构。网络负载均衡器会尝试将来自特定源的一系列请求路由到位于单个可用区的目标,同时仍可在目标不可用时自动进行故障转移。

  • 源/远程地址保护:使用网络负载均衡器后,传入连接的原始源 IP 地址和源端口保持不变。如果使用 Classic Load Balancer 和 Application Load Balancer,我们必须使用 HTTP 标头 X-Forwarded-For 来获取远程 IP 地址。

  • 长期性 TCP 连接:网络负载均衡器支持可以开放数月甚至数年的长期性 TCP 连接,非常适合 WebSocket 类型的应用程序、物联网、游戏和消息首发应用程序。

  • 减少带宽使用量:大多数应用程序都依赖带宽,成本(负载均衡)将比 Application Load Balancer 或 Classic Load Balancer 降低大约 25%。

  • SSL 终止:SSL 终止需要在后端进行,因为适用于 Kubernetes 的 NLB 尚未提供 SSL 终止功能。

  • 对于任何使用 NLB 的场景,后端安全组将会控制对应用程序的访问权限(NLB 本身没有安全组)。工作线程节点安全组负责处理入站/出战流量的安全。

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

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


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
复制代码


为入口控制器创建 NLB:


kubectl apply -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/nlb-service.yaml
复制代码


然后创建两个服务(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
复制代码

定义入口资源(带有 SSL 终止)以将流量路由至上面创建的服务

如果您为您的服务器购买并配置了自定义域名,则可以使用该证书,否则您仍可以将 SSL 与自我签名的证书配合使用,以进行开发和测试。


在此例中,我们将在后端终止 SSL,并创建了一个自我签名的证书。


每次我们提到 TLS 密钥时,我们是指采用 PEM 编码的 X.509、RSA (2048) 密钥。现在使用以下命令生成自我签名的证书和私有密钥:


openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyouttls.key -out tls.crt -subj "/CN=anthonycornell.com/O=anthonycornell.com"
复制代码


然后在集群中创建密钥:


kubectl create secret tls tls-secret --key tls.key --cert tls.crt
复制代码


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


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: example-ingress  annotations:    nginx.ingress.kubernetes.io/ssl-redirect: "false"    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"    nginx.ingress.kubernetes.io/rewrite-target: /spec:  tls:  - hosts:    - anthonycornell.com    secretName: tls-secret  rules:  - host: anthonycornell.com    http:      paths:        - path: /apple          backend:            serviceName: apple-service            servicePort: 5678        - path: /banana          backend:            serviceName: banana-service            servicePort: 5678
复制代码


在集群中创建入口:


kubectl create -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/example-ingress.yaml
复制代码


设置 Route 53 以将您的域指向该 NLB(可选):


anthonycornell.com.           A.    ALIAS abf3d14967d6511e9903d12aa583c79b-e3b2965682e9fbde.elb.us-east-1.amazonaws.com 
复制代码


测试您的应用程序:


curl  https://anthonycornell.com/banana -kBanana curl  https://anthonycornell.com/apple -kApple
复制代码


能否将 NLB 重复用于在不同命名空间中运行的服务? 还是只能在同一命名空间中使用?


按照上文的解释安装 NGINX 入口控制器。 在您的每个命名空间中定义一个入口资源。


test 示例:


apiVersion: extensions/v1beta1 kind: Ingress metadata:  name: api-ingresse-test  namespace: test  annotations:    kubernetes.io/ingress.class: "nginx" spec:  rules:  - host: test.anthonycornell.com    http:      paths:      - backend:          serviceName: myApp          servicePort: 80        path: /
复制代码


假设我们有三个命名空间,分别为 Test、Demo 和 Staging。在每个命名空间中创建入口资源后,NGINX 入口控制器将会按如下所示处理这些资源:



此图演示了来自这三个命名空间(Test、Demo 和 Staging)的流量触及 NLB,并且 NGINX 入口控制器将这些请求处理到相应的命名空间。

清理

删除入口资源:


kubectl delete -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/example-ingress.yaml
复制代码


删除服务:


kubectl delete -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/apple.yaml kubectl delete -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/banana.yaml
复制代码


删除 NLB:


kubectl delete -f https://raw.githubusercontent.com/cornellanthony/nlb-nginxIngress-eks/master/nlb-service.yaml
复制代码


删除 NGINX 入口控制器:


kubectl delete -f https://raw.
复制代码


本文转载自 AWS 博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/network-load-balancer-nginx-ingress-controller-eks/


2019-09-19 14:171160
用户头像

发布了 1835 篇内容, 共 91.5 次阅读, 收获喜欢 73 次。

关注

评论

发布
暂无评论
发现更多内容

在线HTML压缩格式化工具

入门小站

工具

什么技术,让浩鲸科技拿下中国移动大奖?

鲸品堂

中国移动

“StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!

StarRocks

数据库 大数据 StarRocks

TDesign 更新周报(2022年3月第3周)

TDesign

计算机编码规则之:Base64编码

程序那些事

Java base64 nio 程序那些事 3月月更

一文搞定 Flutter 底部弹窗实现

岛上码农

flutter 跨平台 ios开发 Android开发 3月月更

母婴后浪品牌频出,各个细分市场有哪些发展潜力?

易观分析

母婴

数字化原住民|ONES 人物

万事ONES

软件 招聘 软件工程师

一周热点回顾|虎符交易所上线多链合一;俄央行称加强监控加密资产等P2P交易

区块链前沿News

区块链 虎符交易所

小程序电商微服务设计

唐尤华

架构实战营

《软件开发的201个原则》思考:4. 高质量软件是可以实现的

非晓为骁

个人成长 软件工程 软件开发

Centos7安装Nginx

云原生

nginx centos 部署

收藏很久的资源整合网站,一个网站一个世界

小炮

深入浅出事务的本质,附 OceanBase 事务解析14问!

OceanBase 数据库

oceanbase OceanBase 社区版

科幻变现实:喷下即疗愈,生物3D打印绘就生命密码图

脑极体

743 网络延迟时间

好吃不贵

如何在新公司快速落地

Hockor

敏捷实践|好的用户故事怎么写?

LigaAI

用户故事 敏捷实践

恒源云(GpuShare)_MaskFormer:语义分割可以不全是像素级分类

恒源云

语义分割 像素分割 MaskFormer

多场景推进 服务网格在联通的落地实践(下)

百度大脑

春分耕种时,AI“现身”田间地头

百度大脑

使用 ABAP 开发的一个基于 Web Socket 的小工具,能提高程序员日常工作效率

Jerry Wang

自动化 前端开发 websocket 程序员进阶 3月月更

Git 如何回退代码

秋天

小程序容器技术,App热更新与敏捷开发新方案

Speedoooo

敏捷开发 APP开发 热更新 小程序容器 动态更新

网络安全:绕过MSF的一次渗透测试

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

Kubernetes API规范:为optional的字段使用pointer

工程师薛昭君

API Kubernetes 集群

centos7.6安装MySQL5.7采坑指南

云原生

MySQL 数据库 sql centos

Python迎来31岁生日,蝉联年度编程语言排行榜冠军

Python猫

Python

Redis集群架构剖析(3):集群处理redis-cli指令

非晓为骁

redis 架构 分布式 redis cluster

电脑就是我的安全感|ONES 人物

万事ONES

招聘 软件工程师

从 SVN 迁移到极狐GitLab

极狐GitLab

svn 迁移 极狐GitLab

将网络负载均衡器与 Amazon EKS 上的 NGINX 入口控制器配合使用_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章