文章目录
- Docker Swarm 简介
- 基本命令
- 搭建安全Swarm集群
- 初始化一个全新的Swarm
- 列出Swarm中的节点
- 添加新的工作节点和管理节点
- 接入工作节点
- 接入管理节点
- Swarm管理器的高可用性(HA Hight Availability)
- 锁定 Swarm
- 重启管理节点
- 重启管理节点提供解锁码后重新连入集群
- Swarm服务
- 查看所有服务
- 查看服务副本列表和各副本状态
- 查看服务详细信息
- 副本服务 vs 全局服务
- 服务的扩缩容
- 删除服务
- 滚动升级
- 故障排除
- 参考
Docker Swarm 简介
- Docker Swarm 包括方面:一个企业级的Docker安全集群,以及一个为微服务应用编排引擎
- 集群方面,Docker Swarm 将一个或多个Docker结点组织起来,使得用户能够以集群方式管理它们,Swarm默认内置有加密的分布式集群存储(Encrypted Distributed Cluster Store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌(Secure Cluster Join Token)以及一套简化数字证书管理的PKI(Public Key Infrastructure)
- 编排方面,Docker Swarm 提供了一套丰富的API使得部署和管理复杂的微服务应用变得易如反掌,通过将应用定义在声明式配置文件中,就可以使用原生的Docker命令完成部署。此外还可以执行滚动升级、回滚以及扩缩容操作
- 一个Swarm由一个或多个Docker节点组成,所以节点要求用可靠的网络相连,节点会被配置为管理节点(Manager)或工作节点(Worker),管理节点否则集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点。工作节点负责接收来自管理节点的任务并执行
基本命令
命令 | 作用 |
docker swarm init --advertise-addr 10.0.0.1:2377 --listen-addr 10.0.0.1:2377 | 初始化当前Docker节点为第一个管理节点,并切换为Swarm模式,设置当前管理节点地址 advertise-addr,设置承载Swarm流量节点地址listen-addr |
docker node ls | 列出Swarm中的节点 |
docker swarm join-token | 获取添加新的工作节点和管理节点到Swarm的命令和Token |
docker swarm update --autolock=true | 锁定 Swarm ,让重启的管理节点需要提供集群解锁码才有权重新接入集群 |
docker swarm unlock | 重启管理节点使用该命令提供解锁码后重新连入集群 |
docker service create --name web-fe -p 8080:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci | 创建服务web-fe ,让集群中每个节点(主机)的8080端口和服务副本内部的8080进行映射,replicas指定有5个服务副本,nigelpoulton/pluralsight-docker-ci 指定服务副本(容器集群)上面运行的镜像 |
docker service ls | 查看所有运行中服务 |
docker service ps web-fe | 查看服务web-fe的副本列表及各副本的状态 |
docker service inspect --pretty web-fe | 查看服务web-fe的详细状态 |
docker service scale web-fe=10 | 该命令会将服务副本数由5个增加到10个 |
docker service rm web-fe | 删除服务web-fe |
docker service update --image nigelpoulton/tu-demo:v2 --update-parallelism 2 --update-delay 20s uber-svc | 对服务uber-svc执行滚动更新,更新其容器依赖的新镜像为 nigelpoulton/tu-demo:v2,每次更新2个副本由参数update-parallelism指定,每次更新周期为20s由update-delay指定 |
docker service logs | 查看Swarm服务的日志 |
搭建安全Swarm集群
在网络方面,需要在路由器和防火墙开放如下端口:
- 2377/tcp:用于客户端于Swarm进行安全通信
- 7946/tcp与7946/udp:用于控制面gossip分发
- 4780/udp:用于VXLAN的覆盖网络
搭建Swarm的大致流程,初始化第一个管理节点→加入额外的管理节点→加入工作节点→完成
初始化一个全新的Swarm
docker swarm init \
--advertise-addr 10.0.0.1:2377 \
--listen-addr 10.0.0.1:2377
- 不包含在任何Swarm中的Docker节点,该Docker节点被称为运行于单引擎(Single-Engine)模式,一旦加入Swarm集群,则切换为Swarm模式
- docker swarm init 会通知Docker来初始化一个新的Swarm,并且将自身设置为第一个管理节点。同时也会使该节点开启Swarm模式
- –advertise-addr 10.0.0.1:2377 指定其他节点用来连接到当前管理节点的IP和端口,这一指令是可选的,当节点有多个IP时,可以指定其中一个,或者指定该节点上没有的IP,如负载均衡服务器的IP
- –listen-addr 指定用于承载Swarm流量的IP和端口,其设置通常与-advertise-addr相匹配,但是当节点上有多个IP的时候,可用于指定具体某个IP
列出Swarm中的节点
docker node ls
列出Swarm中的节点
添加新的工作节点和管理节点
docker swarm join-token worker
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0uahebax...c87tu8dx2c \
10.0.0.1:2377
docker swarm join-token mananer
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0uahebax...ue4hv6ps3p \
10.0.0.1:2377
使用docker swarm join-token 命令是为了获取添加新的工作节点和管理节点到Swarm的命令和Token
接入工作节点
docker swarm join \
--token SWMTKN-1-0uahebax...c87tu8dx2c \
10.0.0.1:2377 \
--advertise-addr 10.0.0.4:2377 \
--listen-addr 10.0.0.4:2377
使用上面接入工作节点的Token
接入管理节点
docker swarm join \
--token SWMTKN-1-0uahebax...ue4hv6ps3p \
10.0.0.1:2377 \
--advertise-addr 10.0.0.4:2377 \
--listen-addr 10.0.0.4:2377
使用上面接入管理节点的Token
Swarm管理器的高可用性(HA Hight Availability)
- Swarm管理节点内置有对HA的支持,即使有一个或多个节点发送故障,剩余管理节点也会继续保证Swarm运转
- Swarm实现了一种主从方式的多管理节点的HA,即使有多个管理节点也只有一个节点出于活动状态,处于活动状态的节点被称为主节点(leader),而主节点也是唯一一个会对Swarm发送控制命令的节点,如果一个备用管理节点接收到了Swarm命令,则它会将其转发给主节点
- Swarm使用Raft共识算法,需要部署奇数个管理节点,不要部署太多管理节点(通常3个或者5个),部署奇数个,当网络发送分区(网络链路故障)的时候,如5个节点分为两个区3个节点和2个节点,有三个节点的分区就执行多数协议,即在集群中只要有大多数节点知道发送了什么,就可以保证一致性,少于多数的分区不执行变更,等待网络故障修复后,会询问其他节点情况。也可以减少脑裂(Split-Brain)出现情况,如果只有四个管理节点,当分区每个区都是2个管理节点时,就会无法工作,因为无法执行多数协议
- 对于所有共识算法来说,更多的参与节点意味着需要花费更多的时间来达成共识,所以最好部署5个或三个节点
锁定 Swarm
docker swarm update --autolock=true
- 重启一个旧的管理节点或者进行备份恢复可能对集群造成影响,一个旧的管理节点重新接入Swarm会自动解密并获得Raft数据库中长时间序列的访问权,这会带来安全隐患。进行备份恢复可能会抹掉最新的Swarm配置
- 为了规避上述问题,Docker提供自动锁机制来锁定Swarm,这会强制要求重启的管理节点在提供一个集群解锁码之后才有权重新接入集群(也可以防止原来的主节点宕机后重新接入集群,和当前主节点一起成为双主,双主也是一种脑裂问题)
重启管理节点
service docker restart
重启管理节点提供解锁码后重新连入集群
docker swarm unlock
Swarm服务
docker service create --name web-fe \
-p 8080:8080 \
--replicas 5 \
nigelpoulton/pluralsight-docker-ci
- 使用 docker service create 命令创建一个新的服务,服务名字为web-fe,将每个节点(主机)上的8080端口映射到服务副本内部的8080端口,–replicas 5 告知Docker应该总是有5个此服务的副本,最后告知使用nigelpoulton/pluralsight-docker-ci镜像作为副本(创建容器)
- 所有服务都会被Swarm持续监控,如果web-fe副本的某个工作节点宕机了,则web-fe的实际状态从5个副本将为4个,从而不能满足期望状态的要求,此时Docker会启动一个新的web-fe副本,让实际状态与期望状态保持一致
查看所有服务
docker service ls
查看服务副本列表和各副本状态
docker service ps web-fe
查看服务详细信息
docker service inspect --pretty web-fe
副本服务 vs 全局服务
- 服务的默认复制模式(Replication Mode)是副本模式(replicated),这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中
- 另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本,副本模式每个节点可能运行多个副本
服务的扩缩容
docker service scale web-fe=10
该命令会将服务副本数由5个增加到10个
docker service scale web-fe=5
该命令会将服务副本数从10个降到5个
删除服务
docker service rm web-fe
滚动升级
docker service update \
--image nigelpoulton/tu-demo:v2 \
--update-parallelism 2 \
--update-delay 20s uber-svc
- docker service update 通过变更该服务期望状态的方式来更新运行中的服务,这一次指定更新镜像为标签(tag)为v2的新镜像
- 用–update-parallelism来声明每次使用新镜像更新两个副本,–update-delay每次更新副本之间有20s延迟
- 最后告诉Docker以上变更是针对uber-svc服务开展的
故障排除
docker service logs
Swarm服务的日志可以通过执行docker service logs命令来查看
参考
《 深入浅出Docker 》