Docker Swarm的集群实践

Docker Swarm的集群实践

创建集群

  在任意节点下通过 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容器集群管理工具,后续会尝试在生产环境应用,也会把遇到的问题记录下来。

参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享