热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DockOne微信分享(七十一):基于Docker的负载均衡和服务发现

dockone,微,信,分享,结合,使用,基于,docker,的,负载,
本文讲的是DockOne微信分享(七十一):基于Docker的负载均衡和服务发现【编者的话】Docker已经成为时下热门的容器技术,各大公司,中小创业者,都选择采用Docker技术架构其下一代的系统和应用。 随着系统规模扩大,单一Docker容器不能应对压力,需要横向扩展到多个容器,我们需要考虑负载均衡的问题;单一职责的Docker容器之间需要相互通信,而容器在每一次重启之后,它的IP都可能发生变化,那么服务和服务之间如何发现对方? 这一次我们一起来交流基于Docker的负载均衡和服务发现。内容的主题涉及到容器集群入口流量的负载均衡方案,4层和7层协议负载的区别处理,容器集群内服务之间的互相发现等。

应用的容器化和微服务化带来的问题

  • 在缺省网络模型中,容器每次重启后,IP会发生变动,在一个大的分布式系统保证IP地址不变是比较复杂的事情。
  • IP频繁发生变动,动态应用部署无法预知容器的IP地址,client端如何发现server端的访问端点?

解决方案(根据客户端是否有感知进行分类)

  • 客户端的发现。client 订阅注册中心,有一个固定的注册中心地址,client订阅某个服务的注册中心,注册中心根据服务的运行状态推送某个服务的访问端点列表给client端。 该方案的实现举例有Dubbo、DNS的解析等。
  • 服务端的发现。服务端提供某个服务固定的访问端点,客户端直接访问该端点即可达到与服务端通信的目的,该访问端口对接后端具有动态IP的容器,作为请求的入口,负责请求转发到后端的容器。该方案的实现举例就是各种对后端负载均衡的实现,包括LVS/Nginx/HAProxy等。我们可以认为如下公式基本成立:

    "服务端的发现" = "负载均衡器" + "路由配置自动更新"

对比客户端的发现,服务端发现对客户端无感知,由于很多已有的应用或者系统并不是按照类似Dubbo这种服务化的框架实现的,这些应用或者系统的客户端对服务发现都是无感知的,因此服务端的发现就表现出了独特的优势。客户端的服务发现方法中,DNS是一个例外,几乎所有的客户端都支持DNS。下面介绍客户端DNS和服务端的负载均衡器做服务发现的几个方案。

服务发现方案

DNS解析到多个IP

  • 优点:Docker版本大于1.10即原生支持容器集群内部DNS的服务发现。
  • 缺点:由于DNS TTL生效时间的存在,解析的结果不能做到实时,即使TTL设置为0,某些应用或者方法库会缓存DNS解析的结果,导致会解析到已经失效的地址上。

内核空间 LVS/IPVS

  • 优点:IPVS的方案是Docker在未来会正式发布的1.12版本中采用的方案,主要是做到了4层的负载均衡,请求的转发实现在内核中,不需要二次拷贝请求和响应的内容,不需要解析和处理7层HTTP协议,效率高。
  • 缺点:缺少7层负载均衡的支持,一个服务的负载均衡会占用主机的一个端口,服务与服务之间暴露的端口如果相同会产生冲突。

用户空间Nginx

  • 优点:同时支持4层和7层负载均衡的代理,多进程模型方便利用多核性能,具有cache功能,亦可作为静态文件Web服务器,7层可以根据区分HOST字段来复用同一个80端口,解决端口冲突的问题。7层负载会解析HTTP协议,支持多层路由,包括根据域名不同进行路由,根据路径不同进行路由,内部重定向等多种HTTP协议层的功能。
  • 缺点:负载均衡调度算法较少,对后端进行健康检查的策略较少。

用户空间 HAProxy

  • 优点:同时支持用户空间4层和7层负载均衡的代理,是一个纯粹的软负载均衡器,支持Round-Robin,static-rr,least-conn,source-IP等多种调度算法,对后端进行健康检查的策略完备,包括TCP端口检查,HTTP请求检查,可执行程序检查等带外检查。7层可以根据区分HOST字段来复用同一个80端口,解决端口冲突的问题。7层负载会解析HTTP协议,支持多层路由,包括根据域名不同进行路由,根据路径不同进行路由,内部重定向等多种HTTP协议层的功能。
  • 缺点:不能作为静态文件服务器,不支持Cache缓存功能。

aliyun容器服务的负载均衡解决方案

经过前面优缺点的分析和结合aliyun自身产品的优势,提供了以下解决方案。
  • Docker自带的DNS 服务发现,只要Docker版本大于1.10(目前阿里云支持的Docker最新版本为1.11),就支持DNS的服务发现。其特点是为:1)每个容器提供独立的DNS解析;2)可以通过容器名与别名(Aliases)方式在整个网络作用域内解析到某个容器的IP;3)通过链接别名的方式(Link Aliases)在容器的作用域内设置DNS解析,好处是不同容器的相同别名不会冲突。4)对外部的DNS解析请求进行代理。如下图所示:
    DNS_discovery.png
  • 4层,提供阿里云的云产品SLB的负载均衡方案,底层是基于LVS做了改造和增强,SLB经受了长期线上实战的考验,稳定性和正确性可以得到保证。同时,容器服务在此基础上能做到监控容器部署的情况,随着服务的启停,动态绑定SLB后端的端口(稍后解释原理)。
  • 7层,提供基于HAProxy的负载均衡方案,支持灵活的配置。容器服务在此基础上能做到监控容器部署的情况,随着服务的健康状况,动态调整后端的负载(稍后解释原理)。
  • 虽然我们4层主推SLB来做负载均衡,同时7层主推HAProxy来做负载均衡,但是实际上SLB支持7层的负载均衡,底层基于Tengine,而HAProxy也支持用户空间4层的负载均衡,用户可以根据自己的情况,灵活选择/组合方案。
  • SLB做到动态绑定的原理:Swarm监听容器的状态,如果容器正常运行,则把容器加入到SLB的后端,如果容器发现异常,则把容器从SLB的后端摘下来。

    SLB_discovery.png
  • HAProxy实现动态服务发现的原理:HAProxy容器内除了有HAProxy软件,还有脚本程序监听容器的状态,根据容器的健康状况重新生成负载均衡信息,然后重新加载(reload)HAProxy,使得新的负载均衡信息生效。

    haproxy_routing_discovery.png
  • 实现不停服rolling_update原理:平滑升级的关键在于每一时刻均有至少一个容器还能正常提供服务。1)需要部署多个容器,将容器分为A、B两批更新。2)更新容器时,先将A批容器的路由从SLB或者HAProxy上面摘下来。3) 更新A批容器 4)A批容器健康检查正常后,重新加入路由 5)摘下B批容器的路由 6)更新B批容器。
  • 实现灰度发布原理:不通版本的服务可以共享同一路由信息,通过调整SLB或者HAProxy权重的方式来做到灰度发布。

根据场景提供给用户的服务形态

  • 简单路由服务:基于HAProxy,我们加了一层Wrapper,做到动态发现处于运行状态的容器,加入到负载均衡中,我们称之为简单路由服务(routing service),其公网IP通过一个SLB对外进行暴露。主要解决如下需求:
    • 7层服务端点对公网暴露,即承接公网访问集群内使用7层协议的服务的流量。
    • 7层服务端点对内网暴露,即容器集群内的负载均衡和服务发现:如下图所示,集群内的服务发现利用了Docker自带的DNS resolver配合了HAProxy的负载均衡和健康检查。图中的LB即为简单路由服务下的HAProxy容器,1)首先通过Docker自带的DNS resolver将域名restserver.local解析到HAProxy容器的IP,此处会优先选择当前节点的HAProxy容器进行负载均衡;2)RestClient请求域名restserver.local时,请求先走到代理容器LB;3)LB根据从Discovery Service获取到的负载均衡信息代理到提供相应服务的容器后端RestServer Contaienr

      inner_service_discovery.png
    • 不支持4层的路由
  • 自定义路由服务:作为一个可选的容器,实现跟简单路由服务类似,解决如下需求:
    • 通过环境变量和标签提供强大且灵活的配置支持,同时支持用户基于该容器进行扩展(通过Dockerfile FROM的方式)。
    • 支持用户空间的4层协议转发。
  • SLB路由服务:将SLB绑定到某个服务上面,后端随服务的启停动态配置。主要解决如下需求:
    • 对外暴露的服务,使用4层协议,通过自定义SLB做4层的转发。
    • 容器间的4层或者7层通信,流量特别大时,推荐使用自定义SLB(内网)服务。

场景和对应的路由服务总结

sn_and_ew_communication.png

choose_service.png

如上述图表所示,我们将容器集群外进入容器集群内的入口通信称为南北通信,将集群内容器和容器之间的流量成为东西通信。我们根据不同的通信形式和协议层提供不同的服务来满足用户的需求,例如对应南北通信,如果是使用7层协议的服务,我们推荐用户使用集群的SLB进行流量转发,最终的流量会转发到每个主机的HAProxy容器上面,然后在分发到相应的处理请求的服务上。
  • 南北通信:指的是整个容器集群入口的通信。南北通信的特点往往是通信量比较大,因此我们首先用SLB将流量分散到各个主机节点。
  • 东西通信:指的是集群内部,容器和容器间的通信方式。

Q&A

Q:同一个域名指向一台主机内的容器服务,部署了n个相同的容器,怎么根据他们的负载来分配到不同的容器中?
A:7层负载均衡麻烦参考下 Nginx和 HAProxy的使用方法即可,注意,我们的HAProxy容器跟其他目标服务的容器是直接在同一个网络里面的。你说的根据负载分配,可以使用最小连接数算法,即 leastconn算法,需要查看HAProxy帮助手册进行设置。
Q:Docker 1.2 IPVS的方案,是否可以实现完全取代Keepalived+Nginx的效果?
A:不能, IPVS是4层协议的,在很多场景下,需要7层协议的功能,例如共享同一个端口,提供7层协议解析,gzip压缩,COOKIE注入,session保持等功能。
Q:有没有评估过Kubernetes在host上用iptables做lb的方案?为什么不用那种?
A:因为我们希望提供7层的路由和负载均衡,iptables的方案是基于4层的,不能共享同一个端口,不能提供7层协议解析,压缩,COOKIE注入,session保持等功能。
Q:问下灰度发布具体是怎么实现的?
A:灰度发布的具体实现方式如下: 例如有服务的两个版本A 和 a,他们使用相同的路由,挂在同一个域名(例如 www.example.com)的后端,但是A和a的权重不一样,通过调整权重来做到灰度发布,流量分配到不同的后端。
Q:请问haproxy访问其它主机容器网络怎样通信?
A:一个容器集群有多台机器,通过 Overlay网络,可以做到跨主机节点在同一个网络中。

以上内容根据2016年7月26日晚微信群分享内容整理。分享人谭林华,阿里巴巴高级工程师,多年以来一直关注系统接入层相关技术,包括DNS, 负载均衡,服务路由和发现,热衷容器技术。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

原文发布时间为:2016-07-27

本文作者:谭林华

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

原文标题:DockOne微信分享(七十一):基于Docker的负载均衡和服务发现


推荐阅读
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 浏览器如何工作(How browsers work)的阅读笔记
    浏览器如何工作(Howbrowserswork)的阅读笔记1.整体结构完整的浏览器整体框架的发改如下:UI:就是那些我们常常 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 计算机网络概述计算机网络基本概念计算机网络计算机网络是互连的、自治的计算机集合。协议计算机网络中的实体在进行数据交换的过程中必须遵循的规定或约定,称为网络协议。协议的三个要素:语法 ... [详细]
  • 这篇文章主要讲解了“面向对象设计的六大原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究 ... [详细]
  • 【图解HTTP】第一章 了解web及网络基础
    [图解HTTP]了解Web及网络基础Web页面是如何呈现的?根据Web浏览器地址栏中指定的URL,Web浏览器从Web服务器端获取文件资源(resour ... [详细]
author-avatar
元菱淑亚禎盈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有