myfreax

如何在Docker的swarm上构建Nginx集群

Docker Engine从1.12开始整合swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面开始创建Docker集群,但是要先认识一些集群swarm模式关键概念

5 min read
By myfreax
如何在Docker的swarm上构建Nginx集群

Docker Engine从1.12开始整合swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面开始创建Docker集群,但是要先认识一些集群swarm模式关键概念

本文将说明如何构建Nginx集群。

关键概念

Swarm

集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

Node

一个节点(node)是已加入到swarm的Docker引擎的实例
当部署应用到集群,你将会提交服务定义到管理节点,接着Manager管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点

服务和任务

服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像

任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

创建swarm

在开始之前先创建先把节点创建起来,下面将会创建三个节点,分别是manager节点,两个worker节点,manager节点在主机上部署,两个worker节点在虚拟机中部署(这里不限于是虚拟机只要可以联网的机器即可比如VPS等),虚拟机使用Virtualbox(在生产环境中建议使用CoreOs)

CoreOs 是为集群部署而设计的一个轻量级的Linux操作系统

初始化

在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥

➜  docker swarm init --advertise-addr 192.168.1.2
这里要注意的是IP地址,如果你的worker节点部署在远程的VPS上,那么你应该给个远程的外网可以访问的IP地址,在多网卡的机器上需要注意这个问题

创建两个worker节点

可以使用docker-machine创建,Linux用户请自行安装docker-machine分别命名为node0,node1

➜  docker-machine  create -d virtualbox nodeX

使用docker-machine的命令登录node0,node1节点并加入到swarm集群中

➜ docker-machine ssh node0 ##登录到nodeo节点,node1一样

加入到swarm集群中

➜ docker swarm join \
--token SWMTKN-11m0u46krm5khxd7a46ugyxbsg16nqse8r8r0fdprv1zkvm99kj2sq8vm12ho9gqi3hwowbunugw \
192.168.1.2:2377

在两个节点上执行加入swarm集群的命令,现在manager节点和两个worker节点已经建立,并且可以在manager节点查看

➜ docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4qva9xt8q9pyts6glaik1dsk1 *  Freax     Ready   Active        Leader
8xwcgflzhcq9xfefxjnrpyoyh    node1     Ready   Active        
f4me2j2vmq4g0xb9eihrybz57    node0     Ready   Active

部署服务

在manager节点部署nginx服务,服务数量为10个,公开指定端口是8080映射容器80,使用nginx镜像

➜ docker service create --replicas 10 --name nginx --publish 8080:80  nginx

执行这个命令时manager节点分发任务到各个worker节点,包括Manager节点本身(管理节点也可以是worker节点),可以通过下面的命令查看

➜ docker service ps nginx
ID                         NAME      IMAGE  NODE   DESIRED STATE  CURRENT STATE              ERROR
w2k6zsgssnguzsj  nginx.1   nginx  Freax  Running        Running about an hour ago  
3t9lpx6xeyi3ywu  nginx.2   nginx  Freax  Running        Running about an hour ago  

.....

jif5q0hgbg800jh  nginx.10  nginx  Freax  Running        Running about an hour ago  

可以看到Manager节点也运行nginx服务

测试

现在可以在浏览器中输入192.168.1.2,docker就会使用routing mesh作为负载均衡器分发请求给各个节点的nginx服务,如果在生产环境中请使用Haproxy或者其它的高性能的TCP/HTTP负载均衡器

扩展服务

现在可以继续加入更多的节点扩展服务,第一步增加节点

➜  docker-machine  create -d virtualbox node2

继续在Manager节点增加服务

➜ docker service scale nginx=15
➜ docker service ps nginx      
ID                         NAME          IMAGE  NODE   DESIRED STATE  CURRENT STATE                    ERROR
8uj879zlkl7o68gl7  nginx.1       nginx  node1  Running        Preparing 1 seconds ago          
......
ywbav9etj7osqyag  nginx.15      nginx  node0  Running        Preparing 1 seconds ago  

swarm工作方式

Node

How nodes work

services

服务, 任务, 容器

Services tasks and containers

任务与调度

Tasks and scheduling

服务副本与全局服务

Replicated and global services
Thank Docker