Docker Swarm Mode

https://zhuanlan.zhihu.com/p/25738959

目录

  • Docker Swarm Mode. 1
  • 1. Docker Swarm Mode简介... 3
  • 1.1 Swarm mode基本概念... 3
  • 1.1.1 Swarm.. 3
  • 1.1.2 Node. 4
  • 1.1.3 Services和tasks. 4
  • 1.1.4 Load balancing. 4
  • 1.1.5 Swarm mode跨主机使用... 6
  • 2. Docker Swarm Mode基本操作... 6
  • 2.1 示例环境及组件... 6
  • 2.2 Docker安装及配置(centos 7- Docke version: 1.12.5)... 6
  • 2.3 集群创建/退出... 7
  • 2.3.1 创建集群... 7
  • 2.3.2 worker节点退出... 9
  • 2.3.3 manager节点退出... 9
  • 2.4 服务创建/扩缩实例/滚动升级/删除... 9
  • 2.4.1 Create Service. 9
  • 2.4.2 Scale service. 10
  • 2.4.3 Update service. 10
  • 2.4.4 Delete service. 10
  • 2.5 Ingress LB使服务被外部访问... 10
  • 2.6 Internal LB(DNS轮询)... 11
  • 2.6.1 nginx:dnstools镜像制作... 12
  • 2.6.2 创建overlay network. 12
  • 2.6.3 使用dnsrr创建service. 12
  • 2.6.4 Check service. 13
  • 3. Docker Swarm Mode Network. 13
  • 3.1 Bridge Network. 14
  • 3.2 Ingress network. 15
  • 3.2.1 bridge network设置published port 16
  • 3.2.2 Overlay network设置published port 16
  • 3.2.3 Dnsrr的Overlay network设置published port 17
  • 3.3 自定义overlay网络... 17
  • 3.3.1 VIP. 18
  • 3.3.2 DNSRR. 19
  • 3.4 Networking plugins. 19
  • 4. Issues. 20
  • 5. Reference. 20

 

1. Docker Swarm Mode简介

Docker从v1.12.0后开始集成swarm mode(swarmkit),关于swarm的所有操作可以直接使用docker swarm 命令来完成。Docker Swarm是docker原生的用于管理docker集群的工具,内置kv存储功能,不再需要外置的etcd,目前的功能主要有:

a. Docker节点集群的管理,包括集群的创建,master,worker节点的加入删除。

b. 服务的管理,包括service的创建删除,update,scale等。

c. 跨主机的网络管理(overlay)

d. 服务发现(内建DNS服务,服务可以通过dns发现)

e. 服务负载均衡LB(端口暴露routing meshing, VIP, DNS-round-robin)

Docker Swarm Mode和Swarm是有区别的,虽然都是集群管理服务编排工具。

1.1 Swarm mode基本概念

1.1.1 Swarm

Swarm就是一个运行docker engine的节点(node)的集合。这个节点集合可以用来发布和编排服务。而加入到这个swarm中的node就是运行在swarm mode。

Node可以主动初始化一个swarm cluster或者加入一个已存在的swarm cluster,这样此node就成为一个swarm mode的node。

Swarm mode节点分为manager node和worker node。类似mesos,k8s中的master节点和slave节点。

 

docker swarm init --advertise-addr x.x.x.x
docker swarm join-token manager

检查一个节点是否处于swarm mode:

 

docker info    //check swarm

1.1.2 Node

Manager节点用于cluster的管理,swarm命令基本只能在manager节点执行。一个cluster可以有多个manager节点,但只有一个节点可以成为leader manager node,leader选主通过raft协议实现,参数可配置。

Worker节点是任务执行节点,manager将service下发至worker节点执行。如下图:MANAGER STATUS为空的是worker节点,Reachable的是非leader manager node。Manager节点默认也作为worker节点。

1.1.3 Services和tasks

Task是swarm中的最小原子调度单位,目前来说就是一个单一的容器(后期可能会支持pod模式,那就是一个pod了估计)。

Services是指一组task的集合,service定义了这些task的属性。目前,services有两种模式:

a. replicated services按照一定规则在各个worker node上运行指定个数的tasks,和k8s的replicate概念,marathon中的instance一样。

b. global services每个woker node上运行一个此task。和marathon中的unique constraints一样(k8s是什么?)。

命令示例:

 

docker service create --replicas 3 --name nginx nginx //创建服务
docker service ls           //查看服务
docker service ps nginx //查看task
docker service inspect nginx       //查看服务/task详细信息

1.1.4 Load balancing

a. Ingress load balancing:

Docker Swarm Mode使用Ingress load balancing来将内部服务暴露出来到非容器网络中,比如宿主机网络,甚至是DC外部或公网中。Ingress load balancing是通过NAT将内部服务映射到宿主机的某一端口(这个特点和docker原生bridge网络的NAT,或者k8sexternalIP->NodePort类似),可以手动指定未使用端口(-p <PUBLISHED-PORT>:<TARGET-PORT>或者--publish <PUBLISHED-PORT>:<TARGET-PORT>);或者不指定,由docker swarm30000-32767中指定一个端口。

Ingress load balancing会在每个容器中添加一块网口,用于连接到ingress network中(swarm默认创建的overlay network 10.255.0.0/16),并使用VIPIPVS技术)分发ingress traffic到每个容器实例中。具体技术参看下面的网络部分。

 

每个节点暴露出来的端口服务也可以统一接入到外部的LB上提供服务,比如Haproxy。

 

b. Internal load balancing:

Swarm mode有个内置的DNS模块,可以给每个service分配一个DNS条目,每个DNS条目对应着service的多个task实例。同一容器网络中可以通过该DNS条目来统一访问对应的service,从而达到负载均衡的效果。

1.1.5 Swarm mode跨主机使用

Swarm mode节点防火墙默认需要开启的端口:

l 7946(TCP/UDP),节点用于发现容器网络,类似etcd作用

l 4789(UDP),用于overlay容器网络(vxlan的UDP默认通信端口)

l 2377(TCP),用于集群管理通信

l 50(IP/ESP),如果overlay network需要加密的话,需要开启此端口。Swarm mode使用IPSEC的ESP协议加密。

2. Docker Swarm Mode基本操作

2.1 示例环境及组件

本文所有步骤均在UCLOUD的云主机Uhost上操作。

2.2 Docker安装及配置(centos 7- Docke version: 1.12.5)

添加docker yum源文件: /etc/yum.repos.d/docker-main.repo

 

[docker-main-repo]
name=Docker main Repository
baseurl=Index of /repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

安装docker 1.12.5

 

yum install -y docker-engine-1.12.5-1.el7.centos.x86_64
docker –v

将--live-restore设置成false

 

Start docker service:

 

service docker start

2.3 集群创建/退出

2.3.1 创建集群

a. 在一个manager节点上初始化swarm。

 

docker swarm init --advertise-addr 10.10.245.53

注:

初始化的时候会打印出worker的join-token,其他worker要加入swarm集群的话需要执行:

 

docker swarm join --token [woker-join-token] 10.10.245.53:2377

也可以通过命令docker swarm join-token worker来获取worker的join-token。

如果是其他的manager要加入swarm集群,需要先获取manager的join-token,通过manager节点执行以下命令获取:

 

//get manager join-token
docker swarm join-token manager
//manager join
docker swarm join --token [manager-join-token] 10.10.245.53:2377

b. 添加manager node

先获取manager join-token

 

docker swarm join-token manager

 

将节点10.10.218.59加入swarm中:

 

 

docker swarm join \
    --token
SWMTKN-1-0qlpkzimxxt2htogs64mz991x4xe8q37mkn3t130b2175jxu0a-6yjcu2mrjjvqc9gt9y7guiryw \
    10.10.245.53:2377

c. 添加woker node

使用swarm init时给出的worker join-token:

 

docker swarm join \
    --token
SWMTKN-1-0qlpkzimxxt2htogs64mz991x4xe8q37mkn3t130b2175jxu0a-9e3umt71jpw78czdh67p5wcfy \
    10.10.245.53:2377

d. 查看集群节点

可以通过命令docker node ls 查看整个swarm集群的节点信息。

可以看到整个集群已经创建成功,有2个manager,3个worker节点。

2.3.2 worker节点退出

如果节点仅仅是worker node:

执行下面命令退出swarm cluster。

 

docker swarm leave

也可以在manager节点将worker node删除。

 

docker node rm [OPTIONS] NODE [NODE...]

2.3.3 manager节点退出

如果节点是manager节点:

Manager节点退出需要先demote,再做删除节点操作。

 

docker node demote NODE [NODE...]
docker node rm [OPTIONS] NODE [NODE...]

2.4 服务创建/扩缩实例/滚动升级/删除

2.4.1 Create Service

使用docker service create来创建service,具体参数参看docker service create -h。

下面例子中创建了一个名称为nginx的服务,3个实例,镜像为nginx,默认bridge网络。

 

docker service create xxx
//查看所有service
docker service ls
//查看具体service
docker service ps xxx

2.4.2 Scale service

可以使用docker service scale来对service的实例进行扩缩。

 

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

 

2.4.3 Update service

 

可以使用docker service update来对service进行更新。

 

docker service update [OPTIONS] SERVICE

2.4.4 Delete service

使用docker service rm来删除service

 

docker service rm [OPTIONS] SERVICE [SERVICE...]

 

2.5 Ingress LB使服务被外部访问

 

Swarm mode使用--publish <PUBLISHED-PORT>:<TARGET-PORT>来将容器服务暴露至外部网络,从而被外部访问。

 

docker service create --name=nginx-mesh
--publish 8080:80 --replicas 3 nginx:dnstools

 

从宿主机网络访问服务:

 

通过uhost的EIP访问服务(修改防火墙规则,开启8080端口权限):

2.6 Internal LB(DNS轮询)

Swarm mode会有一个内置DNS组件,用于在同一个overlay的network中为service提供域名服务。当创建service的时候使用--endpoint-mode dnsrr时,swarm会将该service的DNS对应到所有的容器实例,从而实现LB。

默认nginx镜像中没有nslookup命令,需要手动安装。我将安装完curl和nslookup的nginx镜像重新制成新的镜像nginx:dnstools.

2.6.1 nginx:dnstools镜像制作

Dockerfile:

 

FROM nginx
MAINTAINER xxx

RUN apt-get update && 
apt-get install -y dnsutils && apt-get install -y curl
&& apt-get clean

使用Dockerfile创建镜像:

 

docker build –t nginx:dnstools .

2.6.2 创建overlay network

 

docker network create --subnet=192.168.10.0/24 -d overlay my-net

2.6.3 使用dnsrr创建service

 

docker service create --endpoint-mode dnsrr --replicas 3 --name
nginx-dnsrr --network my-net nginx:dnstools

 

2.6.4 Check service

 

可以在同一个网络中创建其他的容器或service来通过域名“nginx-dnsrr”访问刚才创建的nginx-dnsrr服务;也可以直接使用nginx-dnsrr中的任一容器来访问nginx-dnsrr。从nslookup的结果可知,nginx-dnsrr域名对应后端的三个容器IP。

 

docker exec -it nginx-dnsrr.1.2fnr14ahknrdygbxz3nascfb8 nslookup
nginx-dnsrr

docker exec -it nginx-dnsrr.1.2fnr14ahknrdygbxz3nascfb8 curl
nginx-dnsrr

 

3. Docker Swarm Mode Network

 

Swarm mode创建service默认使用bridge模式,此时,跨主机的容器间无法通信。要使跨主机容器间通信,需要将service接入overlay network(ingress或自定义),或者是使用第三方的网络插件。

Swarm mode cluster默认会创建多个容器网络:

l bridge:默认的容器网络,将容器接入默认的docker0网桥,与之前版本一致。

l docker_gwbridge:local的bridge网络,用于连通单主机上的容器,使用overlay网络的时候会默认分配一个此网络的网卡给容器,使容器可以用NAT的方式和外部网络通信。

l ingress: swarm集群可见的overlay网络,当设置端口映射(-p)时,swarm会为每个service的容器分配一块网卡,连接到ingress网络(10.255.0.0/16)。

 

3.1 Bridge Network

a. 创建默认网络的service

 

docker service create --name=nginx --replicas=3 nginx:dnstools

 

b. 查看容器网卡信息

 

容器接入到docker0网桥,分配的是172.17.0.0/16网段IP。

 

此时,可以通过flannel来连通跨宿主机的容器网络通信。

c. 查看宿主机网桥信息

 

3.2 Ingress network

只有使能了端口映射(published port)的service才会将容器加入ingress network,ingress network本身是一个基于vxlan的overlay network。默认网段为10.255.0.0/16.

 

docker network inspect ingress

 

3.2.1 bridge network设置published port

 

a. Service设置published-port

 

docker service create --name=nginx-mesh --publish 8080:80 --replicas
3 nginx:dnstools

b. 查看容器网卡信息

 

docker exec -it nginx-mesh.2.d5wi6ds494rdl4pe1mt8dajx8 ip addr

 

可以看到容器有两个网卡(除lo),一个接入docker_gwbridge网络,另一个接入ingress网络。不同节点间的容器在ingress网段互通。

 

3.2.2 Overlay network设置published port

a. Service设置published port

docker service create --name=nginx-overlay --replicas=3
--network=my-net -p 8100:80 nginx:dnstools

 

 

b. 查看容器网卡信息

 

 

docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 ip addr

 

可以看到又多了一块my-net overlay网络的网卡。

 

3.2.3 Dnsrr的Overlay network设置published port

设置了dnsrr的network不能再设置published port,也就是不能加入ingress network。

 

3.3 自定义overlay网络

 

Swarm中的Overlay网络有两种endpoint mode:

l DNS-RR:DNS轮询,此模式下的service有统一的域名解析到不同的task容器IP,达到LB。

 

docker service inspect nginx-dnsrr

 

l VIP:virtual IP,本质是用到了linux内核中的LVS技术(IPVS),对外有统一的service域名(解析到VIP),和唯一的VIP。VIP会相应负载均衡至每个task实例。

 

 

docker service inspect nginx-overlay

 

3.3.1 VIP

 

 

docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookup
nginx-overlay
docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookup
tasks.nginx-overlay

3.3.2 DNSRR

 

docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookup
nginx-dnsrr
docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookup
tasks.nginx-dnsrr

 

3.4 Networking plugins

 

1.12版本的docker engine在swarm mode下只支持内置的overlay network,不支持weave,flannel,calico之类的第三方网络插件。后期版本应该会支持。

 

参考:Docker network driver plugins

4. Issues

l Error response from daemon: --cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode

 

使用swarm mode时,docker daemon不能设置--cluster-store and --cluster-advertise。

 

参考[1.12.0-rc3] Swarm mode is incompatible with "--cluster-store" config so calico network will not work · Issue #24569 · docker/docker

l Error response from daemon: --live-restore daemon configuration is incompatible with swarm mode

 

使用Swarm mode时不能配置—live-restore, centos yum源安装的docker会默认配置此项为true。需要手动禁止此项。

/etc/docker/daemon.json =>

 

参考:unable to initialize docker swarm

5. Reference

Swarm mode overview

Swarm mode key concepts

Getting started with swarm mode

Attach services to an overlay network

Service Discovery and Load balancing Internals in Docker 1.12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值