关于高可用负载均衡的探索
本文于3月22日晚由张新峰,杭州爱医康架构师技术分享整理而成。本次分享介绍了如何使用负载均衡达到一个对用户友好(稳定无感)、对运维友好(傻瓜高效)、对架构友好(追溯监控)的高可用状态。
搜索微信号RancherLabs,或文末扫码,添加Rancher小助手为好友,可加入官方技术交流群,实时参加下一次分享~
引 言
我们今天要说的是一个老生常谈的问题:负载均衡。有点运维经验的人都对这个很了解了,可你的负载均衡有没有完美呢?在微服务大行其道的今天,每个公司几十上百个服务都很常见,更不用说多条产品线并存的公司了,这么多服务如何在扩缩容的时候实现服务发现和高可用,每天频繁升级更新的时候有没有实现用户无感知?当然每个人对于完美的定义不同,我们今天要说的是指对用户友好(高可用无感)、对运维友好(高效傻瓜)、对架构友好(追溯监控)的完美状态。
核心组件
Rancher 1.6
Traefik 1.5.3
dnsmasq
ab
必备知识
■ 了解Rancher的安装部署和基本使用
■ 了解DNS相关的网络基本常识
背 景
目前公司有3大产品线,十多个小产品,再加上用于运营分析的内部服务和开发测试环境的各种系统和服务,有差不多上百个子域名。运维的职责之一就是要保证这么多域名稳定准确地指向相应的服务器或服务。这些服务中大部分是Web服务,还有Spring Cloud微服务。不管是用户通过浏览器访问Web服务,还是微服务之间的相互调用,稳定性肯定是衡量服务的首要指标。尤其是在向DevOps看齐的敏捷型团队,要想在每天频繁发布上线的时候也能保证服务的稳定,就必须使用负载均衡。
困 境
先看看我们测试环境的一个产品线使用Rancher自带的负载均衡时的效果。
如果这个列表看着不是那么眼花缭乱,请看下图:
目前这个产品线部署了不到50个服务,如果这个界面看着也挺清爽,请再看看每次升级/编辑负载均衡规则的界面吧:
是不是彻底眼花缭乱了呢,这就是我之前每次维护负载均衡器的痛苦。 这里并不是在诋毁Rancher负载均衡的不好,只是这个管理方式在服务较少的时候还是方便的,服务很多的时候就不是那么方便了。
如果你想说谁让你把这么多服务放在一个负载均衡的,因为这是我们探索负载均衡过程中的其中一个阶段。
探 索
我们初的做法是每次新增一个Web服务,就先在Rancher中部署好服务,然后在Rancher负载均衡中增加一个规则,后还要去DNS服务器中新增一个A记录或者CNAME记录,这样用户才可以访问这个新的服务。虽然只有3步,经常有服务变动的时候也很累,还能不能更简便?
后来我们总结了生产环境不同服务使用不同二级域名但主域名都相同的规律,想到把所有有规律的相同分组(比如相同产品线)的域名泛解析到指定主机,只要在Rancher中将LB也调度到那个主机,后续需要在这个分组内新增Web服务就只需2步:
1部署好服务;
2在Rancher负载均衡中新增一个规则将想要的域名指向刚才部署,不需要添加A记录,用户就可以访问服务了。
这样着实方便了一些,但是一段时间后,服务越来越多,域名也相应越来越多,就遇到了上面管理负载均衡器界面眼花缭乱的困扰。我就在想有没有更简便的方案可以把手动管理负载均衡这一步也省略呢?能否实现每次新增或编辑一个Web服务只需要部署好服务这一步就可以了呢?
后来Traefik进入了我的视野,他可以整合各种KV存储解决方案和容器编排引擎,是实现自动负载均衡的选择。Traefik还原生支持Rancher的API,可以自发现Rancher上部署的服务。Rancher社区应用商店也提供了Traefik应用模板,按照模板部署Traefik服务以后,所有Web服务只要添加几个标签就可以自动注册到Traefik并且绑定好了制定的域名。再加上前面的经验,只要泛域名解析到了Traefik服务所在的服务器IP,即可实现了仅仅只需一个部署操作,用户就可以使用指定域名访问服务了。
实 操
实际操作前,必须要有一个搭建好的Rancher 1.6环境,我们下面只说Rancher的Agent主机需要以下几个服务器用来做实验,网络规划如下:
说明一点: 如果是生产环境或者需要公司外部用户访问内部网站,就需要在你的公网域名所在的DNS中设置相关域名解析,不需要单独部署DNS服务。 在公司内网部署一个独立DNS服务器的好处就是对公司内网用户友好,不用每个人记住枯燥的IP和端口了。还有一个好处就是可以实现域名拦截,比如公司内网开发测试环境想用一个花钱也搞不到的好域名,仅限内网,嘿嘿。。。
步,准备主机
将以上4台主机分别添加到Rancher,主机名没有要求。如果已经在Rancher集群里了,直接编辑主机按照上面网络规划分别添加标签。注意主机已经有的标签不要随意修改或删除,以免带来未知的问题。
四个节点都添加好的主机界面截图:
第二步,部署DNS服务器
如果你公司内部已经有DNS服务器,请在内部DNS上设置相关域名解析,可以略过这一步。如果对网络DNS了解不多,也请慎重操作,很容易引起你的电脑“无法上网”。
先添加一个应用,再添加服务,这里介绍一个自带Web管理界面的轻量级DNS服务器,镜像是:jpillora/dnsmasq,端口映射添加53和5380端口,分别对应容器53/udp和8080/tcp端口。注意53端口不能修改,必须是UDP协议。5380端口是DNS管理控制台,端口可以根据需要设置。如下图:
DNS服务启动好以后,打开DNS管理控制台http://10.0.1.10:5380,进行DNS配置: 核心的一条泛解析配置address=/.aek.com/10.0.1.10可以把aek.com所有的子域名解析到10.0.1.10这个IP。
配置好的截图如下:
下一步在各个主机和用户电脑上的设置DNS,将主DNS设置为10.0.1.10。当然前提是用户的电脑是可以ping通10.0.1.10这个IP。如果公司有DHCP服务器,将DHCP分配的主DNS设置为10.0.1.10,DHCP管辖下的电脑重启后都会应用这个主DNS了。 Windows设置DNS效果:
Linux修改DNS命令:
sed -i '1 i nameserver 10.0.1.10' /etc/resolv.conf
相关文章