Swarm容器集管理(超详细)
⼀、Swarm介绍
Swarm是Docker公司⾃研发的容器集管理系统, Swarm在早期是作为⼀个独⽴服务存在,在Docker Engine v1.12中集成了Swarm的集管理和编排功能。可以通过初始化Swarm或加⼊现有Swarm来启⽤Docker引擎的Swarm模式。
Docker Engine CLI和API包括了管理Swarm节点命令,⽐如添加、删除节点,以及在Swarm中部署和编排服务。也增加了服务栈(Stack)、服务(Service)、任务(Task)概念。
⼆、Swarm的亮点
三、swarm关键概念
1、什么是swarm?
集管理和任务编排功能已经集成到了Docker引擎中,通过使⽤swarmkit。swarmkit是⼀个独⽴的,专门⽤于Docker容器编排的项⽬,可以直接在Docker上使⽤。
Swarm集是由多个运⾏swarm模式的Docker主机组成,关键的是,Docker默认集成了swarm mode。swarm集中有manager(管理成员关系和选举)、worker(运⾏swarm service)。
⼀个Docker主机可以是manager,也可以是worker⾓⾊,当然,也可以既是manager,同时也是worker。
当你创建⼀个service时,你定义了它的理想状态(副本数、⽹络、存储资源、对外暴露的端⼝等)。Docker会维持它的状态,例如,如果⼀个worker node不可⽤了,Docker会调度不可⽤node的task到其他nodes上。
运⾏在容器中的⼀个task,是swarm service的⼀部分,且通过swarm manager进⾏管理和调度,和独⽴的容器是截然不同的。
swarm service相⽐单容器的⼀个最⼤优势就是,你能够修改⼀个服务的配置:包括⽹络、数据卷,不需要⼿⼯重启服务。Docker将会更新配置,把过期配置的task停掉,重新创建⼀个新配置的容器。
当然,也许你会觉得docker compose也能做swarm类似的事情,某些场景下是可以。但是,swarm相⽐docker compose,功能更加丰富,⽐如说⾃动扩容、缩容,分配⾄task到不同的nodes等。
2、nodes
⼀个node是Swarm集中的⼀个Docker引擎实例。你也可以认为这就是⼀个docker节点。你可以运⾏⼀个或多个节点在单台物理机或云服务器上,但是⽣产环境上,典型的部署⽅式是:Docker节点交叉分布式部署在多台物理机或云主机上。
通过swarm部署⼀个应⽤,你向manager节点提交⼀个service,然后manager节点分发⼯作(task)给worker node。
manager节点同时也会容器编排和集管理功能,它会选举出⼀个leader来指挥编排任务。worker nodes接受和执⾏从manager分发过来的task。⼀般地,manager节点同时也是worker节点,但是,你也可以将manager节点配置成只进⾏管理的功能。
Agent则运⾏在每个worker节点上,时刻等待着接受任务。worker node会上报manager node,分配给他的任务当前状态,这样manager node才能维持每个worker的⼯作状态。
3、services和tasks
service就是在manager或woker节点上定义的tasks。service是swarm系统最核⼼的架构,同时也是和swarm最主要的交互者。当你创建⼀个service,你指定容器镜像以及在容器内部运⾏的命令。
在副本集模式下,swarm manager将会基于你需要扩容的需求,把task分发到各个节点。对于全局ser
vice,swarm会在每个可⽤节点上运⾏⼀个task。
task携带Docker引擎和⼀组命令让其运⾏在容器中。它是swarm的原⼦调度单元。manager节点在扩容的时候回交叉分配task到各个节点上,⼀旦⼀个task分配到⼀个node,它就不能移动到其他node。
4、负载均衡
swarm manager使⽤ ingress负载均衡来暴露你需要让外部访问的服务。swarm manager能够⾃动的分配⼀个外部端⼝到service,当然,你也能够配置⼀个外部端⼝,你可以指定任意没有使⽤的port,如果你不指定端⼝,那么swarm manager会给service指定30000-32767之间任意⼀个端⼝。
swarn模式有⼀个内部的DNS组件,它能够⾃动分发每个服务在swarm⾥⾯。swarm manager使⽤内部负载均衡机制来接受集中节点的请求,基于DNS名字解析来实现。
四、Swarm架构图
Swarm manager:
1、API:接受命令,创建⼀个service(API输⼊)
2、orchestrator:service对象创建的task进⾏编排⼯作(编排)
3、allocater:为各个task分配IP地址(分配IP)
4、dispatcher:将task分发到nodes(分发任务)
5、scheduler:安排⼀个worker运⾏task(运⾏任务)
worker node
1、连接到分发器接受指定的task
2、将task指派到对应的worker节点
例⼦:
swarm manager创建⼀个3个nginx副本集的service,他会将task分配到对应的node。
五、swarm集部署
安装需求
1、主机安装了docker,Docker Engine 1.12+
2、关闭selinux、关闭防⽕墙(或者按照下⾯需要打开的端⼝开放防⽕墙)
3、协议端⼝开放
TCP port 2377 集管理通讯
TCP and UDP port 7946 节点之间通讯
UDP port 4789 overlay⽹络流量
机器分布
⾓⾊IP Docker版本
manager10.11.97.7118.09.7
worker0110.11.97.18118.09.7
worker0210.11.97.18718.09.7
部署swarm
manager节点:
docker swarm init --advertise-addr 10.11.97.71
⽇志查看:
[root@localhost ~]# docker swarm init --advertise-addr 10.11.97.71
Swarm initialized: current node (nnkbd7e2emx24ymnzyvxv7h2b) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4y22cau9ejhrppdlf2g5y7dn6ibltq67ccvoiw2xf3yoj5i5ii-69yg43tece4d5sbwl1a1ftmu9 10.11.97.71:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@localhost ~]#
worker01节点加⼊集:
[root@worker01 compose_nginx_tomcat]# docker swarm join --token SWMTKN-1-4y22cau9ejhrppdlf2g5y7dn6ibltq67ccvoiw2xf3yoj5i5ii-69yg43tece4d5sbwl1a1ftmu9 10.11.97.71:2377 This node joined a swarm as a worker.
[root@localhost compose_nginx_tomcat]#
worker02节点加⼊集:
[root@worker02 ~]# docker swarm join --token SWMTKN-1-4y22cau9ejhrppdlf2g5y7dn6ibltq67ccvoiw2xf3yoj5i5ii-69yg43tece4d5sbwl1a1ftmu9 10.11.97.71:2377
This node joined a swarm as a worker.
[root@localhost ~]#
查看node状态:
部署⼀个服务
docker service create --replicas 1 --name helloworld alpine ping docker
--replicas 副本集数
--name 服务名称
查看服务
当前服务运⾏在manager上。
六、swarm集服务管理
1、创建服务
docker service create --replicas 1 --name web01 nginx
2、显⽰服务详细信息
docker service inspect --pretty web01# 易于阅读显⽰
docker service inspect web01# json格式返回
3、扩容和缩容
docker service scale web01=3
4、查看服务任务
docker service ls(查看所有service)
docker service ps web01(查看web01)
每个node上分布了1个容器。
docker service ps -f 'desired-state=running' web01(查看运⾏状态的service)
5、滚动更新服务
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
docker service update --image redis:3.0.7 redis
6、创建服务时设定更新策略
docker service create \
--name my_web
--replicas 10 \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
nginx:1.12
7、创建服务时设定回滚策略
docker service create \
--name my_web \
--replicas 10 \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio .2 \
nginx:1.12
8、服务更新
docker service update --image nginx:1.13 my_web
9、⼿动回滚
docker service update --rollback my_web
10、⾓⾊切换
升级前:
升级:
停掉manager
systemctl stop docker
将worker02升级
docker node promote worker02
升级后:
七、swarm集数据管理
1、volume⽅式管理数据
volume模式:在宿主机上创建⼀个volume,默认⽬录为(/var/lib/docker/volume/your_custom_volum
e/_data),然后把容器的某个⽬录映射到宿主机的volume上,即使容器挂了,数据还会依然保留在宿主机的volume上。
docker service create --replicas 1--mount type=volume,src=nginx^Cata,dst=/usr/share/nginx/html --name www_web01 nginx:1.12
查看服务
docker service inspect www_web01
服务ID
服务版本
服务创建时间
服务更新时间
服务详细配置
服务名称
服务标签
服务的容器配置
镜像名称
挂载点
资源限制
重启策略
更新配置
回滚配置
挂载点配置
[
{
"ID": "7ge7vfprynybyvz9otwomzumv",
"Version": {
"Index": 313
},
"CreatedAt": "2019-07-20T04:16:41.677166218Z",
"UpdatedAt": "2019-07-20T04:16:41.677166218Z",
"Spec": {
"Name": "www_web01",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx:1.12@sha256:72daaf46f11cc753c4eab981cbf869919bd1fee3d2170a2adeac12400f494728", "Init": false,
"Mounts": [
{
"Type": "volume",
"Source": "nginx_data",
"Target": "/usr/share/nginx/html"
}
],
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {
"Platforms": [
{
"Architecture": "amd64",
"OS": "linux"
},
{
"OS": "linux"
},
{
"Architecture": "arm64",
"OS": "linux"
},
{
"Architecture": "386",
"OS": "linux"
},
{
docker重启容器命令"Architecture": "ppc64le",
"OS": "linux"
},
{
"Architecture": "s390x",
"OS": "linux"
}
]
},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip"
}
},
"Endpoint": {
"Spec": {}
}
}
]
查看数据卷
因为我硬盘的数据盘在/data,所以我这⾥已经把docker的Root Dir设置成/data/docker/,可以看到容器⾥⾯的nginx数据⽬录已经挂在到宿主机的nginx_data了。
2、bind mount⽅式管理数据
bind mount模式:将宿主机某个⽬录映射到docker容器,很适合于⽹站,同时把宿主机的这个⽬录作为git版本⽬录,每次update代码的时候,容器就会更新。
创建数据⽬录
在mananger、worker01、worker02上创建web⽹站⽬录:
mkdir -p /data/wwwroot
创建服务
docker service create --replicas 1--mount type=bind,src=/data/wwwroot,dst=/usr/share/nginx/html --name www_web02 nginx:1.12
查看服务
运⾏在worker02
测试宿主机的数据盘和容器是映射关系:
进⼊容器查看内容:
可以看到我们在宿主机上创建的index.html已经挂在到容器上了!
3、NFS⽅式管理数据
前⾯两种⽅式都是单机docker上数据共享⽅式,要是在集中,这个就不适⽤了,我们必须使⽤共享存储或⽹络存储了。这⾥我们使⽤NFS来测试。
安装NFS服务
我们使⽤第三台(worker02作为NFS服务提供者)
yum install nfs-utils -y
并且在nfs⽬录放⼊⽹站数据内容:
[root@worker02 container_data]# echo 'hello nfs' >index.html
其他两个节点(worker01和manager均需要安装nfs客户端)
创建服务
docker service create \
--mount 'type=volume,src=nfs-vol,dst=/usr/share/nginx/html, \
volume-driver=local,volume-opt=type=nfs,\
volume-opt=device=:/data/container_data,"volume-opt=o=addr=10.11.97.187,vers=4,soft,timeo=180,bg,tcp,rw"' \
--name www_web03_nfs nginx:1.12
swarm⽀持挂在NFS卷。
可以查看到nfs已经挂在到manager节点了,且nfs⾥⾯的内容也在。
进⼊容器查看:
⼋、swarm集发布
架构图
服务发现: Swarm模式内置DNS组件,⾃动为每个服务分配DNS记录,然后服务的DNS名称在集内的服务直接分发请求。
负载均衡:在Swarm集中创建服务时, Ingress⽹络会⾃动为其分配⼀个虚拟IP(VIP),在DNS解析时返回VIP,流⼊该VIP的流量将⾃动发送(IPVS)该服务的所以健康任务(容器)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论