docker1.12+swarmkit

  1. 云栖社区>
  2. 博客>
  3. 正文

docker1.12+swarmkit

技术小大人 2017-11-16 14:09:00 浏览665
展开阅读全文

博主QQ:819594300

博客地址:http://zpf666.blog.51cto.com/

有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!

docker1.12集成了swarmkit,使你可以不用安装额外的软件包, 使用简单的命令启动创建dockerswarm集群。

如果你在运行 Docker 1.12时,你就可以原生创建一个 Swarm 集群 .

集成了swarm集群的安全特性, 集成了K-V存储, 你现在不需要额外部署etcd或者consul。

在Docker1.12版本中,一个大的功能点是swarm集群(基于swarmkit项目),通过Docker命令可以直接实现docker-engine相互发现,并组建成为一个容器集群。

SwarmKit将节点分为两类

工作节点(Worker):负责通过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。

  (1)内建分布式存储,不要额外的数据库

  (2)支持Rolling update

  (3容器高可用

  (4)通过TLS保证了节点之间通讯的安全

管理节点(Manager):负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在Manager和Worker之间转换。

如下图所示,这是一个典型的master-slave的架构。每个节点都是运行着Docker Engine的Docker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。

wKioL1jN7cHRldVZAAHhoQJRbVs542.jpg

实验:部署docker.12  Swarm

实验环境

这里选择三台主机运行Swarm,一台主机运行私有仓库。

依次为:

node1  192.168.1.1

node2  192.168.1.2

node3  192.168.1.3

registry  192.168.1.4

虚拟机实验环境:

wKiom1jN7cKTDOgWAABzs4_KuJw467.jpg

实验前准备工作

1)配置ntp时间服务器,确保三台node主机时间统一

2)配置好各自的IP地址

3)修改好各自的主机名

4)全部主机都关闭selinux

5)三台node主机开启路由转发功能

实验步骤:

1)配置时间服务器

wKioL1jN7czRibNaAAG0xXb4Vns454.jpg

wKioL1jN7dHiwjcGAAFI_d84VfQ284.jpg

wKiom1jN7dPjDMZQAAC9k88hekY673.jpg

wKiom1jN7dXD-1-CAADI9EacEig351.jpg

wKioL1jN7eHREo6sAAEBjHl9WHg216.jpg

wKiom1jN7eOB_tNDAAFNQNnTWBg772.jpg

wKioL1jN7ebRISRuAAFPLEGb3AY368.jpg

wKioL1jN7emgi3n4AADv3Tf4_vw432.jpg

wKiom1jN7evzrw-3AACTKMpQcLs234.jpg

同时,node3也同步node1的时间

wKiom1jN7e7QapZlAACL7VQq-x0376.jpg

至此时间服务器配置完毕,三台node主机时间也已经全部同步了。

2)三台node主机全部需要修改hosts文件,添加三台主机的ip地址和主机名的映射记录。

wKioL1jN7fSyaSw4AAC9iZZWDoI488.jpg

wKioL1jN7fqxd4-JAADqo9bcuSQ593.jpg

wKiom1jN7fyiNALFAADnTC5WDcE344.jpg

wKiom1jN7gOh01DrAAGKzvjyGgg479.jpg

3)三台node主机防火墙开启以下端口例外

说明:开启宿主机之间的端口 

TCP端口2377集群管理端口

TCP与UDP端口7946节点之间通讯端口

TCP与UDP端口4789 overlay网络通讯端口

wKioL1jN7jLDJ4cKAAKNF9VWc50845.jpg

wKiom1jN7jvAZIdJAAKS37kmwD0130.jpg

wKioL1jN7lji15nJAALAHJ6tpQQ774.jpg

4)配置所有节点密钥互信, 在node1可以免密码登录各节点,只在node1上执行

wKiom1jN7mDgpiN9AAJy5lCBWRA919.jpg

wKioL1jN7mexO8wHAALYSmr4Kps286.jpg

5)测试密钥登录

wKiom1jN7m3QC2x5AAEeSHl5fAA252.jpg

6)安装docker 1.12(按照docs.docker.com官网安装),在所有节点上安装docker 1.12

如果没有docker1.12软件,参照下面截图的步骤:

wKioL1jN7nDAdy-fAAF6HaoGmew533.jpg

我这里已经有下载好的docker1.12软件,所以我不用上面的方法了,我直接rpm包安装即可。(三台node主机都要安装)

wKiom1jN7oSD57iSAAG3aC650j4974.jpg

wKioL1jN7oeRrZ2OAAGDq32vtUs229.jpg

wKiom1jN7oryTD8gAAGOqOCfKeo253.jpg

7)三台node主机都启动docker

wKioL1jN7o-Qur3ZAADB4roPbKM398.jpg

检查docker版本

wKioL1jN7pCjAuPTAADIQC836rs778.jpg

知识点说明:

docker1.12 Swarm 模式简介

Docker Engine 1.12 集成了Swarm集群工具.

主要使用三个新的命令行工具创建一个swarm集群:

docker swarm 开启swarm模式加入Swarm集群; 配置集群参数

docker node 查询集群节点信息提升/移除一个管理节点; 管理swarm节点主机

docker service 创建管理 service

可以查看docker --help

8)创建 Swarm集群

在node1上初始化swram集群:

(说明:初始化群集的意思就是创建群集)

注意 你只需要在一个node1上初始化swarm集群, 其他node加入这个集群就行了, 所以以下命令只需要在node1上运行.

wKiom1jN7qqwvOJ5AAGjyMKN0Bo737.jpg

--advertise-addr参数,后面跟你swarm集群的通讯地址, 也就是node1的地址.

解释:根据如上命令的提示:

我们的其他节点服务器,以worker角色加入swarm集群需要登录到服务器运行如下命令:

wKiom1jN7qvh5s_-AAB-bjOnldE825.jpg

以manager角色加入swarm集群:

wKioL1jN7rLzBmC0AAB64FaS7wU002.jpg

查看端口号监听情况:

wKioL1jN7rPQWp1dAACMjE1-RIM173.jpg

9)在node1上查看群集信息

wKiom1jN7vvgcAVuAAED5U9QlN4564.jpg

wKiom1jN7xCgTFfbAAMxG0e63P0073.jpg

查看swarm集群node列表

wKioL1jN7xqyC1QsAAF96LpU9bo373.jpg

10)把其他节点加入集群中:

在node1通过ssh, 在node2-node3上执行上面的加入集群命令。

wKioL1jN7x_g9HezAAET5kgWAUE661.jpg

注: 如果你不记得上面提示的加入swarm集群的命令和密钥可以使用如下方式查看worker节点和manager节点的加入命令:

wKiom1jN70vwBV6hAAFTq4hv04I421.jpg

再次检查集群节点列表, 我们可以看到所有的服务器都已经加入swarm集群了

wKioL1jN71OggEONAADri3_0C1Q606.jpg

不过现在集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 我们希望建立多个manager节点集群.

只需要通过如下命令, 提升worker节点成manager节点:

wKioL1jN76CDjMMYAAGZ3FvCk8s413.jpg

查看node2的docker  info

wKiom1jN76HDYIaXAACwLlGY4kk869.jpg

wKiom1jN76_SdBTCAAKXSzO063A901.jpg

说明:现在我们可以看到, 已经有2个manager节点了, 一个Leader节点, 一个Reachable节点. 现在你也可以在node2上面管理整个swarm集群了。

以上我们的swarm集群就搭建完毕了. 超级简单。

知识点说明:

习惯使用docker命令帮助:

docker<command> --help

总结:

docker swarm:集群管理,子命令主要有下面几个

Docker swarm init命令用于初始化一个集群

Docker swarm join命令用于加入一个现有集群

Docker swarm leave命令由于离开集群

附:node下线

有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务不可用。使用dockernode update --availability drain <NODE-ID>将节点下线,swarm会将当前节点上的容器关闭并在其他节点上启动。当维护完成,需要上线是,将节点状态修改为active状态即可,命令如下:dockernode update --availability active <NODE-ID>

 

有了Docker Swarm集群我们如何把我们的应用跑在Swarm集群上呢?

很简单, 基本上原来我们使用dockerrun的命令创建容器, 把前面替换成dockerservice create就行了。

建议搭建一个registry,为所的docker主机提供镜像下载,否则你需要在每个docker主机本地存在容器镜像。

所以搭建一个私有仓库,由私有仓库提供所需要的镜像。

11)配置registry私有仓里

准备工作:

①关闭selinux

②开启路由转发

vi  /etc/sysctl.cof

添加net.ipv4.ip_forward=1

执行sysctl  -p使修改生效

③修改主机名叫docker.benet.com

 

安装docker1.12,然后下载registry2镜像

#docker pull registry:2

#docker image

wKioL1jN77KQJvVBAAB-5HII8nQ845.jpg

附:registry1是python语言写的,而现在registry2版本即docker distribution更加安全和快速,并且是用go语言写的。

wKiom1jN77SxPEBBAAJmz-N3cuY194.jpg

12)所有主机都指向registry服务器:并停止私有仓库服务器的docker服务,然后重载并启动docker服务

wKioL1jN77XAjhDQAACufA5cgOk689.jpg

wKioL1jN77WSK1W7AABIuvrH9O8401.jpg

wKiom1jN77jQ3iOyAAFhq3wHKU8762.jpg

13)测试本地镜像仓库

有了本地镜像仓库registry, 现在我们推送一个测试镜像到本机镜像仓库, 测试下registry服务.

测试:在node2主机上推送镜像到registry

如果想把镜像推送到本地registry.

需要先tag这个镜像的名字成<registry>/<image name>:<tag>

wKioL1jN77uSLBRqAADRsB0o0Os372.jpg

查看镜像:

wKiom1jN772Ap2hQAACOMbNNH0U309.jpg

将tag后的镜像上传到registry.

wKiom1jN78CS3J4YAAFJWBmihzM587.jpg

push成功后, 可以调用registry API查看 registry中的镜像

wKioL1jN78HQhtPQAAEq3P8pIy0374.jpg

删除node3已有的所有的原来镜像,我们来测试下载

wKiom1jN78Khw5GOAADTssA4pAU002.jpg

在node3主机测试从registry下载镜像

wKioL1jN7-TDOeCzAAHWnExgeuU880.jpg

 

知识点说明:

overlay网络

解决了镜像构建问题, 为了让应用跑在swram集群上,我们还需要解决容器间的网络访问问题.

单台服务器的时候我们应用所有的容器都跑在一台主机上, 所以容器之间的网络是互通的. 现在我们的集群有3台主机, 所以docker应用的服务会分布在这3台主机上.

如何保证不同主机上的容器网络互通呢?

swarm集群已经帮我们解决了这个问题了,就是只用overlaynetwork.

在docker 1.12以前, swarm集群需要一个额外的key-value存储(consul, etcdetc). 来同步网络配置, 保证所有容器在同一个网段中.

在docker1.12已经内置了这个存储, 集成了overlaynetworks的支持.

注:swarm上默认已有一个名为ingress的overlay 网络, 可以直接使用, 但本文会创建一个新的

为我们的docker应用创建一个名为dockercoins的overlay network

1)先查看docker network列表

wKiom1jN7-XDAuTOAAESuocDcnE962.jpg

2)创建一个名为dockercoins的overlay network

(创建新的overlay network必须在管理节点,不可以在工作节点)

wKioL1jN8NzytJohAACBadKc3nI029.jpg

3)再次查看docker network列表

wKiom1jN8ODzs_gXAAE2ddjwZUk769.jpg

在网络列表中你可以看到dockercoins网络的SCOPE是swarm, 表示该网络在整个swarm集群生效的, 其他一些网络是local,表示本机网络。
4)你只需要在manager节点创建network,swarm集群会自动处理配置到其他的节点,这时你可以查看其他节点的network. dockercoins网络已经都创建了。

wKioL1jN8OyAIK6DAAGH7NmataE326.jpg

注:一旦新的任务被指定给这个节点,Overlay网络就会被按需创建。

wKioL1jN8PTj-lGtAAHppxDtFI8878.jpg

知识点说明:

在swarm集群上运行docker应用

概念解释:service

Docker1.12 swarm引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器

服务包括两种类型:

复制服务(replicated services):类似 k8s 中复制集的概念,保持一定数量的相同任务在集群中运行;

全局服务(global services):类似 k8s 中 daemon 的概念,每个工作节点上运行一个。

5)在manager上执行如下命令:

下面我们可以使用之前push到本地镜像仓库的镜像启动服务, 以centos:http为例:

wKioL1jN8QzjLrWcAACehcjFzto925.jpg

说明:docker service create命令创建一个 service.

--name标签命名service为web。

--replicas标签来声明1个运行实体(即容器副本数)

注意, 我们启动的镜像名字

192.168.1.4:5000/centos:http使用我们本地镜像仓库的镜像名称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像。

6)使用docker service ls或者

docker service list查看服务

wKiom1jN8Q2itir-AABo6pYRREk070.jpg

docker service  inspect命令用户查看service详细信息

wKiom1jN8Q6R8R9FAADRh59oWf4159.jpg

使用docker service  ps<SERVICE-ID/NAME>查看服务运行在哪个节点上

wKioL1jN8RyxaQSdAACQ25grt_I516.jpg

可以看出web服务运行在了node2节点上。

7)现在你可以用浏览器访问

http://192.168.1.1:8000 就能访问测试页

wKioL1jN8R7Q3bQGAAHKxtoT0v8777.jpg

wKiom1jN8SKCxmoTAAG34n2uU_c188.jpg

wKioL1jN8SWg1cnsAAGvPd9b9PU629.jpg

wKiom1jN8Wjjt_L8AAGyasu5xQ4983.jpg

事实上, 你可以访问swarm集群中的所有节点 192.168.1.2、192.168.1.3的8000端口, 都可以访问测试页。(注:将firewall防火墙默认区域设置为trusted)

8)在manager上执行如下命令:

wKioL1jN8WixY1IOAADrk65-kmg379.jpg

--replicas标签来声明2个运行实体

查看web2服务:

wKiom1jN8WqgEpSpAADFQ6TbJjw493.jpg

从上图可以看到web2名称的service有2个副本分别运行在node2和node3节点上。

9)在manager上执行创建全局服务

wKiom1jN8W_wjIFuAAEGNeBU9t4640.jpg

wKioL1jN8XCjaMjvAADdtkbkYQw097.jpg

从上图可以看到服务web3在每个节点上都运行一个

10)下面我们扩展旧的服务,从下图可以看到web service目前只有一个副本

wKioL1jN8XeBwQ4PAAFmx-H69Uo354.jpg

11)缩减已有的服务的副本数,这里将web服务缩减到2个副本

wKiom1jN8X7T5d65AAEASc7yWNM084.jpg

知识点说明:

Swarm节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节点或容器宕掉,swarmengine就会尝试修复,下面我们来具体看一下

自修复(self-healing)

经过上面的操作之后,我们有以下3个节点:

wKioL1jN8YHRSjzdAAC2wNiltu8418.jpg

wKiom1jN8YTgbYlMAADQCl0O0lM115.jpg

上面一共运行着3个服务共7个任务(容器)

Node1节点上运行着容器2个容器。

wKiom1jN8YewqXLTAADInyIAtOw116.jpg

Node2节点上运行着容器2个容器

wKioL1jN8Yvgm6j7AAC_Kqef-7Q849.jpg

Node3节点上运行着容器3个容器

wKiom1jN8Y7Qz_lkAAD2ZoiTgBU353.jpg

现在我们让node3上的容器都宕掉或部分宕掉

wKioL1jN8ZLCwhXoAAFEsW5bU0k015.jpg

一旦node3上所有容器停止,Docker就会试图在相同的节点上启动3个不同ID的容器。

这就是DockerSwarm Engine的self-healing(自修复)功能。

 

 

Self-Organizing(自组织)

现在我们让node3整个宕掉(我直接吧node3关机了),node3上的容器会自动在其它节点上启动。

在manager节点上执行docker  server ls看一下

wKiom1jN8ZjgxdwQAAE8sF5f1Qg071.jpg

从上图可以看见没了node3,但是依然还是3个服务,7个任务(容器)。


本文转自Mr大表哥 博客,原文链接: http://blog.51cto.com/zpf666/1908067    如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小大人
+ 关注