使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡

简介: 本文讲的是使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡【编者的话】本文描述了由 NGINX 和 NGINX Plus 实现的 Ingress Controller,完全支持了 Ingress 特性,使用 Ingress 将外部流量负载到集群内的服务,并提供了扩展来支持额外的负载均衡需求。
本文讲的是使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡【编者的话】本文描述了由 NGINX 和 NGINX Plus 实现的 Ingress Controller,完全支持了 Ingress 特性,使用 Ingress 将外部流量负载到集群内的服务,并提供了扩展来支持额外的负载均衡需求。

运行和管理跨机器集群的大规模的容器微服务应用是一个极具挑战的任务。 Kubernetes  提供了一个强大的容器编排解决方案,从而帮助我们迎接这个挑战。它包含了一些重要特性,比如容错,自动伸缩,滚动升级,存储,服务发现,以及负载均衡。

本文讲解了如何使用 开源 NGINX 软件 或者  NGINX Plus ,以及  Ingress  这个 Kubernetes 自带的负载均衡框架,对 HTTP 流量进行负载均衡。Ingress 能让我们配置规则,从而控制外部流向 Kubernetes 集群内的服务的流量。你可以选择任何能提供  Ingress controller  的负载均衡器,Ingress controller 指的是部署在集群内的软件,它使得 Kubernetes 和负载均衡器融为一体。这里我们将展示如何利用 Ingress 以及我们之前介绍过的 NGINX Plus Ingress controller  和  NGINX Ingress controller ,对一个微服务应用进行负载均衡。

本文只介绍使用 Ingress 对 Kubernetes 进行 HTTP 的负载均衡,要学习更多有关其它负载均衡的选项,请看另一片博文: 使用 NGINX Plus 对 Kubernetes 服务进行负载均衡 。

注意 :文中讨论的程序的完整指令,可在我们的  GitHub 仓库 上找到。本文不会遍历所有必要步骤,而是只提供那些步骤的链接。

NGINX 和 NGINX Plus 的 Ingress Controllers

在我们部署示例应用并为它配置负载均衡前,我们必须选择一个负载均衡器并部署相应的 Ingress controller。

一个 Ingress controller 是能将一个特定的负载均衡器和 Kubernetes 整合在一起的软件。我们已经为开源的 NGINX 和 NGINX Plus 开发了相应的 Ingress controller,它们可在我们的  GitHub 仓库 取到。其它实现也有,你可以去 Kubernetes GitHub 仓库上的  Ingress Controllers  页面了解。

关于集群内部署 NGINX Plus Ingress controller 的完整命令,可以去我们的  GitHub 仓库 查看。

微服务示例应用

我们的示例应用是一个典型的 微服务  web 应用,它由多个独立部署的服务组成。这个名叫  cafe  的应用,可通过 tea  服务订购茶叶,或者通过  coffee  服务订购咖啡。你可以通过 HTTP 请求的 URI 来表明你的饮料偏好:以 /tea  结尾的 URI 将提供茶叶,以  /coffee  结尾的 URI 将提供咖啡。这个应用必须通过 SSL/TLS 进行安全连接。

下图从概念上描述了整个应用,图中 NGINX Plus 这个负载均衡器扮演了一个重要角色,它路由客户端请求到合适的服务,并保证了安全的客户端连接。
kubernetes-load-balancing-cafe-service.png


集群内如何部署这个应用,请参考我们的  GitHub 仓库 上的命令。

通过 Ingress 配置 Kubernetes 的负载均衡

我们的  cafe  应用要求负载均衡器提供两个功能:
  • 基于请求的 URI 来路由(也叫基于路径的路由)
  • SSL/TLS 终端

用 Ingress 来配置负载均衡,你得在  Ingress 资源 里配置规则。这些规则指定如何路由外部流量到集群内的服务。

在资源内你可以定义多个虚拟服务器,每个服务器对应不同的域名。一个虚拟服务器通常对应集群内的一个单一微服务应用。对每个服务器,你可以:
  • 指定多个基于路径的规则。流量基于请求URI 发送到应用内的不同服务。
  • 通过引用一个SSL/TLS证书和密钥来建立SSL/TLS终端。

你可以在  Ingress 文档页面 上查看更多详细解释的例子。

下面是  cafe  应用的 Ingress 资源文件( cafe-ingress.yaml ):
1. apiVersion: extensions/v1beta1
2. kind: Ingress
3. metadata:
4.  name: cafe-ingress
5. spec:
6.  tls:
7.  - hosts:
8.    - cafe.example.com
9.    secretName: cafe-secret
10.  rules:
11.  - host: cafe.example.com
12.    http:
13.      paths:
14.      - path: /tea
15.        backend:
16.          serviceName: tea-svc
17.          servicePort: 80
18.      - path: /coffee
19.        backend:
20.          serviceName: coffee-svc
21.          servicePort: 80


一行一行过,我们看到:
  • 第 4 行我们命名该资源为 cafe-ingress。
  • 第6-9行我们建立SSL/TLS终端:
    • 第 9 行我们通过名字 cafe-secret 来引用一个 Secret 资源。这个资源包含SSL/TLS证书和密钥,并且必须在Ingress 资源前部署。
    • 第8 行我们把这个证书和密钥用到我们的 cafe.example.com 这个虚拟服务器上。
  • 第 11 行我们定义了一个虚拟服务器,域名为 cafe.example.com。
  • 第 13-21 行我们定义了两个基于路径的规则:
    • 第 14-17 行定义的规则要求负载均衡器分发带 /tea URI 的请求到 tea 服务的容器内,这个服务以tea-svc 名字部署在集群内。
    • 第 18-21 行定义的规则要求负载均衡器分发带 /coffee URI 的请求到 coffee 服务的容器内,这个服务以 coffee-svc 名字部署在集群内。
    • 两条规则都要求负载均衡器分发请求到对应服务的80端口上。

集群内部署 Ingress 和 Secret 资源的完整命令,请参考 GitHub仓库 。

测试这个应用

一旦部署完NGINX Plus Ingress controller,我们自己的应用,Ingress 资源,以及 Secret 资源,我们可以测试这个应用。

当我们以  /tea  URI 发送一个  tea  请求,我们可以在浏览器上看到由 tea 服务生成的页面。
kubernetes-load-balancing-index-page.png


我们希望你没有太失望,因为  tea  和  coffee  服务没有真的给你对应的饮料,而仅仅是显示了容器运行的信息,以及你的请求的细节。它们包含了容器的主机名和IP地址,请求的URI,以及客户端的 IP 地址。每一次我们刷新页面,我们会从不同的容器里得到响应。

我们也可以连接到 NGINX Plus 的 实时活动监控 页面,看到 NGINX Plus 和我们应用的每个容器的实时监控维度。
kubernetes-load-balancing-dashboard.png

Ingress Controller 的扩展

Ingress 提供了基本的 HTTP 负载均衡功能。但是通常你的应用的负载需求更复杂,Ingress 无法支持。为了满足这些需求,我们为 ingress controller 添加了一系列扩展。通过这种方式你可以仍然充分利用Kubernetes的资源来配置负载均衡(反对直接配置负载均衡器),同时利用这些能力来使用高级负载均衡特性。

当前,我们为我们的Ingress controller 提供了以下扩展:
  • WebSocket,它允许我们负载均衡 WebSocket 应用。
  • 会话保持(只有 NGINX Plus 支持),它确保来自给定客户端的请求将总是被发送到相同的后端容器。

关于可用扩展的完整列表,请查看我们的  GitHub仓库 。

除此以外,我们提供了一个机制来 定制 NGINX 配置 ,它依赖 Kubernetes 资源,要通过 Config Maps 资源或者注解(Annotations)实现。例如,你可以定制指令  proxy_connect_timeout  或者  proxy_read_timeout  的值。

当你的负载均衡需求超出了Ingress 和我们的扩展的支持范围,我们推荐一种不同的方式来部署和配置NGINX Plus ,它不使用 Ingress controller。请参考博文  使用 NGINX Plus进行 Kubernetes 服务的负载均衡  找到更多细节。

NGINX Plus Controller 的优点

NGINX Plus controller 除了拥有 NGINX controller 的优点外,还提供以下好处:
  • 高动态环境中的稳定性 - 每当通过 Ingress 暴露的服务,它的一系列 pod 有一些变化时,Ingress controller 需要更新 NGINX 或者 NGINX Plus 的配置来反应这些变化。使用开源 NGINX,你必须手工修改这些配置文件并重新加载这些配置。使用 NGINX Plus,你可以使用立即重新配置(on-the-fly reconfiguration)API 来更新这些配置,而不用重新加载这些配置文件。这可以防止潜在的内存使用率的提升,以及当非常频繁得重载配置的时候,整个系统超载的发生。
  • 实时的统计数据 - NGINX Plus 提供了高级的实时统计数据,你可以通过 API 或者内嵌的页面访问。它可以使你深入了解 NGINX Plus 和你的应用是如何工作的。
  • 会话保持 - 当你开启会话保持功能,NGINX Plus 将使用粘性cookie(sticky cookie)方法确保所有来自同一客户端的请求总是被发送到同一个后端容器。
  • 技术支持 - NGINX 公司的专业服务团队可以提供关于 NGINX 和 NGINX Plus 的 Ingress controller 的帮助。

总结

Kubernetes 提供了内建的 HTTP 负载均衡,使用 Ingress 将外部流量负载到集群内的服务。NGINX 和 NGINX Plus 整合了 Kubernetes 的负载均衡,完全支持了 Ingress 特性,并提供了扩展来支持额外的负载均衡需求。

要尝试 NGINX Plus 和 Ingress controller,请现在开始你的 免费 30 天之旅 ,或者 联系我们 获取现场演示。

原文链接:NGINX and NGINX Plus Ingress Controllers for Kubernetes Load Balancing(翻译:池剑锋)

原文发布时间为:2017-02-10

本文作者:池剑锋

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
负载均衡 网络协议 算法
一文读懂什么是Nginx?它能否实现IM的负载均衡?
Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡方案,从某种意义上来讲,Nginx几乎是低成本、高负载Web服务端代名词。 如此深入人心的Nginx,很多人也想当然的认为,在IM或消息推送等场景下是否也能使用Nginx来解决负载均衡问题? 另外,即时通讯网的论坛和QQ群里也经常有人问起,Nginx是否能支持TCP、UDP、WebSocket的负载
530 4
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
519 21
|
负载均衡 Java 应用服务中间件
Tomcat与Nginx的负载均衡与动静分离技巧
总的来说,Tomcat和Nginx各有各的优点,在负载均衡和动静分离这两方面它们都有很好的应用。灵活使用这两个工具能够让Web应用具有更好的扩展性和用户体验。
503 14
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
616 11
|
负载均衡 算法 应用服务中间件
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
965 5
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
598 6
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
1805 25
|
负载均衡 应用服务中间件 nginx
如何使用nginx实现负载均衡?
如何使用nginx实现负载均衡?
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
1304 2
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
1250 87

推荐镜像

更多