使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡
运行和管理跨机器集群的大规模的容器微服务应用是一个极具挑战的任务。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 服务进行负载均衡》(http://dockone.io/article/957)。
注意:文中讨论的程序的完整指令,可在我们的 GitHub 仓库上找到。本文不会遍历所有必要步骤,而是只提供那些步骤的链接。
NGINX 和 NGINX Plus 的 Ingress Controllers
在我们部署示例应用并为它配置负载均衡前,我们必须选择一个负载均衡器并部署相应的 Ingress controller。
一个 Ingress controller 是能将一个特定的负载均衡器和 Kubernetes 整合在一起的软件。我们已经为开源的 NGINX 和 NGINX Plus 开发了相应的 Ingress controller,它们可在我们的 GitHub 仓库(https://github.com/nginxinc/kubernetes-ingress)取到。其它实现也有,你可以去 Kubernetes GitHub 仓库上的 Ingress Controllers页面了解。
关于集群内部署 NGINX Plus Ingress controller 的完整命令,可以去我们的 GitHub 仓库查看。
微服务示例应用
我们的示例应用是一个典型的微服务 web 应用,它由多个独立部署的服务组成。这个名叫 cafe 的应用,可通过 tea 服务订购茶叶,或者通过 coffee 服务订购咖啡。你可以通过 HTTP 请求的 URI 来表明你的饮料偏好:以 /tea 结尾的 URI 将提供茶叶,以 /coffee 结尾的 URI 将提供咖啡。这个应用必须通过 SSL/TLS 进行安全连接。
下图从概念上描述了整个应用,图中 NGINX Plus 这个负载均衡器扮演了一个重要角色,它路由客户端请求到合适的服务,并保证了安全的客户端连接。
集群内如何部署这个应用,请参考我们的 GitHub 仓库上的命令。
通过 Ingress 配置 Kubernetes 的负载均衡
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" width="632px" data-ratio="0.053125" data-src="http://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKAqFgpSGeW7gPVFkXF48zOhLx8tfDUlzrcGxiabTPKHfe9FrslAWqnnueY9cVTuictVMxbjBxrj12vQ/640?" data-type="png" data-w="640" />
我们的 cafe 应用要求负载均衡器提供两个功能:
基于请求的 URI 来路由(也叫基于路径的路由)
SSL/TLS 终端
用 Ingress 来配置负载均衡,你得在 Ingress 资源里配置规则。这些规则指定如何路由外部流量到集群内的服务。
在资源内你可以定义多个虚拟服务器,每个服务器对应不同的域名。一个虚拟服务器通常对应集群内的一个单一微服务应用。对每个服务器,你可以:
指定多个基于路径的规则。流量基于请求URI 发送到应用内的不同服务。
通过引用一个SSL/TLS证书和密钥来建立SSL/TLS终端。
你可以在 Ingress 文档页面(https://kubernetes.io/docs/user-guide/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仓库。
测试这个应用
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" width="632px" data-ratio="0.053125" data-src="http://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKAqFgpSGeW7gPVFkXF48zOhLx8tfDUlzrcGxiabTPKHfe9FrslAWqnnueY9cVTuictVMxbjBxrj12vQ/640?" data-type="png" data-w="640" />
一旦部署完NGINX Plus Ingress controller,我们自己的应用,Ingress 资源,以及 Secret 资源,我们可以测试这个应用。
当我们以 /tea URI 发送一个 tea 请求,我们可以在浏览器上看到由 tea 服务生成的页面。
我们希望你没有太失望,因为 tea 和 coffee 服务没有真的给你对应的饮料,而仅仅是显示了容器运行的信息,以及你的请求的细节。它们包含了容器的主机名和IP地址,请求的URI,以及客户端的 IP 地址。每一次我们刷新页面,我们会从不同的容器里得到响应。
我们也可以连接到 NGINX Plus 的实时活动监控页面,看到 NGINX Plus 和我们应用的每个容器的实时监控维度。
Ingress Controller 的扩展
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" width="632px" data-ratio="0.053125" data-src="http://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKAqFgpSGeW7gPVFkXF48zOhLx8tfDUlzrcGxiabTPKHfe9FrslAWqnnueY9cVTuictVMxbjBxrj12vQ/640?" data-type="png" data-w="640" />
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 服务的负载均衡》(http://dockone.io/article/957)找到更多细节。
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 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡的更多相关文章
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
- 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现.一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容 ...
- 【nginx网站性能优化篇(3)】反向代理实现负载均衡
注意,本篇文章为负载均衡的理论篇,后续找个机会推出实战篇.理论篇主要讲述如何配置负载均衡,配置负载均衡不难.难的是真正的实战,比如如何做到多服务器之间的数据共享(session,file等),多cac ...
- Nginx安装、配置虚拟主机、反向代理、负载均衡
1. nginx安装 下载nginx: 官方网站: http://nginx.org/ 使用的版本是1.8.0版本. Nginx提供的源码. 1.1. 要求的安装环境 1.需要安装gcc的环境.y ...
- Nginx详解(正向代理、反向代理、负载均衡原理)
Nginx配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行 ...
- Nginx入门篇(六)之反向代理和负载均衡
一.Nginx负载均衡集群 介绍 负载均衡(Load Balance)集群提供了一种行之有效的办法,来扩展网络设备和服务器负载.带宽和吞吐量,同时加强了网络数据处理能力,提供了网络的灵活性和可用性. ...
- 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块
Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: server backend1.example.co ...
- Nginx(四) nginx+consul+upasync 在ubnutu18带桌面系统 实现动态负载均衡
1.1 什么是动态负载均衡 传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upstream可配置化 ...
- Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...
随机推荐
- Step by Step iOS Project In Action - 视图控制器
1. 什么是视图控制器(View Controller) 简单来说,视图控制器用来管理你所有的视图. 他们是你的视图和模型的粘合剂. 如果你做过MVC的Web项目,我想你应该不会对它感到陌生. 2. ...
- Android入门之简单拨号器
效果图: package jk.phone; import android.net.Uri; import android.os.Bundle; import android.app.Activity ...
- Hibernate(十四)缓存
一.什么是缓存 缓存是介于应用程序和永久必数据存储源之间,目的是为了降低应用程序直接读写永久必数据存储源的频率,从而提高运行性能 缓存通常是在内存中的如: Office中的Word.excel Hib ...
- vue 虚拟dom
https://segmentfault.com/a/1190000008291645 一个VNode的实例对象包含了以下属性 tag: 当前节点的标签名 data: 当前节点的数据对象 VNode可 ...
- oracle卸载清除注册表(彻底卸载)
用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢? 那就是直接注册表清除,步骤如下: . 开始->设置->控制面板-& ...
- sqlite 附加和分离数据库
附加数据库 ATTACH DATABASE 'testDB.db' as 'TEST'; 分离数据库 DETACH DATABASE 'Test';
- linux 使用wc命令统计文件行数、字数及大小
语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. 该命令各选 ...
- Web Service基础——规范及三要素
1. Java中的Web Service规范 Java 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC).JAX-RS.JAXM&SAAJ(废弃). 1.1 JAX- ...
- js访问url和cookie
function QueryString() { var data = []; this.Read = function() { var aPairs, aTmp; var queryString = ...
- 32个Chrome 针对网页设计师和开发人员扩展
http://zmingcx.com/32-chrome-web-designers-and-developers-to-expand.html