十、Doocker Swarm

目录

Swarm 简介

Swarm 原理

Swarm 使用

1.准备4台相同配置机器

2.部署集群

3.Raft协议

4.动态伸缩

概念总结


Swarm 简介

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

Swarm 原理

如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。

swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。

work node:即图中的 worker,主要负责运行相应的服务来执行任务。

# 查看 docker swarm 命令帮助信息
[root@docker ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Swarm 使用

1.准备4台相同配置机器

# 1.centos 7及以上Linux
[root@docker ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
# 2.安装gcc相关环境
[root@docker ~]# yum install -y gcc gcc-c++
[root@docker ~]# yum update -y
# 3.安装Docker
# (详细步骤见第二篇)
[root@docker ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.17
......
......

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
......
......

2.部署集群

1. 初始化生成主节点 docker swarm init

2. 以 manager 或 worker 身份加入集群

# 初始化 swarm 集群,进行初始化的这台机器,就是集群的管理节点
# 将 dcoker-1 初始化成为主节点
[root@dcoker-1 ~]# docker swarm init --advertise-addr 192.168.10.131
Swarm initialized: current node (mvl1u5xscrpsz1eyh95nw0h8d) is now a manager.

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

    docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-66bq8qbw0g6nf4sa73uiv10up 192.168.10.131:2377

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

# 将 docker-2 以 worker 身份加入
[root@dcoker-2 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-66bq8qbw0g6nf4sa73uiv10up 192.168.10.131:2377
This node joined a swarm as a worker.
# 将 docker-3 以 worker 身份加入
[root@dcoker-3 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-66bq8qbw0g6nf4sa73uiv10up 192.168.10.131:2377
This node joined a swarm as a worker.

# 生成可以以管理者身份加入的令牌
[root@dcoker-1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-df3olm2lg4d8fnmes29f59q48 192.168.10.131:2377

# 将 docker-4 以 管理者 身份加入
[root@dcoker-4 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-df3olm2lg4d8fnmes29f59q48 192.168.10.131:2377
This node joined a swarm as a manager.

查看各节点信息

( 双主双从 )

[root@dcoker-1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Unknown   Active                          
mvl1u5xscrpsz1eyh95nw0h8d *   dcoker-1   Ready     Active         Leader           20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
47zbgmx99hbxz10z74jxdu6j3     dcoker-3   Ready     Active                          20.10.17
rp1rwcvr2napy82mb5o4pj4em     dcoker-4   Ready     Active         Reachable        20.10.17

若使用swarm搭建集群时出现如下错误:

[root@dcoker-2 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-66bq8qbw0g6nf4sa73uiv10up 192.168.10.131:2377
Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 192.168.10.131:2377: connect: no route to host"

将 manager上的防火墙关闭即可 :

systemctl stop firewalld
systemctl disable firewalld

3.Raft协议

Raft 协议:保证大多数节点存活才可以用。至少大与1台,集群至少大于3台

双主双从:若一个节点故障,其他节点是否可用?

实验

1.将 docker-1 停止(宕机),双主,另外一个主节点 ( docker-4 ) 也不能使用了

[root@dcoker-1 ~]# systemctl stop docker

[root@dcoker-4 ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
# 恢复docker-1
[root@dcoker-1 ~]# systemctl start docker
# 查看节点信息
[root@dcoker-1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Unknown   Active                          
mvl1u5xscrpsz1eyh95nw0h8d *   dcoker-1   Ready     Active         Reachable        20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
47zbgmx99hbxz10z74jxdu6j3     dcoker-3   Ready     Active                          20.10.17
rp1rwcvr2napy82mb5o4pj4em     dcoker-4   Ready     Active         Leader           20.10.17
# dcoker-1 恢复,但身份从 Leader 变成了 Reachable
# docker-1 宕机时,docker-4 顶替成为 Leader ,但服务无法正常运行

2.将 docker-3 离开,仍正常运行

# 正常运行
[root@dcoker-1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Down      Active                          
mvl1u5xscrpsz1eyh95nw0h8d *   dcoker-1   Ready     Active         Reachable        20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
47zbgmx99hbxz10z74jxdu6j3     dcoker-3   Ready     Active                          20.10.17
rp1rwcvr2napy82mb5o4pj4em     dcoker-4   Ready     Active         Leader           20.10.17

# 将 dcoker-3 离开集群
[root@dcoker-3 ~]# docker swarm leave
Node left the swarm.

# docker-3 的状态成为 Down
# 但集群服务仍可以正常运行
[root@dcoker-1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Down      Active                          
mvl1u5xscrpsz1eyh95nw0h8d *   dcoker-1   Ready     Active         Reachable        20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
47zbgmx99hbxz10z74jxdu6j3     dcoker-3   Down      Active                          20.10.17
rp1rwcvr2napy82mb5o4pj4em     dcoker-4   Ready     Active         Leader           20.10.17

3.将 docker-3 也设置为管理者,(此时 1、3、4 为管理者,2 为工作者)再将 docker-1 关闭,服务仍可正常运行

# 获取令牌
[root@dcoker-1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-df3olm2lg4d8fnmes29f59q48 192.168.10.131:2377

[root@dcoker-3 ~]# docker swarm join --token SWMTKN-1-5qcgyboe58rc3vbp87legjqwhd1c5gk7zynalnstvwoze53aeu-df3olm2lg4d8fnmes29f59q48 192.168.10.131:2377
This node joined a swarm as a manager.

# 停止 docker-1
[root@dcoker-1 ~]# systemctl stop docker

# dcoker-1 宕机,但服务正常运行
[root@dcoker-4 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
eksgn44obh21fkyxc2szppibm                Down      Active                          
mvl1u5xscrpsz1eyh95nw0h8d     dcoker-1   Down      Active         Unreachable      20.10.17
hxhtnvdehz9ddn15bt5no377t     dcoker-2   Ready     Active                          20.10.17
l178ccqkj63nh2m7w7z3alpkm     dcoker-3   Ready     Active         Reachable        20.10.17
rp1rwcvr2napy82mb5o4pj4em *   dcoker-4   Ready     Active         Leader           20.10.17

Raft 协议:保证大多数节点存活集群才可以正常运行

(至少两台管理节点存活,才能正常运行)

4.动态伸缩

docker run 无法弹性伸缩

docker service 可以弹性伸缩,滚动更新

# 查看 docker service 帮助信息
[root@dcoker-1 ~]# docker service --help

Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service
# 创建 nginx 服务
[root@dcoker-1 ~]# docker service create -p 80:80 --name my-nginx nginx
i33e3tdgt7ihszl2cak0wmyz2
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged
[root@dcoker-1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
i33e3tdgt7ih   my-nginx   replicated   1/1        nginx:latest   *:80->80/tcp
# 服务会随机部署到一个节点上(此时是在docker-2)
[root@dcoker-2 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
6456a900017f   nginx:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   80/tcp    my-nginx.1.j5ihup81sdnem1ismxdcwu62w

 创建10个副本

[root@dcoker-1 ~]# docker service update --replicas 10 my-nginx
my-nginx
overall progress: 10 out of 10 tasks 
1/10: running   [==================================================>] 
2/10: running   [==================================================>] 
3/10: running   [==================================================>] 
4/10: running   [==================================================>] 
5/10: running   [==================================================>] 
6/10: running   [==================================================>] 
7/10: running   [==================================================>] 
8/10: running   [==================================================>] 
9/10: running   [==================================================>] 
10/10: running   [==================================================>] 
verify: Service converged
[root@dcoker-1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
i33e3tdgt7ih   my-nginx   replicated   10/10      nginx:latest   *:80->80/tcp

服务,集群中任意的节点都可以访问该服务,服务可以有多个副本动态扩缩容实现高可用!

# docker service scale my-nginx=5
# 等同于 docker service update --replicas 10 my-nginx

[root@dcoker-4 ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged
# 删除服务
[root@dcoker-4 ~]# docker service rm my-nginx
my-nginx

拓展:

网络模式:"PublishMode":"ingress"

Swarm

Overlay

ingress:特殊的 Overlay 网络,具有负载均衡的功能

上面docker在4台机器上,实际网络是同一个。ingress网络,是一个特殊的Overlay网络

总结:

Swarm 搭建集群、启动服务、动态管理容器

概念总结

Swarm

集群的管理和编号。

docker 可以初始化一个 swarm 集群,其它节点可以加入。(管理者、工作者)

Node

就是一个 docker 节点。

多个节点就组成了网络集群。(管理者、工作者)

Service

服务。

可以在管理节点或者工作节点来运行。集群的核心,用户访问的地方。

Task

容器内的命令,细节任务!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值