標籤:

Docker Swarm Mode

目錄

  • Dockern 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後開始集成swarmnmode(swarmkit),關於swarm的所有操作可以直接使用docker swarm 命令來完成。Docker Swarm是docker原生的用於管理docker集群的工具,內置kv存儲功能,不再需要外置的etcd,目前的功能主要有:

a. nDocker節點集群的管理,包括集群的創建,master,worker節點的加入刪除。

b. n服務的管理,包括service的創建刪除,update,scale等。

c. n跨主機的網路管理(overlay)

d. n服務發現(內建DNS服務,服務可以通過dns發現)

e. n服務負載均衡LB(埠暴露routing meshing, VIP, DNS-round-robin)

Docker SwarmnMode和Swarm是有區別的,雖然都是集群管理服務編排工具。

1.1 nSwarm mode基本概念

n1.1.1 nSwarm

Swarm就是一個運行dockernengine的節點(node)的集合。這個節點集合可以用來發布和編排服務。而加入到這個swarm中的node就是運行在swarm mode。

Node可以主動初始化一個swarmncluster或者加入一個已存在的swarm cluster,這樣此node就成為一個swarm mode的node。

Swarm mode節點分為managernnode和worker node。類似mesos,k8s中的master節點和slave節點。

docker swarm init --advertise-addr x.x.x.xndocker swarm join-token managern

檢查一個節點是否處於swarm mode:

docker info //check swarmn

1.1.2 nNode

Manager節點用於cluster的管理,swarm命令基本只能在manager節點執行。一個cluster可以有多個manager節點,但只有一個節點可以成為leader manager node,leader選主通過raft協議實現,參數可配置。

Worker節點是任務執行節點,manager將service下發至worker節點執行。如下圖:MANAGERnSTATUS為空的是worker節點,Reachable的是非leader manager node。Manager節點默認也作為worker節點。

1.1.3 nServices和tasks

Task是swarm中的最小原子調度單位,目前來說就是一個單一的容器(後期可能會支持pod模式,那就是一個pod了估計)。

Services是指一組task的集合,service定義了這些task的屬性。目前,services有兩種模式:

a. nreplicatednservices按照一定規則在各個worker node上運行指定個數的tasks,和k8s的replicate概念,marathon中的instance一樣。

b. nglobalnservices每個woker node上運行一個此task。和marathon中的uniquenconstraints一樣(k8s是什麼?)。

命令示例:

docker service create --replicas 3 --name nginx nginx //創建服務ndocker service ls //查看服務ndocker service ps nginx //查看taskndocker service inspect nginx //查看服務/task詳細信息n

1.1.4 nLoad balancing

a. nIngress 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. nInternal load balancing:

Swarm mode有個內置的DNS模塊,可以給每個service分配一個DNS條目,每個DNS條目對應著service的多個task實例。同一容器網路中可以通過該DNS條目來統一訪問對應的service,從而達到負載均衡的效果。

n1.1.5 nSwarm 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 n示例環境及組件

本文所有步驟均在UCLOUD的雲主機Uhost上操作。

2.2 nDocker安裝及配置(centos 7- Dockenversion: 1.12.5)

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

[docker-main-repo]nname=Docker main Repositorynbaseurl=Index of /repo/main/centos/7/nenabled=1ngpgcheck=1ngpgkey=https://yum.dockerproject.org/gpgn

安裝docker 1.12.5

yum install -y docker-engine-1.12.5-1.el7.centos.x86_64ndocker –vn

將--live-restore設置成false

Startndocker service:

service docker startn

2.3 n集群創建/退出

n2.3.1 n創建集群

a. 在一個manager節點上初始化swarm。

docker swarm init --advertise-addr 10.10.245.53n

註:

初始化的時候會列印出worker的join-token,其他worker要加入swarm集群的話需要執行:

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

也可以通過命令dockernswarm join-token worker來獲取worker的join-token。

如果是其他的manager要加入swarm集群,需要先獲取manager的join-token,通過manager節點執行以下命令獲取:

//get manager join-tokenndocker swarm join-token managern//manager joinndocker swarm join --token [manager-join-token] 10.10.245.53:2377n

b. 添加manager node

先獲取manager join-token

docker swarm join-token managern

將節點10.10.218.59加入swarm中:

docker swarm join n --tokennSWMTKN-1-0qlpkzimxxt2htogs64mz991x4xe8q37mkn3t130b2175jxu0a-6yjcu2mrjjvqc9gt9y7guiryw n 10.10.245.53:2377n

c. n添加woker node

使用swarm init時給出的worker join-token:

docker swarm join n --tokennSWMTKN-1-0qlpkzimxxt2htogs64mz991x4xe8q37mkn3t130b2175jxu0a-9e3umt71jpw78czdh67p5wcfy n 10.10.245.53:2377n

d. 查看集群節點

可以通過命令docker node ls 查看整個swarm集群的節點信息。

可以看到整個集群已經創建成功,有2個manager,3個worker節點。

n2.3.2 nworker節點退出

如果節點僅僅是worker node:

執行下面命令退出swarm cluster。

docker swarm leaven

也可以在manager節點將worker node刪除。

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

2.3.3 nmanager節點退出

如果節點是manager節點:

Manager節點退出需要先demote,再做刪除節點操作。

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

2.4 n服務創建/擴縮實例/滾動升級/刪除

n2.4.1 nCreate Service

使用docker servicencreate來創建service,具體參數參看docker service create -h。

下面例子中創建了一個名稱為nginx的服務,3個實例,鏡像為nginx,默認bridge網路。

docker service create xxxn//查看所有servicendocker service lsn//查看具體servicendocker service ps xxxn

2.4.2 nScale service

可以使用docker servicenscale來對service的實例進行擴縮。

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

n2.4.3 nUpdate service

可以使用docker service update來對service進行更新。

docker service update [OPTIONS] SERVICEn

2.4.4 nDelete service

使用docker service rm來刪除service

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

2.5 nIngress LB使服務被外部訪問

Swarm mode使用--publishn<PUBLISHED-PORT>:<TARGET-PORT>來將容器服務暴露至外部網路,從而被外部訪問。

docker service create --name=nginx-meshn--publish 8080:80 --replicas 3 nginx:dnstoolsn

從宿主機網路訪問服務:

通過uhost的EIP訪問服務(修改防火牆規則,開啟8080埠許可權):

2.6 nInternal LB(DNS輪詢)

Swarm mode會有一個內置DNS組件,用於在同一個overlay的network中為service提供域名服務。當創建service的時候使用--endpoint-modendnsrr時,swarm會將該service的DNS對應到所有的容器實例,從而實現LB。

默認nginx鏡像中沒有nslookup命令,需要手動安裝。我將安裝完curl和nslookup的nginx鏡像重新製成新的鏡像nginx:dnstools.

n2.6.1 nnginx:dnstools鏡像製作

Dockerfile:

FROM nginxnMAINTAINER xxxnnRUN apt-get update && napt-get install -y dnsutils && apt-get install -y curln&& apt-get cleann

使用Dockerfile創建鏡像:

docker build –t nginx:dnstools .n

2.6.2 n創建overlay network

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

2.6.3 n使用dnsrr創建service

docker service create --endpoint-mode dnsrr --replicas 3 --namennginx-dnsrr --network my-net nginx:dnstoolsn

n2.6.4 nCheck service

可以在同一個網路中創建其他的容器或service來通過域名「nginx-dnsrr」訪問剛才創建的nginx-dnsrr服務;也可以直接使用nginx-dnsrr中的任一容器來訪問nginx-dnsrr。從nslookup的結果可知,nginx-dnsrr域名對應後端的三個容器IP。

docker exec -it nginx-dnsrr.1.2fnr14ahknrdygbxz3nascfb8 nslookupnnginx-dnsrrn

docker exec -it nginx-dnsrr.1.2fnr14ahknrdygbxz3nascfb8 curlnnginx-dnsrrn

3. Docker Swarm Mode Network

Swarm mode創建service默認使用bridge模式,此時,跨主機的容器間無法通信。要使跨主機容器間通信,需要將service接入overlay network(ingress或自定義),或者是使用第三方的網路插件。

Swarmnmode 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 nBridge Network

a. 創建默認網路的service

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

b. 查看容器網卡信息

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

此時,可以通過flannel來連通跨宿主機的容器網路通信。

c. n查看宿主機網橋信息

3.2 nIngress network

只有使能了埠映射(publishednport)的service才會將容器加入ingress network,ingress network本身是一個基於vxlan的overlay network。默認網段為10.255.0.0/16.

docker network inspect ingressn

n3.2.1 nbridge network設置published port

a. Service設置published-port

docker service create --name=nginx-mesh --publish 8080:80 --replicasn3 nginx:dnstoolsn

b. 查看容器網卡信息

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

可以看到容器有兩個網卡(除lo),一個接入docker_gwbridge網路,另一個接入ingress網路。不同節點間的容器在ingress網段互通。

n3.2.2 nOverlay network設置published port

a. Service設置published port

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

b. 查看容器網卡信息

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

可以看到又多了一塊my-net overlay網路的網卡。

n3.2.3 nDnsrr的Overlay network設置publishednport

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

3.3 n自定義overlay網路

Swarm中的Overlay網路有兩種endpointnmode:

l DNS-RR:DNS輪詢,此模式下的service有統一的域名解析到不同的task容器IP,達到LB。

docker service inspect nginx-dnsrrn

l VIP:virtual IP,本質是用到了linux內核中的LVS技術(IPVS),對外有統一的service域名(解析到VIP),和唯一的VIP。VIP會相應負載均衡至每個task實例。

docker service inspect nginx-overlayn

n3.3.1 nVIP

docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookupnnginx-overlayndocker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookupntasks.nginx-overlayn

3.3.2 nDNSRR

docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookupnnginx-dnsrrndocker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 nslookupntasks.nginx-dnsrrn

3.4 nNetworking plugins

1.12版本的dockernengine在swarm mode下只支持內置的overlay network,不支持weave,flannel,calico之類的第三方網路插件。後期版本應該會支持。

參考:Docker network driver plugins

4. Issues

l Error response from daemon: --cluster-store and --cluster-advertise daemonnconfigurations 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 incompatiblenwith swarm mode

使用Swarm mode時不能配置—live-restore, centos yum源安裝的docker會默認配置此項為true。需要手動禁止此項。

/etc/docker/daemon.jsonn=>

參考:unable to initialize docker swarm

5. Reference

l Swarm mode overview

l Swarm mode key concepts

l Getting started with swarm mode

l Attach services to an overlay network

l Service Discovery and Load balancing Internals in Docker 1.12


推薦閱讀:

Docker運行nginx
Docker集群日誌收集:Syslog+Rsyslog+ELK
Docker的作用的主要作用是什麼?
如何使用OpenDroneMap對航拍圖像快速建模

TAG:Docker |