docker swarm集群

                 Docker1.12+swrmkit

    docker1.12集成了swarmkit, 使你能够不用安装额外的软件包, 使用简单的命令启动建立docker swarm集群。node

若是你在运行 Docker 1.12时,你就能够原生建立一个 Swarm 集群 .python

    集成了swarm集群的安全特性, 集成了K-V存储, 你如今不须要额外部署etcd或者consullinux

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

SwarmKit将节点分为两类:docker

   工做节点(Worker:负责经过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。数据库

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

  (2)支持Rolling update 浏览器

  (3容器高可用安全

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

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

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

wKioL1koQdvDznJBAADAHVKu1T4660.png 

部署docker.12 Swarm

实验环境:

1 )这里选择三台主机运行Swarm,依次为:

Vim  /etc/hostname (更改好执行bash使其生效)

node1192.168.1.104

node2192.168.1.105

node3192.168.1.113

2) 基本环境配置

3台主机确保时间一致

wKiom1koQe7QNJZfAABwuaKcn0Y727.png 

 

wKioL1koQgWSGQfBAAA47Mn-D9c202.png 

 

wKioL1koQhjz2D-7AADmy3zxQpE396.png 

 

 

wKioL1koQiiwnsvmAACCoilAC1g658.png 

wKioL1koQjnT35QRAACnfsZ_VyI186.png 

三台主机以实现时间同步

 

3台主机均关闭selinux,开启路由转发。

wKiom1koQk3wP0MQAADWi2CNe6U009.png 

 

wKioL1koQmSwUex0AAD1Xxehm24513.png 

 

wKiom1koQnqCse1ZAADQU9OAf4U868.png 

 

3 )系统环境准备

准备系统环境, 配置host列表
3台主机均修改/etc/hosts文件,添加全部主机的ip地址和主机名的映射记录

wKioL1koQpHSPW00AACqllSZwK8572.png 

 

wKioL1koQqDC_mVIAADROesIFX4132.png 

 

wKiom1koQrDj847pAACf_5BqFm0709.png 

 

 

4 3台主机开启宿主机之间的端口 

TCP端口2377集群管理端口

TCPUDP端口7946节点之间通信端口

TCPUDP端口4789 overlay网络通信端口

host1 为例,

wKioL1koQ1GzFkA4AADmP7YpBeQ535.png 

 

5 配置全部节点密钥登陆.

配置因此节密钥互信, node1能够免密码登陆各节点,只在node1上执行:

生成sshkey

wKiom1koQ5vyQ1j4AAEt7ADRrgE297.png


 

发布sshkey到各个节点

wKioL1koQ5_TodS_AAFbTDvXgEA689.png 

/root/.ssh目录下的id_rsa.pub公钥发布给其它两台node主机上,发布给那台主机,就在那台主机的/root/.ssh目录下生产authorized.key文件,其内容和node1id_rsa.pub同样

测试密钥登陆

wKioL1koQ6HBpWycAACegPsun5c405.png 

6 )在全部节点上安装docker 1.12(若是没有docker 1.12软件包,按照docs.docker.com官网安装)

添加docker repo文件

rm -rf /etc/yum.repos.d/*

tee /etc/yum.repos.d/docker.repo<<-'EOF'

[dockerrepo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

EOF

安装docker package

yum -y install docker-engine

我这里已经有下载好的docker1.12软件包,因此不适用上面提供的方法,直接使用rpm在三台主机上都安装

(以host1 为例)

wKiom1koQ6aCNZc-AAHGU0qhGRU961.png 

 

检查docker版本

wKiom1koQ6eDS2UYAAA2OGAXDLw905.png 

 

 

docker1.12 Swarm 模式简介

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

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

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

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

docker service 建立管理 service

能够查看docker  --help

 

建立 Swarm集群

node1上初始化swram集群:

注意 你只须要在一个node1上初始化swarm集群, 其余node加入这个集群就好了, 因此如下命令只须要在node1上运行.

 wKioL1koQ6vBwXhPAAFJ022G-pI209.png

 

解释:根据如上命令的提示:
咱们的其余节点服务器,worker角色加入swarm集群须要登陆到服务器运行以下命令:

wKiom1koQ6zRRzs7AABnY-7UcG4973.png 

manager角色加入swarm集群:

wKioL1koRTaw0DKpAABm1wVNM14361.png

 

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

 

查看端口号监听状况

wKioL1koRQ6BaJLOAADK2cGqD7g511.png 

 

检查node1 docker swarm mode信息:

wKiom1koRQ_QkL91AADK500pQSM240.png 

wKiom1koRRDA7YO7AAEm8_lrOl4991.png 

 

查看swarm集群node列表

wKioL1koRRCQ49QSAABBPaCcGDM686.png 

能够看到,咱们的swarm集群中只有一个节点.如今咱们把其余节点加入咱们的集群中:

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

wKiom1koRRGgssHyAACZq2JFtf8651.png 

node1经过ssh, node2-node3上执行上面的加入集群命令:

 

wKioL1koRRGQUuLhAADcdPWvG7c453.png 

再次检查集群节点列表, 咱们能够看到全部的服务器都已经加入swarm集群

wKioL1koRRKBaP5eAABRMw4-6qc629.png 

不过如今集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 咱们但愿创建多个manager节点集群.

只须要经过以下命令, 提高worker节点成manager节点:

查看node2docker  info

 

wKiom1koRtHR-zMKAABzUkBsBX0019.png 

wKioL1koRtGBGmg2AAEBsywye1I608.png 

如今咱们能够看到, 已经有2manager节点了, 一个Leader节点, 一个Reachable节点. 如今你也能够在node2上面管理整个swarm集群.

咱们的swarm集群就搭建完毕了.

习惯使用docker命令帮助:docker<command>  --help

总结:

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

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

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

dockerswarm leave命令因为离开集群

附:node下线

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

 

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

很简单, 基本上原来咱们使用docker run的命令建立容器, 把前面替换成docker service create就好了.

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

因此搭建一个私有仓库,由私有仓库提供所须要的镜像,

本实验环境中用node2同时做为registry

拉取本地私有仓库registry查看registry镜像

1开启路由转发

vi  /etc/sysctl.cof

添加net.ipv4.ip_forward=1

执行sysctl  -p使修改生效

2 registry2.tar导入到本地,并查看

wKiom1koRtKQOk_NAACLtQVXFMQ491.png 

wKioL1koRtKxSJT-AAAxy34Vf-A927.png 

Registry1registry2版本的区别

   1 registry1python语言写的,而如今registry2版本即docker distribution更加安全和快速,而且是用go语言写的

基于私有仓库镜像运行容器

  2默认状况下,registry2会将仓库存放于容器的/var/lib/registry目录下,这样若是容器被删除,则存放于容器中的镜像也会丢失,因此咱们通常状况下会指定本地一个目录挂载到容器的/var/lib/registry下,两个目录下都有!

·registry的默认存储路径是/var/lib/registry,只是个临时目录,一段时间以后就会消失

·因此使用-v参数,指定个本地持久的路径,

wKiom1koRtKSFQHDAAALoXWWuyc974.png 

 

wKioL1koRtPh6y4cAACb3ieW_bg372.png 

wKiom1koRtOAc3V3AAAZy-MSRpE310.png 

返回{"repositories":[]} 说明registry服务工做正常.

注:镜像信息存放在/var/lib/registry目录下,所以这里将宿主机目录映射到/var/lib/registry

私有仓库已搭建完毕

全部主机都指向registry服务器:node1为例,其余两台主机做相同的配置

中止docker服务

wKiom1koRtTwrKMjAACbCf8c1QI405.png 

 

wKioL1koRtTgfKVHAAB1bD0x6nQ959.png 

 

重载docker服务并启动docker服务

wKioL1koRtWSPD5RAAATaskBiTA585.png 

测试本地镜像仓库

有了本地镜像仓库registry, 如今咱们推送一个测试镜像到本机镜像仓库, 测试下registry服务.

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

若是想把镜像推送到本地registry.

wKiom1koSYSTN4fOAABWl--z5w4304.png


须要先tag这个镜像的名字成<registry>/<p_w_picpath name>:<tag>并查看镜像


 wKioL1koSYTCz0jEAABS-cC5xlU639.png

 

tag后的镜像上传到registry.

wKioL1koSYaRsYqwAACucFoa12Q195.png 

 

push成功后, 能够调用registry API查看 registry中的镜像

wKiom1koSYegGvSFAAAda9G5Wxw733.png 

 

wKiom1koSYeggvZlAAAM0efrWNs478.png 

node3主机测试从registry下载镜像并查看

wKioL1koSYvi2Se1AAFzYrk0QkM780.png 

wKiom1koSZHDhxmhAAHOpzScKxY025.png 

 

overlay网络

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

单台服务器的时候咱们应用全部的容器都跑在一台主机上, 因此容器之间的网络是互通的. 如今咱们的集群有3台主机, 因此docker应用的服务会分布在这3台主机上.

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

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

docker 1.12之前, swarm集群须要一个额外的key-value存储(consul, etcdetc). 来同步网络配置, 保证全部容器在同一个网段中.
docker 1.12已经内置了这个存储, 集成了overlay networks的支持.

下面咱们演示下如何建立一个 overlay network:

注:swarm上默认已有一个名为ingressoverlay 网络, 能够直接使用, 但本文会建立一个新的

为咱们的docker应用建立一个名为dockercoinsoverlay network

wKioL1koSZPReRL0AACN6hqzHfI975.png 

查询docker network 列表

wKiom1koSZSTm1gEAACo5da214g495.png 

 

在网络列表中你能够看到dockercoins网络的SCOPEswarm, 表示该网络在整个swarm集群生效的, 其余一些网络是local, 表示本机网络.
你只须要在manager节点建立network, swarm集群会自动处理配置到其余的节点,这是你能够查看其余节点的network. dockercoins网络已经都建立了.:


wKiom1koS4bgo1B5AAExXHaFJI0363.png

wKioL1koSZazX2yXAADLnhNHc8I453.png 

 

 

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

 

swarm集群上运行docker应用

概念解释:service

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

服务包括两种类型:

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

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

 

发布服务

manager上执行以下命令:

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

 

复制服务类型运行服务

manager上执行以下命令:

wKiom1koS7mTFlGIAAAnnB9WRg0004.png 

docker service create命令建立一个 service.

--name标签命名serviceweb1.

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

注意, 咱们启动的镜像名字192.168.1.104:5000/centos:http使用咱们本地镜像仓库的镜像名称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像.

使用docker service ls查看服务

wKioL1koS_SSGqOHAAAm1jRYFko180.png 

 

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

 

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

wKioL1koTAqzxNMbAAAm1jRYFko270.png 

 

如今你能够用浏览器访问http://192.168.1.104:8000 就能访问测试页

wKiom1koTCSiPKoCAAC6MRKpM4c321.png 

事实上, 你能够访问swarm集群中的全部节点 192.168.1.105192.168.1.1138000端口, 均可以访问测试页。(注:将firewall防火墙默认区域设置为trusted

 

wKioL1koTEXRBcVSAAAZw9XJx3E145.png 

wKioL1koTFizl0DbAACVOvsNclg034.png 

 

manager上执行以下命令:

wKiom1koTGyRQN64AAAv4vozS8A154.png 

 

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

查看服务:需等待一会,才会显示REPLICAS

wKioL1koTHyzzc5VAAA6IvCvBso163.png 

 

 wKiom1koTROy-zXpAABai_qgMtY521.png

从上图能够看到web2名称的service2个副本分别运行在node2node3节点上。

 

以全局服务类型运行服务

wKiom1koTViybTQSAACF2ODs46g687.png

 

从下图能够看到服务web4在每一个节点上都运行一个

wKiom1koTXvCDSMtAABtXiFH-Ec932.png 

 

下面咱们扩展旧的服务,从下图能够看到web1  service目前只有一个副本

wKioL1koTZCANqvhAABHHrHifZQ542.png 

 

扩展已有的服务的副本数,这里将web1服务扩展到3个副本

wKiom1koTZ2zl7XBAADpKCdJKlg569.png 

 

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

wKioL1koTa2zWhkcAAC69dJ1NYM077.png 

 

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

自修复(self-healing

通过上面的操做以后,咱们有如下3个节点:

wKiom1koTcDQn-KwAABOxqO06ww992.png 

 

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

wKioL1koTdGzSpAwAACVRgqYT6k504.png 

 

Node2节点上运行着容器3个容器还有一个私有仓库注册服务器容器

wKiom1koTeHzOzI9AAD910pwlkI121.png 

 

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

wKioL1koTfDQ_JuDAADwUAHuc_M220.png 

 

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

wKiom1koTgTgq8CUAAD5CXP01DA269.png 

 

如今咱们让node3上的容器都宕掉或部分宕掉

wKiom1koThHwZlEVAAB7D7rk1_0665.png 

 

一旦node3上全部容器中止,Docker就会试图在相同的节点上启动2个不一样ID的容器。

这就是Docker Swarm Engineself-healing功能。

node3节点上执行docker  ps查看

wKioL1koTiDys7XXAAB3CX8lQU8737.png 

 

Self-Organizing

如今咱们让node3整个宕掉,node3上的容器会自动在其它节点上启动。

manager节点上执行docker  server ps 服务名

wKiom1koTi6S4Tp4AAEjN5ou6vo548.png 

 

总结:docker  swarm 既能实现容器的高可用,也能实现负载均衡

相关文章
相关标签/搜索