码迷,mamicode.com
首页 > 其他好文 > 详细

docker swarm ,滚动更新

时间:2018-06-21 01:47:52      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:oss   两台   update   虚拟   file   bss   连接   全球   name   

一、Docker swarm

Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。

技术分享图片




swarm create
Swarm 中 swarm create 命令用于创建一个集群标志,用于 Swarm 管理 Docker 集群时,Docker Node 的节点发现功能。发起该命令之后,Swarm 会前往 Docker Hub 上内建的发现服务中获取一个全球唯一的token,用以唯一的标识 Swarm 管理的 Docker 集群。

swarm manage
Swarm 中 swarm manage 是最为重要的管理命令。一旦 swarm manage 命令在 Swarm 节点上被触发,则说明用户需要 swarm 开始管理 Docker 集群。从运行流程的角度来讲,swarm 经历的阶段主要有两点:启动 swarm、接收并处理 Docker 集群管理请求。


Swarm 启动的过程包含三个步骤:
发现 Docker 集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;初始化内部调度(scheduler)模块;创建并启动 API 监听服务模块;


第一个步骤,Swarm 发现 Docker 集群中的节点。发现(discovery)是 Swarm 中用于维护Docker 集 群 状 态 的 机 制 。 既 然 涉 及 到 发 现 ( discovery ) , 那 在 这 之 前 必 须 先 有 注 册(register)。Swarm 中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的 discovery 模式下,注册(register)也会有不同的形式。

目 前 , Swarm 中 提 供 了 5 种 不 同 的 发 现 ( discovery ) 机 制 : Node Discovery 、 FileDiscovery、Consul Discovery、EtcD Discovery 和 Zookeeper Discovery。
Hosted Discovery with Docker Hub,Docker Hub 提供的发现服务,需要连接外网。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基于 KV 分布式存储系统,支持 etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
静态文件描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
静态 IP 列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>


第二个步骤,Swarm 内部的调度(scheduler)模块被初始化。swarm 通过发现机制发现所有注册的 Docker Node,并收集到所有 Docker Node 的状态以及具体信息。此后,一旦Swarm 接收到具体的 Docker 管理请求,Swarm 需要对请求进行处理,并通过所有 DockerNode 的状态以及具体信息,来筛选(filter)决策到底哪些 Docker Node 满足要求,并通过一定的策略(strategy)将请求转发至具体的一个 Docker Node。


第三个步骤,Swarm 创建并初始化 API 监听服务模块。从功能的角度来讲,可以将该模块抽象为 Swarm Server。需要说明的是:虽然 Swarm Server 完全兼容 Docker 的 API,但是有不少 Docker 的命令目前是不支持的,毕竟管理 Docker 集群与管理单独的 Docker 会有一些区别。当 Swarm Server 被初始化并完成监听之后,用户即可以通过 Docker Client 向 Swarm发送 Docker 集群的管理请求。



Swarm 的 swarm manage 接收并处理 Docker 集群的管理请求,即是 Swarm 内部多个模块协同 合 作 的 结 果 。 请 求 入 口 为 Swarm Server , 处 理 引 擎 为 Scheduler , 节 点 信 息 依 靠Disocovery。


swarm join
Swarm 的 swarm join 命令用于将 Docker Node 添加至 Swarm 管理的 Docker 集群中。从这点也可以看出 swarm join 命令的执行位于 Docker Node,因此在 Docker Node 上运行该命令,首先需要在 Docker Node 上安装 Swarm,由于该 Swarm 只会执行 swarm join 命令,故可以将其当成 Docker Node 上用于注册的 agent 模块。功能而言,swarm join 可以认为是完成 Docker Node 在 Swarm 节点处的注册(register)工作,以便 Swarm 在执行 swarm manage 时可以发现该 Docker Node。然而,上文提及的 5 种discovery 模式中,并非每种模式都支持 swarm join 命令。不支持的 discovery 的模式有 Node Discovery 与 File Discovery。


Docker Node 上 swarm join 执行之后,标志着 Docker Node 向 Swarm 注册,请求加入 Swarm管理的 Docker 集群中。Swarm 通过注册信息,发现 Docker Node,并获取 Docker Node 的状态以及具体信息,以便处理 Docker 请求时作为调度依据。


swarm list
Swarm 中的 swarm list 命令用以列举 Docker 集群中的 Docker Node。


Docker Node 的信息均来源于 Swarm 节点上注册的 Docker Node。而一个 Docker Node 在Swarm 节点上注册,仅仅是注册了 Docker Node 的 IP 地址以及 Docker 监听的端口号。


使用 swarm list 命令时,需要指定 discovery 的类型,类型包括:token、etcd、file、zk 以及<ip>。而 swarm list 并未罗列 Docker 集群的动态信息,比如 Docker Node 真实的运行状态,或者 Docker Node 在 Docker 集群中扮演的角色信息。


实验环境 rhel7

Server1    192.168.122.21      manager

Server2    192.168.122.22      node

Server3    192.168.122.23      node


安装docker服务

技术分享图片


开启服务

[root@server1 ~]# systemctl start docker


查看版本

技术分享图片


集群搭建

创建docker swarm集群:

[root@server1 ~]# docker swarm init

技术分享图片

加入集群

其它两台运行   使其加入集群 

docker swarm join \     --token SWMTKN-1-4shsvq36kx6b0f8h4yma6wnmtkgewqhlbjmi284b223kxa0hdr-bqnj0zo8gbss6hgdbveesfqut \     192.168.122.21:2377

技术分享图片 

[root@server1 ~]# docker node  --help 

技术分享图片



三个节点均导入

[root@server1 ~]# docker load -i nginx.tar 

[root@server1 ~]# docker service create --name web -p 80:80 --replicas 2 nginx


[root@server1 ~]# docker node  ls    #查看节点

技术分享图片


[root@server1 ~]# docker service ls #查看服务状态

技术分享图片


[root@server1 ~]# docker service ps web  #查看web状态

技术分享图片


浏览器访问

技术分享图片技术分享图片技术分享图片



[root@server1 ~]# docker service scale web=4 #设置服务数量


技术分享图片


添加可视图形界面

[root@server1 ~]# docker load -i visualizer.tar   

技术分享图片


[root@server1 ~]# docker service create \

> --name=viz \

> --publish=8080:8080/tcp \

> --constraint=node.role==manager \

> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \

> dockersamples/visualizer 


技术分享图片


技术分享图片


二、滚动更新(灰度更新)


先从物理机导出镜像,分别发送到个结点

导出镜像 [root@foundation12 ~]# docker save -o apache.tar rhel7:v2

各个节点导入


[root@server1 ~]# docker load -i apache.tar

技术分享图片


[root@server1 ~]# docker service update --image rhe7:v2 --update-parallelism 2 --update-delay 2s web

#2秒更新一次,每次更新2


技术分享图片


访问

技术分享图片


192.168.122.21/22/23

技术分享图片


写入页面

技术分享图片


分别拷入到容器里

[root@server1 ~]# docker cp index.html 5694899fc975:/usr/share/nginx/html 


技术分享图片


测试  实现负载均衡

浏览器访问IP,页面切换



docker swarm ,滚动更新

标签:oss   两台   update   虚拟   file   bss   连接   全球   name   

原文地址:http://blog.51cto.com/13362895/2131143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!