Docker Swarm部署集群
- 1 Docker Swarm简介
- 2 docker swarm 的工作模式
- 3 Docker Swarm的优点
- 4 Docker Swarm实践
- 4.1 创建 Swarm 集群
- 4.2 创建集群服务
- 4.3 部署swarm监控
- 4.4 弹性伸缩
- 4.5 模拟宕机node节点
- 4.6 改变节点角色
- 5 harbor+swarm集群
- 6 Docker Swarm滚动更新
1 Docker Swarm简介
Docker Swarm是一个Dockerized化的分布式应用程序的本地集群,它是在Machine所提供的功能的基础上优化主机资源的利用率和容错服务。Docker Swarm支持用户创建可运行Docker Daemon的主机资源池,然后在资源池中运行Docker容器。Docker Swarm可以管理工作负载并维护集群状态。
除了资源优化,Docker Swarm可以保证应用的高可用性和容错性。Docker Swarm会不断的检查Docker Daemon所在主机的健康状态。当某个主机不可用时,Swarm就会将容器迁移到新的主机上。
Docker Swarm的亮点之一是它可以在应用的生命周期内扩展,也就是说当应用从一个主机扩展到多个的时候,用户可以保证接口的一致性。
2 docker swarm 的工作模式
1)节点分为管理 (manager) 节点和工作 (worker) 节点。管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。工作节点接收来自管理节点的任务并执行。
2)任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
3)服务 (Services) 是指一组任务的集合,服务定义了任务的属性,在管理机或工作节点上执行,是群体系统的中心结构、用户与群体交互的主要根源。创建服务时,需要指定要使用的容器镜像
4)Worker节点也是Docker Engine的实例,目的是用来运行容器。Worker节点不会像Manager节点那样提供集群的管理、任务调度和API。可以创建仅有一个manager节点的Swarm,但是不能在没有manager节点的前提下,创建Worker节点。在默认情况下,manager节点同时也是一个worker节点。
3 Docker Swarm的优点
1)批量创建服务:建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式
2)强大的集群的容错性:当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,在集群中剩余的空闲节点上,重新拉起容器副本。docker service不仅仅是批量启动服务,而且在集群中定义了一种状态。Cluster会持续检测服务的健康状态,并维护集群的高可用性。
3)服务节点的可扩展性:Swarm Cluster提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。
4)调度机制:其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。
4 Docker Swarm实践
实验环境:
server1、server2、server3、server4部署docker
4.1 创建 Swarm 集群
- 初始化集群:
docker swarm init
- 查看swarm集群的节点:
docker node ls
- 将server2和server3加入swarm集群
docker swarm join --token SWMTKN-1-0tidfvhq3hi7u0mauqzt0atprzltsiv9v1eex2kc3gokee9xc6-97g5qfhya86favzdz0zkuvzbo 172.25.12.1:2377
- 查看swarm集群的节点:
docker node ls
,server2和server3成功加入集群
4.2 创建集群服务
- 下载
mapp:v1
镜像:(各个节点)
docker pull ikubernetes/myapp:v1
- 给镜像重新打标签:
docker tag ikubernetes/myapp:v1 myapp:v1
- 创建集群服务
docker service create --name my_cluster --replicas 4 -p 80:80 myapp:v1
## --name 服务名称命名为 my_cluster
## --replicas 设置启动的示例数为4
## myapp:v1镜像
- 列出服务的任务:
docker service ps my_cluster
- 测试:curl 172.25.12.1/hostname.html
4.3 部署swarm监控
- 下载监控镜像:
docker pull dockersamples/visualizer
,各个节点
- 创建监听服务
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
- 测试:
172.25.12.2:8080
4.4 弹性伸缩
- 将服务的数量拉伸或缩减到10个:
docker service scale my_cluster=10
4.5 模拟宕机node节点
如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。当宕机的节点恢复后,它转移出去的task实例不会主动转移回来,只能等别的节点出现故障后或使用 scale 进行横向拓展后,转移、新增task实例到它的上面。
- 停止server3的docker服务:
systemctl stop docker.service
,原本运行在server3的task会调度到其他节点
- 恢复server3的docker服务后,原本运行在其他节点的task也不会调度到server3,只有当task重新分配时,会优先分配到server3
systemctl start docker.service
- Swarm 动态扩展服务:
docker service scale my_cluster=15
4.6 改变节点角色
- 将server2节点加入到群集管理器中:
docker node promote server2
- 列出群集(swarm)中的节点:
docker node ls
- 从群集(swarm)管理器中降级server1节点:
docker node demote server1
- 列出群集(swarm)中的节点:
docker node ls
- 脱离集群:docker swarm leave
- 从群集(swarm)删除server1节点:
docker node rm server1
5 harbor+swarm集群
(1)部署hardor仓库,启动仓库,将镜像上传至hardor仓库
cd harbor/
./install.sh --with-chartmuseum
- 将镜像上传至harbor仓库
docker tag myapp:v1 red.westos.org/library/myapp:v1
docker push red.westos.org/library/myapp:v1
docker tag dockersamples/visualizer:latest red.westos.org/library/visualizer:latest
docker push red.westos.org/library/visualizer:latest
- 优先到hardor仓库下载镜像:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://red.westos.org"]
}
- 重启docker服务:
systemctl reload docker.service
(2)创建swarm集群服务:
docker service create --name my_cluster --replicas 4 -p 80:80 myapp:v1
(3) 部署swarm监控
- 创建监听服务(自动从hardor仓库下载)
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock visualizer
- 测试:
172.25.12.2:8080
- 容器的拉伸:
docker service scale my_cluster=9
- 容器的缩减:
docker service scale my_cluster=3
6 Docker Swarm滚动更新
- 将需要更新的镜像上传至hardor仓库,可以更快的实现Docker Swarm滚动更新
docker pull ikubernetes/myapp:v2
docker tag ikubernetes/myapp:v2 red.westos.org/library/myapp:v2
docker push red.westos.org/library/myapp:v2
- 滚动更新
docker service update --image myapp:v2 --update-parallelism 3 --update-delay 5s my_cluster
--image 指定要更新的镜像
--update-parallelism 指定最大同步更新的任务数
--update-delay 指定更新间隔