嗨,我是Rancher工程师Alena Prokharchyk,之前我写过一些解释Rancher负载均衡的功能的文章。起初是作为一个独立的特性,后来作为Docker 服务发现功能的一部分。基于这个能力我们开发了一种负载平衡功能,不仅可以用于共享Docker容器之间的连接,还可以让客户在不关闭软件的情况下升级。
今天我将带你走进“虚拟主机路由”,一个从Rancher0.29版开始新添加到负载均衡的功能,它允许在同一LB服务中多个服务认证的用户通过路由通信,基于目标域名和/或url路径。
在本文中,我将介绍如何配置这个新配置,以及解释的一些用例我们设想在构建此功能。
用例
基于主机的负载平衡的典型用例是使用一个单一的IP地址将流量分发给多个服务。今天我的例子,将展示一个公司如何能用一个公网IP运作两个不同的应用程序——nginx的网站和LetsChat聊天平台。在这种情况下,用户将公共DNS配置两个记录指向相同的IP地址:
chat.example.com 108.162.202.109
web.example.com 108.162.202.109
然后,我们将使用两个独立的应用程序提供这些功能:nginx的网站LetsChat聊天平台。与主机负载平衡,交通可以分开这两个服务基于请求。如果请求是chat.example.com,它将被引导到LetsChat服务器;如果请求web.example.com——它将被引导到 Nginx节点。
现在,让我们走进从头构建这些配置。
创建堆栈和服务
我将创建所有这些服务在一个单独的Rancher环境,和一个单独的Rancher stacks。然而,可以建立基于主机的负载平衡服务运行在不同的堆栈之间以及与外部服务。我们将创建的服 务将包括一个“mongo”服务与一个容器(包含LetsChat),两个“LetsChat”服务每个有两个容器,和两个“Nginx”服务,每个有两个容器。上图中你会注意到我也创建多个版本的nginx和我们聊天服务(例如letschat1和letschat2)。我做了展示如何处理同一软件的不同版本之间的升级。
MongodbService:
LetsChat service:
Nginx service:
负载均衡注册服务:
它将扩展视图,这样您就可以设置主机名路由规则为每个服务:
我将“chat.example.com”设置为“请求主机”letschat1 / letschat2,以便所有交通与主机头“chat.example.com”来负载均衡的端口80,会平衡在letschat1 / letschat2服务监听端口8080。
之后我设置一个类似的规则nginx1 / nginx2:这些服务监听端口80,通过负载均衡与主机“web.example.com”通信,并将它们之间的分阁。
测试的他们是如何工作的,要按curl格式请求:
curl –header ‘Host: ’ ‘http://:/login’
LB IP——应该是公共IP地址的实例驻留在主机负载均衡;如果请求是内部——它可以负载均衡的私有IP地址的容器。
例如:
curl –header ‘Host: chat.example.com’ ‘http://108.162.202.109:80/login’
请求会跳转到LetsChat 服务上。
发送请求到Nginx服务、执行
curl –header ‘Host: web.example.com’ ‘http://108.162.202.109:80’
基于URL的路由
我们可以添加更多对我们现有的主机名路由规则。可能是由于应用程序的主机名是一样的,而且请求的数据转发到一个特定的服务基于URL路径:
web.example.com/support -> nginx1
web.example.com/careers -> nginx2
为了支持这个用例,在负载均衡上认证服务的方式会稍微改变:
如您所见,除了配置请求主机nginx1 nginx2,我还定义了请求路径。现在通信的负载均衡不仅在nginx / letschat服务之间,而且nginx1和nginx2之间使用更细的标准,URL路径。
内部负载平衡
有时你可能想要限制你的应用程序只在内部使用,但你仍然需要一些负载平衡的功能。在最新的版本中,你给出一个选择,选择内和公共负载均衡的源端口。
如果您选择使用一个内部源端口,负载均衡监听的端口将不会发布到主机。
后续有更多的LB 相关的资料
我希望这次讲解将帮助您了解我们最近一直在做的工作,让我们的Docker负载均衡功能更加好用。像往常一样,在最后我将给你一个预览我们下一步要做的负载均衡。在接下来的几周你应该看到我们启用支持SSL终端负载均衡。谢谢大家努力工作。