创建集群

  在任意节点下通过 docker swarm init 命令创建一个新的 Swarm 集群并加入,且该节点会默认成为 Manager 节点。

docker swarm init --advertise-addr xx.xx.xx.xx

截屏2021-02-03 下午2.53.43

​ 通常,第一个加入集群的管理节点将成为 Leader,后来加入的管理节点都是 Reachable。当前的 Leader 如果挂掉,所有的 Reachable 将重新选举一个新的 Leader。

加入集群

  Docker 中内置的集群模式自带了公钥基础设施(PKI)系统,使得安全部署容器变得简单。集群中的节点使用传输层安全协议(TLS)对集群中其他节点的通信进行身份验证、授权和加密。

  默认情况下,通过 docker swarm init 命令创建一个新的 Swarm 集群时,Manager 节点会生成新的根证书颁发机构(CA)和密钥对,用于保护与加入群集的其他节点之间的通信安全。

  Manager 节点会生成两个令牌,供其他节点加入集群时使用:一个 Worker 令牌,一个 Manager 令牌。每个令牌都包括根 CA 证书的摘要和随机生成的密钥。当节点加入群集时,加入的节点使用摘要来验证来自远程管理节点的根 CA 证书。远程管理节点使用密钥来确保加入的节点是批准的节点。

/resources/articles/docker/tls.png

Manager

  若要向该集群添加 Manager 节点,管理节点先运行 docker swarm join-token manager 命令查看管理节点的令牌信息。

docker swarm join-token manager

截屏2021-02-03 下午3.00.57

  然后在其他Docker节点上运行上述命令加入 Swarm 集群,该节点角色为 Manager。

Worker

  通过创建集群时返回的结果可以得知,要向这个集群添加一个 Worker 节点,运行下图中的命令即可。或者管理节点先运行 docker swarm join-token worker 命令查看工作节点的令牌信息。

截屏2021-02-03 下午3.11.25

​ 然后在其他节点上运行 docker swarm join 并携带令牌参数加入 Swarm 集群,该节点角色为 Worker。

查看集群信息

  在任意 Manager 节点中运行 docker info 可以查看当前集群的信息。

docker info

截屏2021-02-04 上午11.23.39

  

查看集群节点

  在任意 Manager 节点中运行 docker node ls 可以查看当前集群节点信息。

docker node ls

截屏2021-02-04 上午11.20.00

* 代表当前节点,现在的环境为 3 个管理节点构成 1 主 2 从,以及 2 个工作节点。

  节点 MANAGER STATUS 说明:表示节点是属于 Manager 还是 Worker,没有值则属于 Worker 节点。

  • Leader:该节点是管理节点中的主节点,负责该集群的集群管理和编排决策;
  • Reachable:该节点是管理节点中的从节点,如果 Leader 节点不可用,该节点有资格被选为新的 Leader;
  • Unavailable:该管理节点已不能与其他管理节点通信。如果管理节点不可用,应该将新的管理节点加入群集,或者将工作节点升级为管理节点。  

  节点 AVAILABILITY 说明:表示调度程序是否可以将任务分配给该节点。

  • Active:调度程序可以将任务分配给该节点;
  • Pause:调度程序不会将新任务分配给该节点,但现有任务仍可以运行;
  • Drain:调度程序不会将新任务分配给该节点,并且会关闭该节点所有现有任务,并将它们调度在可用的节点上。

删除节点  

Manager

  删除节点之前需要先将该节点的 AVAILABILITY 改为 Drain。其目的是为了将该节点的服务迁移到其他可用节点上,确保服务正常。最好检查一下容器迁移情况,确保这一步已经处理完成再继续往下。

docker node update --availability drain 节点名称|节点ID

  然后,将该 Manager 节点进行降级处理,降级为 Worker 节点。

docker node demote 节点名称|节点ID

  然后,在已经降级为 Worker 的节点中运行以下命令,离开集群。

docker swarm leave

  最后,在管理节点中对刚才离开的节点进行删除。

docker node rm 节点名称|节点ID

  

Worker

  删除节点之前需要先将该节点的 AVAILABILITY 改为 Drain。其目的是为了将该节点的服务迁移到其他可用节点上,确保服务正常。最好检查一下容器迁移情况,确保这一步已经处理完成再继续往下。

docker node update --availability drain 节点名称|节点ID

  然后,在准备删除的 Worker 节点中运行以下命令,离开集群。

docker swarm leave

## 解散集群
docker swarm leave --force 

  最后,在管理节点中对刚才离开的节点进行删除。

docker node rm 节点名称|节点ID

 

服务部署

注意:跟集群管理有关的任何操作,都是在 Manager 节点上操作的。

创建服务  

  详细的命令可以查询docker官方文档,这里我以我们的实际情况来举个例子:

docker service create \
--replicas 2 \
--name report-middle-service \
--network=host \
--mount type=bind,source=/home/application/logs,destination=/logs \
--env spring.cloud.nacos.config.namespace=xxxxxxx \
image_name -v /home/application/logs:/logs  

截屏2021-02-04 下午2.03.46

  • docker service create:创建服务;
  • --replicas:指定一个服务有几个实例运行;
  • --name:服务名称;
  • --network: 网络模式;
  • --mount:设置数据卷,我这里是绑定宿主机目录;
  • --env:设置环境变量,我这里设置nacos的namespace

  

查看服务

  可以通过 docker service ls 查看运行的服务。

docker service ls

截屏2021-02-04 下午2.10.29

  可以通过 docker service inspect 服务名称|服务ID 查看服务的详细信息。

docker service inspect 服务名称|服务ID

  可以通过 docker service ps 服务名称|服务ID 查看服务运行在哪些节点上。

docker service ps

  在对应的任务节点上运行 docker ps 可以查看该服务对应容器的相关信息。  

弹性服务

  将 service 部署到集群以后,可以通过命令弹性扩缩容 service 中的容器数量。在 service 中运行的容器被称为 task(任务)。

  通过 以下两种方式 可以将 service 运行的任务扩缩容为 n 个。

docker service scale 服务名称|服务ID=n

docker service update --replicas n
值得注意的是,这里我的network设置为host,需要控制一台机器最多启动一个服务容器,否则端口冲突

  在 Swarm 集群模式下真正意义实现了所谓的弹性服务,动态扩缩容一行命令搞定,简单、便捷、强大。  

删除服务  

  通过 docker service rm 服务名称|服务ID 即可删除服务。

docker service rm 服务名称|服务ID

  

常用命令

docker swarm

命令说明
docker swarm init初始化集群
docker swarm join-token worker查看工作节点的 token
docker swarm join-token manager查看管理节点的 token
docker swarm join加入集群

docker node

命令说明
docker node ls查看集群所有节点
docker node ps查看当前节点所有任务
docker node rm 节点名称\节点ID删除节点(-f强制删除)
docker node inspect 节点名称\节点ID查看节点详情
docker node demote 节点名称\节点ID节点降级,由管理节点降级为工作节点
docker node promote 节点名称\节点ID节点升级,由工作节点升级为管理节点
docker node update 节点名称\节点ID更新节点

docker service  

命令说明
docker service create创建服务
docker service ls查看所有服务
docker service inspect 服务名称\服务ID查看服务详情
docker service logs 服务名称\服务ID查看服务日志
docker service rm 服务名称\服务ID删除服务(-f强制删除)
docker service scale 服务名称\服务ID=n设置服务数量
docker service update 服务名称\服务ID更新服务

结尾

关于Docker Swarm的大概实践就到这里,整体看来比较容易上手,单纯的Docker容器集群管理工具,后续会尝试在生产环境应用,也会把遇到的问题记录下来。

参考资料


朱世伟
7 声望7 粉丝