您现在的位置是:首页 > 文章详情

'三剑客'之Swarm集群架构、集群管理 、服务管理

日期:2018-03-23点击:485

1.前言

在看过笔者之前关于Docker的文章后,我相信大家对Docker的内功心法以及对Docker相关武器都有了深刻的认识。在企业玩玩Docker大家也不成问题。但是呢,这些心法和武器往往还是不够了。

因为,在Docker应用越来越深入的时代,把调度粒度停在单个容器上是非常没有效率的。同样地,在提高对Docker宿主机管理效率和利用率的方向上,选择集群化管理方式才是正常的道路。我们是时候从更高的抽象层次上来使用Dokcer了,Swarm和Kubernetes将来满足我们的愿景和需求。
'三剑客'之Swarm集群架构、集群管理 、服务管理

然而,本文的重点内容在于分享Swarm;可能有些朋友会问,为什么不分享一下Kubernetes呢,别着急。常言道:路得一步一步走,饭要一口一口吃。Kubernetes比较难理解,所以咋们先把Swarm玩明白了之后在来玩Kubernetes会顺畅很多。

2.swarm概念

Swram是Docker公司推出的官方容器集群平台,基于go语言实现,代码开源在 https://github.com/docker/swarm .2016年2月对架构进行重新设计,推出了v2版本,支持超过1千个节点。作为容器集群管理器,Swarm最大的优势之一就是100%支持标准的Docker API及工具(如Compose,docker-py等),Docker本身就可以很好地与Swarm进行集成。

我们来看下Swarm做了什么?试想一下目前操作docker集群的方式,用户必须单独对每一个容器执行命令,如下图所示:
'三剑客'之Swarm集群架构、集群管理 、服务管理

有了Swarm后,使用多台Docker宿主机的方式就变成了如下图的形式:
'三剑客'之Swarm集群架构、集群管理 、服务管理

2.1.swarm集群

'三剑客'之Swarm集群架构、集群管理 、服务管理
从上图可以看出,Swarm有两个角色(Manager、agent(也可称为worker)),简单说一下这两个角色的作用:

  • Manager:接收客户端服务定义,将任务发送到agnet节点,维护集群期望状态和集群管理功能以及leader选举。默认情况下manager节点也会运行任务,也可以配置只做管理任务。
  • agent:接收并执行从管理节点分配的任务,并报告任务当前的状态,以便Manager节点维护每个服务期望状态。

从上图还可以看出,Manager收到的请求可发细分为4大类:

  1. 第一类,针对已创建容器的操作,Swarm只是起到一个转发请求到特定宿主机的作用。
  2. 第二类,针对Docker镜像的操作。
  3. 第三类,创建新的容器docker create这一命令,其中涉及的集群调度会在下面的内容中分享;
  4. 第四类,其他获取集群整体信息的操作,比如获取所有容器信息、查看Docker版本等。

2.2swarm集群调度策略

Swarm管理了多台Docker宿主机,用户在这些宿主机上创建容器时,究竟会与哪台宿主机产生交互呢?

2.2.1 Filter

Swarm的调度策略可以按照指定调度策略分配容器到节点,但是有时候希望能对这些分配加以干预。比如,让I/O敏感的容器分配到安装了SSD的节点上;让计算敏感的容器分配到CPU核数多的机器上;让网络敏感的容器分配到高带宽的机房上,等等。

这时可以通过过滤器(filter)来实现,,用来帮助用户筛选出符合他们条件的宿主机。目前支持五种过滤器:

  • Constraint
  • Affinity
  • Port
  • Dependency
  • Health

本文为大家介绍前两种过滤器。

1、Constraint过滤器
Constraint过滤器是绑定到节点的键值对,相当于给节点添加标签。可以在启动Docker容器的时候指定,使用swarm启动容器的时候,采用-e constarint:key=value的形式,可以过滤出匹配条件的节点。

下面用个场景为例,我们将分别启动两个容器busybox容器,分别使用过滤器打上红色标签、绿色标签。

#docker service create --replicas 1 -e constraint:color=red busybox ping 127.0.0.1 #docker service create --replicas 1 -e constraint:color=green busybox ping 127.0.0.1

如果目前大家看着上面的命令不太理解,等看完了这篇文章之后,在回过头来看上面的命令就会明白了。

2、Affinity过滤器
Affinity过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。

2.2.2 strategy

使用了filter之后,Swarm还提供了strategy(策略)来选出最终运行容器的宿主机,目前swarm已经提供了有如下几种策略:

  1. random策略:random就是在候选宿主机中(agnet中)随机选择一台的策略;
  2. binpacking策略:binpacking则会在权衡宿主机CPU和内存的占用率之后选择能分配到最大资源的那台候选宿主机;
  3. spread策略:spread尝试把每个容器平均地部署到每个节点上。

与此同时,调度策略支持对节点的信任机制,如果一个节点总是处于工作状态,没有失败连接的情况,那么相同条件下,该节点将会优先被选择。目前对宿主机资源的调度策略还在不断开发中,使用filter和strategy这种组合方式,对容器的部署仍然保留了Docker宿主机粒度的操作,已能满足大多数的需求了。

3.swarm集群部署

3.1 集群环境

服务器 角色 docker版本 系统版本
172.18.18.32 Manager docker 17.12.0-ce centos7.4 x64
172.18.18.33 agent01 docker 17.12.0-ce centos7.4 x64
172.18.18.34 agent02 docker 17.12.0-ce centos7.4 x64

说明:

  • Docker版本需要1.12+及以上;
  • 集群节点之间保证TCP 2377(集群管理)、TCP/UDP 7946(容器网络发现)、UDP 4789(overlay网络)端口通信;

3.2 准备环境

1、安装docker:
需要在Manager和所有agent节点上都安装docker engine,安装方法不详细介绍,可参考 《docker环境安装(Ubuntu、Centos)》

2、配置iptables,开放相关端口(2379、7946、4789):
需要在Manager和所有agent节点都进行配置,如果你没有启动iptables服务,可忽略此步:

[root@Manager ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT [root@agent01 ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT [root@agnet02 ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT

由于环境都是内网中,环境比较安全,我这里就直接配置一条策略对172.18.18.0整个网段都开放了,当然,你也可以按照下面的策略逐条的配置:

#iptables -I INPUT -s 172.18.18.0/24 -p tcp --dport 2379 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p tcp --dport 7946 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p udp --dport 7946 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p udp --dport 4789 -j ACCEPT

3.3 初始化swarm集群

1、swarm管理节点初始化,在Manager操作,非常简单的一条命令:

[root@Manager ~]# docker swarm init --advertise-addr 172.18.18.32 Swarm initialized: current node (jxw920bzistlqnn5webytua87) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

参数说明:
init:初始化swarm集群;
--advertise-addr:通告地址,告知其它swarm节点通过172.18.18.32加入swarm集群;

注意:
初始化swarm之后,会给出一条命令信息,agent节点通过给出的命令信息加入到swarm集群中:docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377

2、agnet节点加入swarm集群:

[root@agent01 ~]# docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 This node joined a swarm as a worker. [root@agnet02 ~]# docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 This node joined a swarm as a worker.

通过上面的信息可以看出,agent两个都已加入swarm,是不是swarm集群配置很简单。在Manager上查看一下agnet节点是否加入进来了:

[root@Manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS jxw920bzistlqnn5webytua87 * Manager Ready Active Leader fjf78k25qr4qchanc63atpn9q agent01 Ready Active 9e69g7gfuptfyiyrjfq41tckv agnet02 Ready Active 

通过docker node ls命令可以得到(ID信息、主机名、节点状态、是否可用以及谁是管理节点),一目了然,下面我们来了解一下swarm集群管理的主要命令有哪些。

3.3 swarm集群命令

'三剑客'之Swarm集群架构、集群管理 、服务管理
通过 docker --help来了解一下,swarm常用的有这几选项:

  • docker node:用来管理swarm节点
  • docker service:用来管理swarm服务(创建服务、查看服务详细信息、删除和升级服务等)
  • docker stack:用来管理swarm堆栈(可以结合compose.yml一起使用)
  • docker swarm:管理swarm(初始化swarm集群、加入swarm集群、离开swarm集群等)

在来通过docker node --help来了解这个选项有哪些命令:
'三剑客'之Swarm集群架构、集群管理 、服务管理
命令说明:

  • demote:从集群中降级一个或多个节点;
  • inspect:在一个或多个节点上显示详细信息;
  • ls:列出群中的节点;
  • prromote:将一个或多个节点提升为Manager;
  • ps:列出在一个或多个节点上运行的任务,默认为当前节点;
  • rm:从群中删除一个或多个节点;
  • update:更新节点;

其实,这些命令和管理docker镜像和容器的命令作用都很相似,所以大家如果在管理docker镜像、容器的这些命令比较熟悉,就自然而然的对swarm这些命令用起来顺手。其它几个选项就不挨个介绍了,大家可以通过 --help去查看了解;

4.swarm服务管理

下面通过busybox镜像来创建服务进行演示,当然你也可以用其它镜像操作(比如centos镜像、nginx镜像等)。swarm服务管理是通过 “docker service”命令进行管理的,以下操作只能在Manager节点操作。

4.1 通过docker service create 命令创建服务

[root@Manager ~]# docker service create --replicas 1 --name test01 busybox top 8xvp5453ostkjhzcy0u91ko6g overall progress: 1 out of 1 tasks 1/1: running verify: Service converged 

参数数明:
--replicas :创建的副本数,我这里先创建1个副本;
--name:容器名称取名为test01
busybox:这个是docker hub中的一个官方镜像;
top:通过busybox镜像运行容器后执行的top命令,因为busybox镜像运行后没有任何进程在跑,如果不在后台跑个进程容器会自动退出,如果你用其它的官方镜像就不需要这种操作,所以我们随便跑个top进程;

4.2 通过docker service ps 查看副本运行情况

[root@Manager ~]# docker service ps test01 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS iwadbu4vyvor test01.1 busybox:latest agnet02 Running Running 4 minutes ago 

是不是发现这个服务被分配到了agent02节点上,状态显示也是Running,而且,这个命令和docker ps很相似。但是,你用docker ps是查看不到这个运行test01这个服务。

4.3 显示服务详细信息

[root@Manager ~]# docker service inspect test01 [root@Manager ~]# docker service inspect --pretty test01 

上面--pretty参数是以人性化的格式打印信息,不加--pretty参数就是以json打印信息;

4.4 扩展服务数量

接下来,我们来演示一下如何把刚才创建的1个test01副本怎么扩展为3个。

[root@Manager ~]# docker service scale test01=3 test01 scaled to 3 overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged 

查看一下是否已扩展了:

[root@Manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS 8xvp5453ostk test01 replicated 3/3 busybox:latest [root@Manager ~]# docker service ps test01 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS iwadbu4vyvor test01.1 busybox:latest agnet02 Running Running 40 minutes ago im6263jsap6l test01.2 busybox:latest agent01 Running Running 2 minutes ago 12r1xk6v8epw test01.3 busybox:latest Manager Running Running 30 seconds ago 

从上面可以看出,扩展的服务分别分配到了两台agnet和一台Manager。也就是说Manager它即可以管理agent、也同样承担运行服务的角色。

4.5 更新服务某些项

比如,我想更新一下test01这几个副本的CPU只能使用宿主机50%的CPU资源

[root@Manager ~]# docker service update --limit-cpu=0.5 test01

然后,查看一下是否更新了,在Limits信息栏中可以看到已经更新了:

[root@Manager ~]# docker service inspect test01 ... "Resources": { "Limits": { "NanoCPUs": 500000000 }, ...

通过docker service update --help查看帮助信息,里面有所有update更新的选项(dns、memory、mount、user等等),本文就不一一介绍演示了,大家--help一下自己看看。

4.6滚动更新、回滚更新服务版本

docker srvice update有一个比较重要的参数要演示一下,它可以对镜像版本进行更新和回滚,比如先创建一个nginx-1.11.5版本的服务,然后通过docker service update --image选项更新到nginx-1.11.6。

[root@Manager ~]# docker service create --replicas 3 --name web_test -p 80:80 nginx:1.11.5

看一下nginx服务是否运行:

[root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS vz1twcdbpaut web_test.1 nginx:1.11.5 agent01 Running Running 4 minutes ago kmcdo4cifygf web_test.2 nginx:1.11.5 agnet02 Running Running 5 minutes ago ipynj6l9hegu web_test.3 nginx:1.11.5 Manager Running Running 3 minutes ago 

接下来,我们通过--image选项把nginx更新到版本1.11.6:

[root@Manager ~]# docker service update --image nginx:1.11.6 web_test

查看一下更新后的信息:

[root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS js9tvwk3ffg9 web_test.1 nginx:1.11.6 agent01 Running Running 2 minutes ago vz1twcdbpaut \_ web_test.1 nginx:1.11.5 agent01 Shutdown Shutdown 2 minutes ago mhbd0fdpofq8 web_test.2 nginx:1.11.6 agnet02 Running Running 3 minutes ago kmcdo4cifygf \_ web_test.2 nginx:1.11.5 agnet02 Shutdown Shutdown 4 minutes ago jswemeuox4yk web_test.3 nginx:1.11.6 Manager Running Running about a minute ago ipynj6l9hegu \_ web_test.3 nginx:1.11.5 Manager Shutdown Shutdown about a minute ago 

从上面可以看出,DESIRED STATE状态为Shutdown的服务版本为1.15,状态为Running的服务版本为1.16了,说明更新是OK的。

最后,来演示一下通过--rollback选项如何回滚服务版本:

[root@Manager ~]# docker service update --rollback web_test web_test rollback: manually requested rollback overall progress: rolling back update: 3 out of 3 tasks 1/3: running [> ] 2/3: running [> ] 3/3: running [> ] verify: Service converged 

再来看一下是否回滚:

[root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS vrwxibtkjhvg web_test.1 nginx:1.11.5 agent01 Running Running 2 minutes ago js9tvwk3ffg9 \_ web_test.1 nginx:1.11.6 agent01 Shutdown Shutdown 2 minutes ago vz1twcdbpaut \_ web_test.1 nginx:1.11.5 agent01 Shutdown Shutdown 6 minutes ago dvcy2q4b3xoy web_test.2 nginx:1.11.5 agnet02 Running Running 3 minutes ago mhbd0fdpofq8 \_ web_test.2 nginx:1.11.6 agnet02 Shutdown Shutdown 3 minutes ago kmcdo4cifygf \_ web_test.2 nginx:1.11.5 agnet02 Shutdown Shutdown 7 minutes ago oxx0lslzzt9h web_test.3 nginx:1.11.5 Manager Running Running 42 seconds ago jswemeuox4yk \_ web_test.3 nginx:1.11.6 Manager Shutdown Shutdown 42 seconds ago ipynj6l9hegu \_ web_test.3 nginx:1.11.5 Manager Shutdown Shutdown 5 minutes ago 

是不是状态为Running的nginx又回到了1.15的版本了。那么,我们在实际工作中这种对服务更新和回滚会用到哪呢?大家可以留言一起讨论一下。

本章内容到此结束,喜欢我的文章,请点击最上方右角处的《关注》!!!
'三剑客'之Swarm集群架构、集群管理 、服务管理

原文链接:https://blog.51cto.com/ganbing/2090290
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章