前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个基于 Docker 的负载均衡实例

一个基于 Docker 的负载均衡实例

原创
作者头像
邵靖
修改于 2017-08-03 08:59:03
修改于 2017-08-03 08:59:03
7.7K10
代码可运行
举报
文章被收录于专栏:邵靖的专栏邵靖的专栏
运行总次数:0
代码可运行

前言

近年来,云计算的概念席卷了整个 IT 圈。抛开忽悠概念的因素,云计算的发展和应用极大地改变了 IT 产业的研发、运营和管理。作为云计算最重要的核心技术之一,虚拟化技术的发展促成了这一巨大的变革,而容器技术作为最具有代表性的虚拟化技术革新,目前已经得到了业界的广泛关注,其中以 Docker 最具有代表性,最为火爆,鹅厂目前很多应用也或多或少使用到了 docker。本文目地主要是给大家简单安利一下目前最火的容器产品 Docker 及其所涉及的相关技术,并通过一个实际例子演示一下容器技术的典型应用场景。

简单扯扯容器

虚拟化技术的核心在于资源划分、隔离和管理。围绕着这个核心,在不同层次上发展出了多种虚拟化技术,如以虚拟机为代表的硬件级虚拟化(Hardware Virtualization)技术以及以容器(Container)为代表的操作系统级虚拟化(Operating System Level Virtualization)技术。容器并不是一个全新的技术体系,下图是从 Wikipedia 摘录的容器实现全家福,可以看到此项技术可以追溯到 1982 年,并且覆盖了多种操作系统。近年来,随着 Docker 的快速崛起,容器技术再次吸引了 IT 业界的广泛关注。

为什么要用"再"?这就需要聊聊容器的特点以及跟虚拟机的区别和联系。随着技术的发展,IT 基础设施的能力越来越大,原来需要多个硬件单元完成的任务现在仅用一个硬件单元的一部分就能够完成了,那么为了资源的合理分配,将资源集合划分为更细粒度的资源单元,就是虚拟化技术的意义。下图是虚拟机和容器技术的对比示意图。左图中,在宿主机操作系统(Host OS)之上,通过 Hypervisor 将资源划分为资源单元,每个单元有自己的操作系统(Guest OS)、工具和库,在其上运行各自的 app 互不干扰,每个资源单元就是一个虚拟机;右图中在宿主机操作系统之上,通过容器管理器(Container Manager)将一部分资源隔离出来形成资源单元,每个资源单元没有自己的操作系统,有自己的工具和库,在这之上运行自己的 app,这里每个资源单元就是一个容器。

通过上图的分析可以看到,虚拟机和容器技术在隔离的层次上并不相同,虚拟机有从操作系统开始的完整的基础设施,而容器仅在工具、库这个层次及以上形成了自己的特有区域。这个特点决定了两者的属性,容器是比虚拟机更轻量的资源单元。轻量,意味着快速启停、迁移、分发等优良的性质,并且在资源总量一样的情况下,能够支持的容器单元数量将数倍于虚拟机。

下面扯点题外话,人类善于通过逻辑思维的手段从不同的事物中抽取出本质并加以推广。举个例子,运输业是一个很古老的行业,运输业的发展推动了人类的进步,当人类的运输需求变得越来越复杂,遇到了下面的问题,如何用标准的交通工具运输各种各样需求不同的物品?

为了解决这个问题,人们发明了集装箱,它将运输品所需满足的条件(光照、冷藏、密封等)限制在集装箱之内,对外而言它只是一个提供标准运输接口的单元,这样的单元可以通过各种使用标准运输接口的交通工具运输。

看到这里大家应该不难理解,通过类比,IT 攻城狮们再次发现虚拟化技术所蕴含的巨大潜力,虚拟化可以充当集装箱的角色,将 app 运行所需满足的条件(依赖、工具、库等)限制在资源单元之内,对外提供标准的接口,并且能够装载于各类服务器基础设施。并且在比较了各类虚拟化技术后,容器轻量的特点让它更适宜与成为集装箱。在重新审视了容器技术的巨大价值之后,各方势力纷纷开始占山头立门户,在这个过程中诸多新的容器技术相继发布,其中就以取名为码头工人的 Docker 最具代表性。

WoW,Docker 来了!它是谁?能干嘛?

Docker 是谁?Docker 是由 dotCloud 公司在 2013 年开源的一款开源容器引擎,后来 Docker 火了干脆公司就改名为 Docker 了……

Docker 是一种基于 Linux 内核隔离技术的容器实现,用 Go 语言编写,其功能特性归纳为:

  • 资源隔离,包括文件系统、进程、网络等;
  • 资源控制;
  • 文件系统,具有写时复制、日志记录、版本管理等;
  • 提供控制 API
  • 提供镜像分发、重用的生态系统。

Docker 的实现依赖了以下技术:

  • Namespace,利用 Linux 内核提供的 namespace 机制,容器能够建立资源隔离单元,隔离内容包括进程(PID)、网络(Net)、进程交互(IPC)、文件目录(Mnt)、hostname 及用户和用户组等。
  • CGroup,利用 CGroup 机制来处理不同容器之间竞争宿主机系统资源的问题,实现对资源的配额和度量。
  • LXC,在 Docker 发展的过程中,早期使用 LXC 来共享内核,实现容器的快速启停以及减少内存的消耗,在后来的发展中,docker 主键用 libcontainer 替代并扩展了 LXC 的功能。
  • AUFS,Docker 默认使用 AUFS 构建容器的文件系统,提供写时复制(Copy On Write)的特性,这是 Docker 镜像保存、修改及分发的基础。

基于 docker 提供的基础功能和其开源的属性,业界巨头和初创公司纷纷以此为基础开发出各种框架和工具,在分布式特性、网络特性、存储特性以及管理特性等方面对 Docker 进行扩展和补充,鹅厂 IEG 内部使用的 Docker 管理平台以及 TEG 的 Gaia 系统都是很好的例子。关于 docker 技术原理的文章能够很容易搜索到,本文就不在这里展开了,下面将根据容器的特点介绍几个典型的应用场景,并给大家介绍如何从零开始写一个简单的基于 Docker 的负载均衡器

根据前述,Docker 作为一种容器,能够快速启停、占用较少的系统资源,同时根据其自身实现技术特点,又具备写时复制、保存分发等特点。所以不难想到以下几种应用场景很适合使用 Docker 实现:

  • 平台即服务(PAAS),沙箱的完美替代品;
  • 自动测试及持续集成,测试妹纸笑开了花;
  • 构建标准化无状态运行环境及快速部署,你知道重装环境有多么烦么;
  • 高可用(HA)和负载均衡(LB)系统,让故障和攻击陷入人民战争的汪洋大海,一会慢慢讲。

夸了那么多,难道 Docker 就没有缺点么?不是的,目前 Docker 正在快速发展过程中,在人们使用的过程中逐渐暴露了 Docker 的很多问题,其中不乏一些很严重的问题:

  • 隔离性问题,docker 依赖 Linux 内核提供的隔离机制,相比虚拟机而言,级别和程度都有不少下降,这也是追求轻量带来的副作用
  • 安全性问题,跟隔离性分不开,目前 Docker 存在诸如 root 权限提升,共享宿主信息等安全漏洞,这阻碍了其推广到企业级应用的脚步
  • 性能问题,由于引入了 AUFS,提供了很好的 COW 特性,但是这也会对 I/O 性能造成一定影响,因此不建议用 docker 负担有状态的任务
  • Docker 提供用于镜像分发和重用的生态系统,全球开发者都能够通过这个平台进行交流,但随之而来的就是如何保证镜像的质量、可靠性和安全性,PS.别人做的你敢用?

尽管存在诸多问题,但是这并不妨碍 docker 前进的脚步。业界也在期盼 docker 的快速成长。

别光看,动手做吧

感谢您能够看到这里,啰嗦结束之后,我们来动手做一个简单的基于 Docker 的负载均衡器实例。

负载均衡,顾名思义就是对负载进行分流实现均衡的目的。在 web 网站以及 web service 发展的过程中,负载和处理能力的矛盾使得负载均衡成为必须考虑的问题,如下图所示:

  1. 当请求负载在单节点处理能力之下时,没有必要设置负载均衡器,所有的请求都由一台服务器搞定;
  2. 当请求达到一定数量,超过了单台服务器处理能力,那么现在就需要添加多台服务器,并且使用负载均衡器(Load Balancer)进行流量分发,保证业务请求平均地分散到各 web 服务器;
  3. 业务的流量特点很多变,流量高峰何时到来谁也不知道,如果使用多台 web 服务器在后台值班,这样难免会造成资源的浪费,并且这样也有可能无法应对流量峰值,因此需要一个自动的负载均衡器,它能够实时检测当前到来的业务流量,并且能够控制后端资源池快速完成资源的申请、释放以及路由切换,这样就可以通过实时的流量检测数据完成 web 服务器的动态配置,在后端资源池能力足够的情况下,轻松应对多变的请求量。

为了实现 3 的目标,我们的系统需要以下几大功能模块,如下图所示:

  • 负载均衡器:负责分发流量请求,并且在节点数目变化时完成路由切换。在本实例中,我选取了开源的 HAProxy 作为负载均衡器的实现,它支持多种流量分发算法,本例采用了简单的轮询(RoundRobin)模式。
  • 负载监控器:负责监控当前负载请求量,并且根据设定阈值决定下一步动作。本例中由 Python 实现,配合 Web 服务器实时上报的当前流量状况决定是否动态申请资源,实现 Scale-Out,具体代码请移步微码: https://github.com/kevinjs/docker-demo/blob/master/lb_demo/watch.py
  • 资源控制器:封装 docker 的操作 API,根据监控器的指令完成添加或删除服务节点的具体操作,本例中由 Python 实现,具体代码请移步微码: https://github.com/kevinjs/docker-demo/blob/master/lb_demo/control.py
  • Web 服务器:发挥 docker 的特点,将业务所需的 WebServer 功能组件,负载获取上报模块等打包成为镜像并注册于镜像库中,根据控制器的指令启停。

Docker 服务镜像的准备按照以下步骤进行:

  1. 安装 docker 及相关服务组件;
  2. Docker pull 拉取空白的实例;
  3. 安装所需的基础组件,部署业务代码;
  4. 将实例保存为镜像(类比 OOM 中创建了一个类);
  5. Docker push 可以将此镜像上传到公共、私有镜像库,完成分发或重用(类比将 4 中创建的类发布,供其他人继承或是实例化对象并使用)。

本例所使用的镜像已经上传至 docker 官方镜像库,可以通过以下 docker 命令下载使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull kevinjs/ubuntu:py27tor2

运行效果

通过模拟 http 请求访问负载均衡器服务 IP,控制访问量观察后端服务节点的数目和响应情况,最后将数据可视化输出如下图所示,可以看到,随着访问量的上升,监控器准确地反馈了流量的变化,并在短时间内通知后端资源池添加服务节点,从一个服最终增加到 18 个服务节点,在每一时刻都尽量保证每个服务节点都分布到平均的负载压力,并且在负载下降后及时减少服务节点以节省资源。需要解释一下的是,从图中可以看出每隔一一定时间访问量有突降的情况,这是由于需要在自动添加服务节点后重启负载均衡器 HAProxy 造成的,这里是一个简单的实现,如果换用能够动态加载配置的负载均衡器方案,就能做到流量的平滑过渡。

下图是总的访问量与平均访问量之间的对比,在总请求量暴涨的情况下,通过快速反馈调节后端 web 服务实例的数量,平均访问量快速收敛,实现负载均衡。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
您好。我是一名docker容器的初学者,最近在学习如何通过监控后端节点的负载情况来自动扩缩容;看到了您写的这篇文章,觉得写得非常好;我有几个疑问想请教下您:1、负载监控代码watch.py以及资源控制代码如何部署,应该部署在哪个文件下?2、您这里的扩缩容是针对于容器还是针对于真正的主机节点呢?感谢您的回答。
您好。我是一名docker容器的初学者,最近在学习如何通过监控后端节点的负载情况来自动扩缩容;看到了您写的这篇文章,觉得写得非常好;我有几个疑问想请教下您:1、负载监控代码watch.py以及资源控制代码如何部署,应该部署在哪个文件下?2、您这里的扩缩容是针对于容器还是针对于真正的主机节点呢?感谢您的回答。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
入门级容器技术解析:Docker和K8s的区别与关系
1.了解容器的由来,以及容器的概念。 2.了解Docker是什么及其作用。 3.了解K8s是什么及其作用。
Rossy Yan
2024/12/24
7460
入门级容器技术解析:Docker和K8s的区别与关系
从docker介绍及其简介
Docker 是一个开源项目,诞生于 2013 年初,最初是dotCloud 公司内部的一个业余项目。它基于 Google 公 司推出的 Go 语言实现。2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。
贾维斯Echo
2023/10/18
4570
从docker介绍及其简介
Docker 入门到实战教程(一)介绍Docker
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
小东啊
2020/07/23
8800
Docker 入门到实战教程(一)介绍Docker
Docker系列学习文章 - 什么是容器技术?(一)
容器这个词,当你第一眼看它或许脑子里是这东西:瓶瓶罐罐、装水、装其他东西的玩意。
宝哥@上云专家
2018/05/07
7.3K13
Docker系列学习文章 - 什么是容器技术?(一)
[入门]容器
在上个世纪50年代前,当时物流远没有现代这么普及,集装箱在当时并不被认可,几乎所有货物都是通过零散方式运输。
木禾wen
2019/11/15
8030
[入门]容器
温故知新:Docker基础知识知多少
记得之前曾经粗略的写过一篇Docker的基础及ASP.NET Core部署Docker示例的入门文章,但那个时候刚刚学习Docker对Docker的认知还比较浅,现在重新来温故知新一下。此外,本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
Edison Zhou
2020/05/18
4090
温故知新:Docker基础知识知多少
docker化你的java应用(上)前言走进docker
在各种技术大会(互联网架构,云计算等等),哪都少不了docker的身影。docker为啥这么火?因为它解决了大部分企业的痛点:快速的持续集成,服务的弹性伸缩,部署简单,方便了运维,而且为企业节省了机器资源,降低了成本。现在在很多企业(腾讯/京东/阿里/小红书等等)都大规模使用docker。作为开发工程师,咱们或多或少需要接触docker,因为咱们的程序运行在docker容器当中,了解docker,有益无害。下面我们就进入docker的世界吧~
用户2890438
2018/08/20
7590
探寻容器的本质
要想理解容器的本质,我们先来聊聊是容器技术。广义上来说:容器技术 = 动态的容器 + 静态的镜像 + 远端的仓库。容器、镜像和仓库构成了容器技术的三要素,其中最核心的概念就是容器。简单来说,镜像就是把应用程序运行所依赖的环境、配置等打包成的一个文件;而仓库则是保存和管理这些镜像的地方。这两个概念我们后面的章节会详细展开,本节就先来说一下容器。
张申傲
2022/09/28
4200
探寻容器的本质
分布式系列-Docker简介篇
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
一点博客
2019/07/24
9680
docker (一)
在写这个文章之前先说一件事,上次发的那篇文章要提一下。当时打码没有打好,可能会对站长造成了不好的影响。 因为有人踩着我的足迹进去了~我承认上一篇的做法有点娱乐圈,但是我真的想装X,我打码干嘛,直接挂黑页放出来不就得了。其实主要是思路,因为玩这个有时候这样子会比较有趣一点。没什么技术含量~也希望不要有人搞破坏,因为我拿到权限都是扔那边~基本都是好朋友木头在做下一步挖掘利用,我只想低调学习分享技术~我也懒得帮站长修复了,甚至好多漏洞我都懒得去向SRC提交…对我来说这种东西没意义,我有那么多时间我还不如去多学点东
lonelyvaf
2018/06/07
5650
Docker会是改变世界的那只“箱子”吗?
“很多时候,我们面临未来的预测和期望,其实很多答案已经存在在历史中。” 改变世界的“箱子” “没有集装箱,就不会有全球化。”,《经济学家》这个评论可以说是对于这个普通的箱子的历史性地位的一个总结。1956年4月26日,当集装箱之父麦克莱恩第一次将集装箱这种方式用于货物运输时,他肯定想像不到他的这个看似普通的发明,会对这个世界的影响如此深远。因为如果把全球经济比作一个高速运转的复杂的机器,那么以集装箱为核心的现代运输体系就是带动这台机器高速运转的齿轮和传送带。 这只普通的箱子,技术含量不高,也并不复杂。
腾讯大数据
2018/01/26
8860
Docker系列(1):Welcome to Docker
2022年3月底我开始正式的接触Docker这项技术,以往一直以为Docker是一项全新的虚拟技术,认为与我的生活和工作无关,因此也从未计划去了解和使用它。直到看到同事通过它快速地完成了一次服务部署,在以往我是需要花大量时间才能完成的工作,哪怕在运维上已经有丰富的经验也难以避免。而他只需要数分钟就能完成,这巨大的反差令我瞬间对Docker产生了非常浓厚的兴趣,便开始阅读书籍《Docker实战》、翻阅官网手册并加入Docker社区,在短暂的实战中切实的感受到了Docker带来的改变和便利,便想着在这里出个“Docker系列”地博客,跟大家一起分享Docker。如果你也感兴趣,那么请跟我一起进入到下面的Docker世界吧~
Homqyy
2023/03/06
6160
Docker系列(1):Welcome to Docker
Docker简介
​ 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
cwl_java
2022/11/30
4300
Docker简介
从“集装箱运输”了解容器技术
容器技术的火爆和日益普及已经成为不争的事实,众多公有云平台纷纷支持Docker,AWS、Google、Azure、阿里云以及国内的各大公有云厂商都推出了容器云业务,国内也有不少创业公司通过构建容器Paas平台帮助企业实现微服务架构改造。
达观数据
2018/07/31
1.4K0
从“集装箱运输”了解容器技术
Docker简介、常用命令与实践(一)
Docker的思想来自于集装箱。 集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。 可是这个箱子为什么这么神奇呢?无非就是两个字:标准。
唐成勇
2019/05/26
5920
Docker---(1)Docker 简介
Docker总体架构为c/s架构,模块之间松耦合,包含了Client, Daemon, Registry, Graph, Driver, Libcontainer以及Docker Container
IT云清
2019/01/22
6330
docker--docker介绍
在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多 台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用 户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用 户空间运行在同一台宿主机上。
eadela
2019/11/22
8880
Docker是啥?
Docker的图标代表,它托着许多集装箱。我们可以把宿主机可当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含自己的应用程序。
py3study
2018/08/02
1.2K0
Docker容器是否可以改变世界?
2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接触了Docker,熟悉之后,真有一点震惊的感觉,太方便了,可以解决很多问题 Container 通常翻译为容器,但还有另一个意思,就是“集装箱” 集装箱是21世纪最伟大的发明之一,它改变了世界货物运输体系,造就了一个高度自动化、标准化、低成本的物流体系,促进了经济的全球化发展 程序界也出现了同样的一个箱子,就是 Docker容器 Docker的核心特点 Docker是一个开源
dys
2018/04/03
6900
Docker容器是否可以改变世界?
市值13亿美元,创始人离职,被大厂抛弃,Docker 是个啥?
点击上方蓝色“3分钟云计算”关注我们,设个星标,每天学习云计算知识 有瓜友觉得上篇文章👇太干了,咽不下去,那今天我们来点湿的。 Docker 公司原名dotCloud, 位于美国旧金山,主要提供基于PaaS(Platform as a Service, 平台即服务)的云计算服务。但Docker 产品开源后实在太火,公司也就改用Docker 命名了,目前市值高达13亿美元。这应该是创业公司中最成功的案例。就下面这位大神,Solomon Hykes Docker 自2013年开源以来一直都是云计算领域的热点
Markgogogo
2022/06/13
1.5K0
市值13亿美元,创始人离职,被大厂抛弃,Docker 是个啥?
相关推荐
入门级容器技术解析:Docker和K8s的区别与关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档