Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
阅读原文时间:2023年09月22日阅读:6

Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客。Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8S对于大型项目在各方面有着明显的优势。技术选型需要针对公司实际情况选择,架构往往是一步一步随着业务变化升级演变而来,本文主要讲解Docker Swarm + Harbor + Portainer 一套组合拳打法。

前置条件

安装Docker:Docker 安装,常用命令 - Net码畜 - 博客园 (cnblogs.com)

安装Harbor:harbor 搭建和部署 - Net码畜 - 博客园 (cnblogs.com)

安装Portainer:portainer安装,配置,使用 - Net码畜 - 博客园 (cnblogs.com)

Docker Swarm 集群

Docker Swarm 是 Docker 的集群管理工具,Swarm集群的节点分两种:管理节点(manager node),工作节点(work node),两者的主要区别是对集群进行管理需要在管理节点上进行操作,包括集群创建,配置,服务创建,配置等有关工作。除此之后两者没有区别,管理节点和工作节点一样会运行contarner。

首先我们准备一台虚拟主机安装docker,然后初始化集群:

docker swarm init

此时当前虚拟机就成功被始化为集群管理节点,我们通过以下命令获取加入集群的代码,这命令仅能在管理节点上使用:

docker swarm join-token worker

命令执行完后,我们将得到类似:docker swarm join --token SWMTKN-1-4omm72rws6flf5icom3w1clqvjtkmwdki8m4hhtxobq3hzwsqe-7vjw75ebdue32yevwirggpk4l 192.168.3.70:2377 的结果,将command复制到其它虚拟机(己安装docker)执行,该虚拟机将以工作节点(worker)的身份加入集群。重复执行再添加三个工作节点,便可以得到上述截图四台虚拟机组成的docker swarm 集群。

至此docker swarm集群搭建就完成了,是不是非常简单方便。所以说针对中小型应用,docker swarm有着非常小的学习,管理的成本,很合适。下面贴出常用的docker swarm 集群管理命令:

docker swarm init  //docker swarm init
docker swarm join-token worker //查看加入woker的命令。
docker swarm join-token manager //查看加入manager的命令
docker swarm join //加入集群
docker swarm leave  //退出集群

docker node ls //查看集群节点
docker node rm  //删除某个节点(-f强制删除)
docker node inspect //查看节点详情
docker node demote  //节点降级
docker node promote //节点升级
docker node update  //更新节点

创建集群之后便是创建服务,也就是一个集群可以包括多个服务,也就意味上可以在一个集群上部署多个项目,创建服务的时候我们就不需要再对节点进行管理,节点的管理归属集群管理。也就是说创建服务是基于当前集群的节点进行部署,当你需要扩展节点的时候,需要先将节点加入集群,然后再更新服务配置。

docker service create --name testweb --replicas 4 -p 80:80 webapplication2:latest

上面命令是创建一个名称为:testweb的服务。replicas(副本数)为:4,我们集群节点也刚好4个,就是说每一个节点都会有一个副本,假如replicas为2,那么我们的集群将有两个节点部署副本,剩余两个节点闲置,当然我们也可以通过更新命令重置replicas数量。端口映射为80:80,镜像及版本是webapplication2:latest。

至此服务也正式启动了,无论我们从四个节点那个IP进行访问,都是可以成功访问到网站。

下面是管理服务常用的命令:

docker service create   //创建服务
docker service ls       //查看所有服务
docker service inspect  //查看详情
docker service logs     //查看服务日志
docker service rm       //删除服务
docker service scale    //设置服务副本数量
docker service update   //更新服务配置

Portainer管理

手动管理docker swarm集群是有点繁琐,以服务创建和更新镜像为例,你需要事先在每个节点上面拉取最新的镜像,docker swarm在创建服务或更新服务的时候不会主动从仓库中拉取或更新镜像,如果节点或服务多的时候就蛋痛了。一个良好的管理工具就事半功倍来解放你的双手提高工作效率了。安装好Portainer 之后我们配置接入管理docker swarm:

API 连接方式,需要配置远程dcoker节点,dcoker管理节点编辑配置文件,配置完之后,重启一下docker。

vi /usr/lib/systemd/system/docker.service

管理节点重启之后,Portainer 就可以通过API连接并且进行管理,可以看到连接的管理节点。

Portainer连接上之后可以轻松管理docker swarm,具体的细节自己摸索一下之后基本就可以拿捏了。简单创建一个服务,填写下面红色框架必填值就可以快速默认值创建一个服务。

自行摸搜一下你会发现Portainer管理非常方便,无论是创建服务,更新镜像,Portainer会自动帮你拉取最新镜像然后更新,UI动动鼠标就可以管理docker swarm集群。

自部化部署

配合Harbor的Webhooks,我们可以实现推送镜像之后实现自动化部署。我们创建服务的时候将上图的绿色框开关打开就支持Webhooks通知docker swarm集群更新,当然这个是Portainer的功能而不是docker swarm自带的功能。

我们进入事先部署的harbor系统,进入项目管理配置webhooks,配置成功之后就可以实现自动化部署了。

OK,我们简单总结一下自动化部署流程,开发人员打包镜像送到至仓库,仓库配置"Artifact pushed"事件,在这个事件中配置Webhooks地址,然后harbor会自动触发提交这个地址通知至Portainer,Portainer开始执行更新集群镜像工作。docker swarm默认值在更新中会提断不间断服务,可以放心进行更新,也支持更新后回滚。

docker swarm实现高可用性机制来确保集群的稳定性和可靠性。

  • Manager 节点高可用:Docker Swarm 集群中有一个或多个 Swarm Manager 节点,它们协调集群中的容器调度和管理。
  • 节点监测:Swarm Manager 定期监测集群中的节点状态。
  • 服务冗余和复制:Docker Swarm 通过创建服务副本来提供容器的冗余和高可用性。可以指定服务的副本数量,并将它们分布在集群的不同节点上。如果某个节点失效,Swarm Manager 会自动将该节点上的任务重新分配到其他可用节点上的副本。
  • 负载均衡:Docker Swarm 集群可以通过内置的负载均衡机制来分发流量到运行在不同节点上的容器副本。这样,即使某个节点失效,负载均衡机制仍然可以将流量转发到其他节点上的容器副本,确保应用程序的连续可用性。
  • 故障恢复:如果一个节点失效并重新加入集群,Swarm Manager 会自动将该节点重新纳入集群,并分配之前节点上的任务。这种故障恢复机制确保了集群的稳定性和容错性。

高伸缩

系统的伸缩性是指系统性能扩大或扩小的容易程度,一个高伸缩的系统可以轻易的扩展或减少集群性能。

  1. Docker Swarm支持使用更新命令设置服务的副本数量来扩展副本,需要注意是当副本的数量>集群节点的数量的时候,再增加副本数对服务的性能提升意义,应该增加集群节点。
  2. Docker Swarm支持自动扩展副本数,可以设置基于CPU,内存等指标数的阈值来设置规则自动增加副本数。
  3. 当增加副本数无法有效扩展性能时,可以通过命令增加集群节点,让更多的机器加入集群以增加集群算力提高性能。

Docker Swarm + Harbor + Portainer 的组合拳基本简单介绍完了,更多命令和细节自己去摸索吧~