Docker Swarn

Docker Swarn

Docker Swarm 是 Docker 官方项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。它是Docker公司推出的官方容器集群平台,基于Go语言实现,代码在https://github.com/docker/swarm,使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker Swarm是原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。 在很多台机器上部署Docker,组成一个Docker集群,并把整个集群的资源抽象成资源池,使用者部署Docker应用的时候,只需要将应用交给Swarm,Swarm会根据整个集群资源的使用情况来分配资源给部署的Docker应用,可以将这个集群的资源利用率达到最大。

1:Swarm主从架构

img/swarm-diagram.png

Swarm集群通过Raft协议在多个管理节点中实现共识,工作节点上运行agent接受管理节点的统一管理和任务分配。

2:基本概念

1、Swarm集群
Swarm集群为一组被统一管理起来的Docker主机。集群是Swarm所管理的对象,这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点响应外部的管理请求,其他主机作为工作节点来实际运行Docker容器。

当用户使用Swarm集群时,首先定义一个服务(指定状态,复制个数,网络,存储,端口等)然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。

2、节点
节点(Node)是Swarm集群中最小的资源单位,每个节点实际上都是一台Docker主机。

Swarm集群中节点分为两种:
管理节点(Manager):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5-7个管理节点。
工作节点(Worker):负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。用户可以通过docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote命令来将一个管理节点降级为工作节点。

3、服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:

replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 –mode 参数指定。

img/services-diagram.png

4、服务的外部访问
Swarm集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm中支持入口负载均衡(ingress load balancing)的映射模式,该模式下,每个服务都会被分配一个公开端口,该端口在集群中任意节点上都可以访问到,并被保留给改服务。当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。

3:创建Swarm集群

1、使用swarm
docker 版本: Version:           20.10.12
Swarm集群主要操作命令:

swarm init:   在管理节点上创建一个集群
node list:    列出集群中的节点信息
swarm join:   加入一个新的节点到已有集群中
swarm update: 更新一个swarm集群
swarm leave:  离开一个集群
docker service 命令等

2、创建集群
# 时间必须同步!
# 初始化集群,会自动把当前节点设置为管理节点
# 时间同步(所有节点操作)
[root@manager ~]# systemctl start chronyd
[root@manager ~]# chronyc sources -v

# 配置加速
{
    "registry-mirrors": ["https://4pwh0wn5.mirror.aliyuncs.com"],
    "insecure-registries": ["registry.kubernetes.com"]
}

[root@manager ~]# docker swarm init --advertise-addr 10.0.0.10
Swarm initialized: current node (uve2jirf6duxbyl247dmy48ug) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

# 查看swarm worker的连接令牌
docker swarm join-token worker

# 查看swarm manager的连接令牌
docker swarm join-token manager

注意提示返回的token就是节点加入集群需要的信息。这里是两个管理节点 按照提示执行’docker swarm join-token manager’ 查看返回的token,在Host2中执行加入集群。
# 加入节点
[root@worker-1 ~]# docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377
This node joined a swarm as a worker.

[root@worker-2 ~]# docker swarm join --token SWMTKN-1-2iypbo9pqbrfxr0h5khkphw2wxc20u41inb02qegrwc885lzdp-6erb2jmi46jdwa8ui4vixdgcz 10.0.0.10:2377
This node joined a swarm as a worker.

3:查看集群节点信息
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
uve2jirf6duxbyl247dmy48ug *   manager    Ready     Active         Leader           20.10.12
scacp78dh13v0id9fskntjxac     worker-1   Ready     Active                          20.10.12
itrdnclq3y3f572v1tu071yh9     worker-2   Ready     Active                          20.10.12

4:升降级节点
# 将节点升级为manager
[root@manager ~]# docker node promote worker-1
Node worker-1 promoted to a manager in the swarm.
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
uve2jirf6duxbyl247dmy48ug *   manager    Ready     Active         Leader           20.10.12
scacp78dh13v0id9fskntjxac     worker-1   Ready     Active         Reachable        20.10.12
itrdnclq3y3f572v1tu071yh9     worker-2   Ready     Active                          20.10.12

# 将节点降级为worker
[root@manager ~]# docker node demote worker-1 
Manager worker-1 demoted in the swarm.
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
uve2jirf6duxbyl247dmy48ug *   manager    Ready     Active         Leader           20.10.12
scacp78dh13v0id9fskntjxac     worker-1   Ready     Active                          20.10.12
itrdnclq3y3f572v1tu071yh9     worker-2   Ready     Active                          20.10.12

4:部署集群服务

1、在集群中创建一个nginx服务,副本数为2,映射端口80>80,镜像为nginx:alpine

[root@manager ~]# docker service create --replicas 2 --name nginx -p 80:80 nginx:alpine
y049hnkiku3no3y9jchnh04um
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@manager ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
y049hnkiku3n   nginx     replicated   2/2        nginx:alpine   *:80->80/tcp

2、列出服务的任务信息
[root@manager ~]# docker service ps nginx 
ID             NAME      IMAGE          NODE       DESIRED STATE   CURRENT STATE                ERROR     PORTS
hznur5kwqixr   nginx.1   nginx:alpine   worker-1   Running         Running about a minute ago             
xhtvulwgy4b0   nginx.2   nginx:alpine   manager    Running         Running about a minute ago

3、使用scale命令参数弹性伸缩服务个数。
[root@manager ~]# docker service scale nginx=4
nginx scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged 
[root@manager ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
y049hnkiku3n   nginx     replicated   4/4        nginx:alpine   *:80->80/tcp

4、测试访问
[root@manager ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 04 Feb 2022 06:20:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 18:48:00 GMT
Connection: keep-alive
ETag: "61cb5be0-267"
Accept-Ranges: bytes

5、服务镜像升级与回滚
[root@manager ~]# docker service update --image nginx:latest --update-parallelism 2 --update-delay 10s nginx 
nginx
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged 
[root@manager ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
y049hnkiku3n   nginx     replicated   4/4        nginx:latest   *:80->80/tcp

–update-parallelism: 同时更新的最大任务数量
–update-delay:更新服务的时间间隔

#回滚
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback 
overall progress: rolling back update: 4 out of 4 tasks 
1/4: running   [>                                                  ] 
2/4: running   [>                                                  ] 
3/4: running   [>                                                  ] 
4/4: running   [>                                                  ] 
verify: Service converged 
[root@manager ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
y049hnkiku3n   nginx     replicated   4/4        nginx:alpine   *:80->80/tcp

可以看到两次的镜像有所改变

5:Docker service 命令列表

        命令	                   描述
docker service create		创建一个新服务
docker service inspect		显示一个或多个服务的详细信息
docker service logs			获取服务或任务的日志
docker service ls			列出服务列表
docker service ps			列出一个或多个服务的任务
docker service rm			删除一个或多个服务
docker service rollback	   	 还原对服务的更改
docker service scale	 	 伸缩服务的数量
docker service update	 	 更新服务
posted @ 2022-02-04 14:28  Layzer  阅读(40)  评论(0编辑  收藏  举报