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) 是指一组任务的集合,服务定义了任务的属性,在管理机或工作节点上执行,是群体系统的中心结构、用户与群体交互的主要根源。创建服务时,需要指定要使用的容器镜像

docker mongodb集群测试 docker swarm集群_docker

4)Worker节点也是Docker Engine的实例,目的是用来运行容器。Worker节点不会像Manager节点那样提供集群的管理、任务调度和API。可以创建仅有一个manager节点的Swarm,但是不能在没有manager节点的前提下,创建Worker节点。在默认情况下,manager节点同时也是一个worker节点。

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_02

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

docker mongodb集群测试 docker swarm集群_Docker_03

  • 查看swarm集群的节点:docker node ls

docker mongodb集群测试 docker swarm集群_docker_04

  • 将server2和server3加入swarm集群
docker swarm join --token SWMTKN-1-0tidfvhq3hi7u0mauqzt0atprzltsiv9v1eex2kc3gokee9xc6-97g5qfhya86favzdz0zkuvzbo 172.25.12.1:2377

docker mongodb集群测试 docker swarm集群_Docker_05


docker mongodb集群测试 docker swarm集群_docker_06

  • 查看swarm集群的节点:docker node ls,server2和server3成功加入集群

docker mongodb集群测试 docker swarm集群_docker_07

4.2 创建集群服务

  • 下载mapp:v1镜像:(各个节点)
docker pull ikubernetes/myapp:v1

docker mongodb集群测试 docker swarm集群_上传_08

  • 给镜像重新打标签: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 mongodb集群测试 docker swarm集群_上传_09

  • 列出服务的任务:docker service ps my_cluster

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_10

  • 测试:curl 172.25.12.1/hostname.html

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_11

4.3 部署swarm监控

  • 下载监控镜像:docker pull dockersamples/visualizer,各个节点

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_12

  • 创建监听服务
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

docker mongodb集群测试 docker swarm集群_Docker_13

  • 测试:172.25.12.2:8080

docker mongodb集群测试 docker swarm集群_上传_14

4.4 弹性伸缩

  • 将服务的数量拉伸或缩减到10个:docker service scale my_cluster=10

docker mongodb集群测试 docker swarm集群_Docker_15

docker mongodb集群测试 docker swarm集群_docker_16

4.5 模拟宕机node节点

如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。当宕机的节点恢复后,它转移出去的task实例不会主动转移回来,只能等别的节点出现故障后或使用 scale 进行横向拓展后,转移、新增task实例到它的上面。

  • 停止server3的docker服务:systemctl stop docker.service,原本运行在server3的task会调度到其他节点

docker mongodb集群测试 docker swarm集群_docker_17


docker mongodb集群测试 docker swarm集群_docker_18

  • 恢复server3的docker服务后,原本运行在其他节点的task也不会调度到server3,只有当task重新分配时,会优先分配到server3
systemctl   start docker.service

docker mongodb集群测试 docker swarm集群_Docker_19

  • Swarm 动态扩展服务:docker service scale my_cluster=15

docker mongodb集群测试 docker swarm集群_Docker_20

4.6 改变节点角色

  • 将server2节点加入到群集管理器中:docker node promote server2
  • 列出群集(swarm)中的节点:docker node ls

docker mongodb集群测试 docker swarm集群_docker_21

  • 从群集(swarm)管理器中降级server1节点: docker node demote server1

docker mongodb集群测试 docker swarm集群_上传_22

  • 列出群集(swarm)中的节点:docker node ls

docker mongodb集群测试 docker swarm集群_Docker_23

  • 脱离集群:docker swarm leave

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_24

  • 从群集(swarm)删除server1节点:docker node rm server1

docker mongodb集群测试 docker swarm集群_Docker_25

5 harbor+swarm集群

(1)部署hardor仓库,启动仓库,将镜像上传至hardor仓库

cd harbor/
./install.sh --with-chartmuseum

docker mongodb集群测试 docker swarm集群_Docker_26

  • 将镜像上传至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

docker mongodb集群测试 docker swarm集群_docker_27

  • 优先到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

docker mongodb集群测试 docker swarm集群_Docker_28


(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 mongodb集群测试 docker swarm集群_上传_29

  • 容器的拉伸:docker service scale my_cluster=9

docker mongodb集群测试 docker swarm集群_docker mongodb集群测试_30

  • 容器的缩减:docker service scale my_cluster=3
  • docker mongodb集群测试 docker swarm集群_docker_31


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 mongodb集群测试 docker swarm集群_Docker_32

  • 滚动更新
docker service update --image myapp:v2 --update-parallelism 3 --update-delay 5s my_cluster
--image 指定要更新的镜像
--update-parallelism 指定最大同步更新的任务数
--update-delay 	指定更新间隔

docker mongodb集群测试 docker swarm集群_Docker_33

docker mongodb集群测试 docker swarm集群_上传_34