一、docker swarm的介绍
1.1 swarm介绍
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用Go语言来完成的开发的,
代码开源在https://github.com/docker/swarm,它是将一群Docker宿主机变成一个单一的虚拟主机,
Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)
均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到
Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Docker Swarm和Docker Compose一样,都是Docker官方容器编排项目,但不同的是,Docker Compose是一个在单个服务器
或主机上创建多个容器的工具,一而Docker Swarm则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然
Docker Swarm会更加适合。
从Docker 1.12.0版本开始,Docker Swarm已经包含在Docker引擎中(docker swarm),并且已经内置了服务发现工具,
我们就不需要像之前一样,再配置 Etcd 或者 Consul来进行服务发现配置了。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,
调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,
他会收集重建集群信息。
1. docker swarm
2. messos+ marathon ===> dcos
3. kubernetres ===> kes /k3s
4. nomand
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
主要解决问题:
解决docker server的集群化管理和部署。
Swarm通过对Docker宿主机上添加的标签信息来将宿主机资源进行细粒度分区,通过分区来帮助用户将容器部署到目标宿主机上,同样通过分区方式还能提供更多的资源调度策略扩展。
swarm能做什么:
- 管理节点高可用,原生支持管理节点高可用,采用raft共识算法来支撑管理节点高可用。
- 应用程序高可用,支持服务伸缩,滚动更新和应用回滚等部署策略。
1.2 swarm架构
在图中可以看出Docker Client使用Swarm对集群(Cluster)进行调度使用。
可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。
manager是中心管理节点,各个node上运行agent接受manager的统一管理,
集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,
避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
1.3 swarm概念
1.3.1 Swarm
1.3.2 Node
1.3.3 Manager
1.3.4 Service
1.3.5 Task
1.3.6 概念汇总
(1)docker的两种模式,单引擎模式和swarm集群模式。
单引擎模式-----docker server没有加入任何集群,且自身也没有加入初始化为swarm 节点,简单的说就是我们平时所操作的孤立的
docker server。
swarm模式----当docker server 加入到任意swarm集群,或者通过docker swarm init初始化swarm集群时,docker server会自动
切换到swarm 集群模式。
(2)swarm集群中节点分类,分为:manager(管理节点)、node(工作节点)
manager:是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求以及调度Node进行
具体工作。manager 本身也是一个node节点。
Node:接受manager调度,对容器进行创建、扩容和销毁等具体操作。
(3)raft共识算法,是实现分布式共识的一种算法,主要用来管理日志复制的一致性。
当Docker引擎在swarm模式下运行时,manager节点实现Raft一致性算法来管理全局集群状态。
Docker swarm模式之所以使用一致性算法,是为了确保集群中负责管理和调度任务的所有manager节点都存储相同的一致状态。
在整个集群中具有相同的一致状态意味着,如果出现故障,任何管理器节点都可以拾取任务并将服务恢复到稳定状态。
例如,如果负责在集群中调度任务的领导管理器意外死亡,则任何其他管理器都可以选择调度任务并重新平衡任务以匹配所需状态。
使用一致性算法在分布式系统中复制日志的系统需要特别小心。它们通过要求大多数节点在值上达成一致,确保集群状态在出现故障时
保持一致。
Raft最多可承受(N-1)/2次故障,需要(N/2)+1名成员的多数或法定人数才能就向集群提议的值达成一致。
这意味着,在运行Raft的5个管理器集群中,如果3个节点不可用,系统将无法处理更多的请求来安排其他任务。
现有任务保持运行,但如果管理器集不正常,调度程序无法重新平衡任务以应对故障。
(4)Swarm管理节点高可用。
Swarm管理节点内置有对HA的支持,即使有一个或多个节点发送故障,剩余管理节点也会继续保证Swarm运转。
Swarm实现了一种主从方式的多管理节点的HA,即使有多个管理节点也只有一个节点出于活动状态,处于活动状态的节点被称为主节点
(leader),而主节点也是唯一一个会对Swarm发送控制命令的节点,如果一个备用管理节点接收到了Swarm命令,则它会将其转发给主节点。
(5)集群管理,集群创建和组织。
(6)节点管理,集群下节点角色信息变更,节点任务情况监控。
(7)服务管理,集群服务部署,服务管理等。
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
二、docker swarm的部署
2.1 使用swarm的前提
2.2 构建swarm集群
2.2.1 创建集群manager
192.168.80.25 lyc-80-25(manager)
-----------------------------------------------
docker swarm init --advertise-addr 192.168.80.25
------------------------------------------------
docker swarm join --token SWMTKN-1-29deix0jpwjj5g2ny7q2plmc94hlh3hg8q2q653sfg841n3prj-44cjudb2ik7ry6d4gibc789a3 192.168.80.25:2377
- 1.
- 2.
- 3.
- 4.
- 5.
2.2.2 work加入manager
2.3 node节点的管理
2.4 service节点的管理
2.4.1创建一个服务器
1)使用nginx镜像,创建一个具有一个副本(--replicas 1)的nginx服务
2)查询Swarm中服务的信息
3)查询哪个节点正在运行该服务
4)在Swarm中动态扩展服务(scale)
核对容器开辟情况
5)模拟宕机node节点
【结论】
在swarm cluster集群中启动的容器,
在worker node节点上删除或停用后,
该容器会自动转移到其他的worker node节点上。
【其他命令】
//节点变更
docker node promote lyc-80-26//将worker提升为manger
docker node demote lyc-80-25//将manger降级为worker
docker node rm lyc-80-26//将节点删除
docker swarm leave
离开集群【不是管理节点也可以离开】
//节点分配
docker node update--availability drain lyc-80-26 //lyc-80-26不分配节点
docker node update--availability active lyc-80-26 //恢复lyc-80-26分配
Service操作
查看service
docker service ls //查看该服务下所有容器
docker service ps 容器名//查看指定容器运行状态详情
docker service logs 容器名//查看指定容器的运行日志
docker service rm 服务名//删除某个服务
Replicas操作
//控制容器副本数(重启stack后会失效)
docker service scale 容器名=副本数量
增加/缩减副本数量
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
滚动更新服务
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
docker service update --image redis:3.0.7 redis
创建服务时设定更新策略
docker service create \
--name my_web \
--replicas 10 \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
nginx:1.12
创建服务时设定回滚策略
docker service create
--name my_web \
--replicas 10 \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio .2 \
nginx:1.12
服务更新
docker service update --image nginx:1.13 my_web
手动回滚
docker service update --rollback my_web
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
【故障演示】
3个管理节点的失效配额为(3-1)/2-1,
若失效数量小于或等于配额,
则swarm自动执行选举与切换;
若超出配额范围,
则须手动强制重建群集(docker swarm init-f/--force)
出现故障时,需要查看群集、节点、服务、任务等信息,
结合命令行输出与日志对故障原因进行定位。
Centos 7下的docker日志文件默认为/var/log/message,
管理节点的/var/lib/docker/swarm/目录用于保存群集状态
与管理日志,可以按备份目录-导入目录-重建群集的步骤执行故障恢复。
docker官方建议备份与导入操作在docker主进程停用后执行。
将集群节点都变为主节点
docker node promote lyc-80-26
docker node promote lyc-80-27
【扩展】
将集群节点都变为从节点
docker node demote lyc-80-26
docker node demote lyc-80-27
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
【重建集群】
备份Swarm集群
如果Swarm开启了auto-lock,需要
unlock key从backup中恢复swarm停止管理节点
备份/var/lib/docker/swarm整个目录
重启管理节点
在lyc-80-25节点上手动强制重建群集
docker swarm init --force-new-cluster //记住token
docker node rm lyc-80-26
docker node rm lyc-80-27
移除失效的lyc-80-26与lyc-80-27节点
lyc-80-26
docker swarm leave
lyc-80-27
docker swarm leave
重新加入swarm集群
lyc-80-26
docker swarm join --token SWMTKN-1-29deix0jpwjj5g2ny7q2plmc94hlh3hg8q2q653sfg841n3prj-44cjudb2ik7ry6d4gibc789a3 192.168.80.25:2377
lyc-80-27
docker swarm join --token SWMTKN-1-29deix0jpwjj5g2ny7q2plmc94hlh3hg8q2q653sfg841n3prj-44cjudb2ik7ry6d4gibc789a3 192.168.80.25:2377
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
2.5 部署swarm集群监控
三、数据的管理
3.1 将宿主机挂载到容器
3.2 将目录挂载到容器
3.3 NFS数据持久存储
3.4 docker stack批量部署
3.4.1 docker stack的介绍
单机模式下,我们可以使用Docker Compose来编排多个服务,而Docker Swarm只能实现对单个服务的简单部署。
本文的主角Docker Stack,通过Docker Stack我们只需对已有的docker-compose.yml配置文件稍加改造就可以完成
Docker集群环境下的多服务编排。
3.4.2 docker stack与docker compose的区别
Docker stack会忽略了"构建”指令,无法使用stack命令构建新镜像,
它是需要镜像是预先已经构建好的,所以docker-compose更适合于开发场景。
Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。
所以需要安装Docker-compose,以便与Docker一起在您的计算机上使用。
Docker Stack功能包含在Docker引擎中。
你不需要安装额外的包来使用它,docker stacks只是swarm mode的一部分。
Docker stack不支持基于第2版写的docker-compose.yml,也就是version版本至少为3。
然而Docker Compose对版本为2和3的文件仍然可以处理。
docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。
同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。
如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
3.4.3 docker stack的命令
3.4.4 docker stack部署项目
首先创建一个 docker-compose.yml 文件,使用Docker Compose v3 语法
vim docker-compose.yaml
--------------------------
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
POSTGRES_HOST_AUTH_METHOD: "trust"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
----------------------------------------
----------格式化-------
yum install dos2unix
dos2unix docker-compose.yaml
docker stack deploy example --compose-file=docker-compose.yaml
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
192.168.80.25:5000
192.168.80.25:ip:8080