Docker swarm集群

Docker swarm

基本概念
Swarm是Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是Docker 官方对容器云生态进行支持的核心方案。

使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与Mesos、Kubernetes 竞争的实力。使用 Swarm 集群之前需要了解以下几个概念。

node节点
Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点 。

管理节点用于Swarm集群的管理, docker swarm 命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader ,leader 通过raft协议实现。

工作节点是任务执行节点,管理节点将服务 ( service ) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

docker swarm集群:三剑客之一

实验环境:

node01node02node03
192.168.1.20192.168.1.21192.168.1.22

关闭防火墙、禁用selinux、3台dockerhost区别主机名

同步时间

[root@node01 ~]# yum -y install ntp
[root@node01 ~]# systemctl start ntpd
[root@node01 ~]# ntpstat
[root@node01 ~]# date

docker版本必须是: v1.12版本开始。

Swarm: 作用运行docker engin(引擎)的多个主机组成的集群。

node: 每一个docker engin都是一个node(节点),分为 manager 和worker。

manager node: 负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。

worker node: 接受并执行由manager node 派发的任务,并且默认manager node也是一个work node,不过可以将它设置为manager-only node.让它只负责编排和管理工作。

service: 用来定义worker上执行的命令。

swarm

1)初始化集群

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

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

    docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377

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

//–advertise-addr:指定与其他Node通信的地址。

上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:
在node02和node03执行

[root@node02 ~]# docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377
This node joined a swarm as a worker.

[root@node03 ~]# docker swarm join --token SWMTKN-1-2hwhlc8vs4qgr52iyeg014n3h2caggrskao7pyih9kh1abl7bm-7qn732mle4a23aawbxgrprfal 192.168.1.20:2377
This node joined a swarm as a worker.

PS: 这里注意,token只有24小时的有效期。

如果想要添加manager 节点: 运行下边的命令:

docker swarm join-token manager

当其他两个节点加入成功之后,我们可以执行docker node ls 查看节点详情

[root@node01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
shziicd4ffn9xpz9g587pa5o1 *   node01              Ready               Active              Leader              18.09.0
8mu10ingeds8ne1x6jt6q5mw7     node02              Ready               Active                                  18.09.0
6klim48yqfijk3nd2w6fuud22     node03              Ready               Active                                  18.09.0

基本操作命令:
docker swarm leave : 申请离开一个集群,之后查看节点状态会变成down.然后可以通过manager node 将其删除。

docker node rm xxx: 删除某个节点。

docker swarm join-token [manager | worker]:生成令牌,可以是manager身份或worker身份。

docker node demote(降级):将swarm节点的manager降级为work.

docker node promote(升级): 将warm节点的work升级为manager.

docker node update --availability (“active”|“pause”|“drain”)

PS: 可以通过设置节点的状态,让manager节点不参加实际的运行容器的
任务。

2) 部署docker swarm集群网络

overlay:覆盖型网络。

[root@node01 ~]# docker network create -d overlay --attachable docker
vs18iquob7pdb9td1hlkbiqh6
[root@node01 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
vs18iquob7pd        docker              overlay             swarm

//attachable: 这个参数必须要加,否则不能用于容器。在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。

并且,我们在node1上创建的此网络,但在swarm的其他节点,是查看不到此网络信息的。但却能够直接使用此网络。

3)部署一个图形化webUI 界面。

[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.20 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer

然后可以通过浏览器访问验证。

如果访问不到网页,需开启路由转发

[root@node01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@node01 ~]# sysctl -p

在这里插入图片描述

4)创建service(服务)

[root@node01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx

//–replicas: 副本数量。
大概可以理解为;一个副本等于一个容器。

//查看service:

[root@node01 ~]# docker service ls

//查看service 信息:

[root@node01 ~]# docker service ps web1

在这里插入图片描述

//设置manager node 不参加工作

[root@node01 ~]# docker node update node01 --availability drain
[root@node01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
shziicd4ffn9xpz9g587pa5o1 *   node01              Ready               Drain               Leader              18.09.0
8mu10ingeds8ne1x6jt6q5mw7     node02              Ready               Active                                  18.09.0
6klim48yqfijk3nd2w6fuud22     node03              Ready               Active                                  18.09.0

恢复

[root@node01 ~]# docker node update node01 --availability active

可以看帮助:

[root@node01 ~]# docker node update node01 --help

5)搭建私有仓库并自定义镜像

我基于nginx镜像做的三个自定义镜像,并更改了主访问界面内容

下载registry镜像

[root@node01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 registry:2
//编辑docker配置文件
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service
添加:
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.20:5000
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@192.168.1.21:/usr/lib/systemd/system/
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service root@192.168.1.22:/usr/lib/systemd/system/
这里注意更改完一定要重启
[root@node1 ~]# systemctl daemon-reload 
[root@node1 ~]# systemctl restart docker
下载nginx镜像
//web01
[root@node01 ~]# docker run -itd --name web01 nginx
[root@node01 ~]# docker exec -it web01 bash
root@62acfe960104:/# echo 111 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web01 web01
//web02
[root@node01 ~]# docker run -itd --name web02 nginx
[root@node01 ~]# docker exec -it web02 bash
root@62acfe960104:/# echo 222 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web02 web02
//web03
[root@node01 ~]# docker run -itd --name web03 nginx
[root@node01 ~]# docker exec -it web03 bash
root@62acfe960104:/# echo 333 > usr/share/nginx/html/index.html
[root@node01 ~]# docker commit web03 web03
//镜像重命名
[root@node01 ~]# docker tag web01:latest 192.168.1.20:5000/web01:v1
[root@node01 ~]# docker tag web02:latest 192.168.1.20:5000/web02:v2
[root@node01 ~]# docker tag web03:latest 192.168.1.20:5000/web03:v3
//上传私有仓库
[root@node1 ~]# docker push 192.168.1.20:5000/web01:v1
[root@node1 ~]# docker push 192.168.1.20:5000/web02:v2
[root@node1 ~]# docker push 192.168.1.20:5000/web03:v3

6)发布一个服务,基于上述镜像

要求: 副本数量为3个。服务的名称为:bdqn.

[root@node1 ~]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.20:5000/web01:v1

默认的Ingress 网络,包括创建的自定义overlay网络,为后端真正为用户提供服务的container,提供了一个统一的入口。
在这里插入图片描述

在这里插入图片描述

7)服务的扩容与缩容

[root@node01 ~]# docker service scale bdqn=6

扩容与缩容直接直接通过scale进行设置副本数量。

8)服务的升级与回滚

[root@node01 ~]# docker service update --image 192.168.1.20:5000/web02:v2 bdqn

在这里插入图片描述

//平滑的更新。


PS: 默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过:

–update-parallelism;设置并行更新的副本数量。
–update-delay:指定滚动更新的时间间隔。
在这里插入图片描述

//回滚操作

[root@node01 ~]# docker service rollback bdqn

PS:注意,docker swarm的回滚操作,默认只能回滚到上一次操作的状态,并不能连续回滚操作
在这里插入图片描述

9)指定容器运行节点

[root@node01 ~]# docker node update --help

--label-add list        Add or update a node label
                              (key=value)
给节点添加标签

//假设,这里我们给node02上添加一个标签(磁盘容量最大)。

[root@node01 ~]# docker node update --label-add disk=max node02

//查看标签信息。

[root@node01 ~]# docker node inspect node02
[
    {
        "ID": "rc60akwe59lupkrm1ze4jfmnf",
        "Version": {
            "Index": 201
        },
        "CreatedAt": "2021-02-13T05:17:28.996757577Z",
        "UpdatedAt": "2021-02-13T06:19:07.033869045Z",
        "Spec": {
            "Labels": {
                "disk": "max"
            },
···

//删除标签。

[root@node01 ~]# docker node update --label-rm disk node02

//运行服务,指定节点。

[root@node01 ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
[root@node01 ~]# docker service ls
[root@node01 ~]# docker service ps test
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值