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,或者k8s的externalIP->NodePort類似),可以手動指定未使用埠(-p <PUBLISHED-PORT>:<TARGET-PORT>或者--publish <PUBLISHED-PORT>:<TARGET-PORT>);或者不指定,由docker swarm在30000-32767中指定一個埠。
Ingress load balancing會在每個容器中添加一塊網口,用於連接到ingress network中(swarm默認創建的overlay network, 10.255.0.0/16),並使用VIP(IPVS技術)分發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
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
可以使用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
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
可以在同一個網路中創建其他的容器或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
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
容器接入到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
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
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
docker exec -it nginx-overlay.2.dljwj0snimwznrafav7zf5mc8 ip addrn
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
docker service inspect nginx-overlayn
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
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 |