What is Docker Swarm?node
Docker Swarm是一套管理docker集羣的工具。它將一羣docker宿主機轉變爲單個的虛擬主機。因爲Swarm提供標準的API接口,所以,任何可以和docker守護進程通訊的工具,均可以利用swarm去擴展多個主機,支持的docker工具如,Dokku、Docker compose、Docker machine、jenkis、docker-py、Krane、Deis等等。Docker自己均可以很容易與Swarm進行集成。 linux
在使用Swarm管理docker集羣時,會有一個swarm manager以及若干的swarm node,swarm manager上運行swarm daemon,用戶只須要跟swarm manager通訊,而後swarm manager再根據discovery service的信息選擇一個swarm node來運行container。nginx
值得注意的是 swarm daemon 只是一個任務調度器(scheduler)和路由器(router),它自己不運行容器,它只接受Docker client發送過來的請求,調度合適的swarm node來運行container。這意味着,即便 swarm daemon 因爲某些緣由掛掉了,已經運行起來的容器也不會有任何影響。
redis
有如下兩點須要注意:
docker
集羣中的每臺節點上面的Docker的版本都不能小於1.4json
爲了讓swarm manager可以跟每臺swarm node進行通訊,集羣中的每臺節點的 Docker daemon都必須監聽同一個網絡接口。centos
基本概念bash
節點網絡
運行 Docker 的主機能夠主動初始化一個 Swarm 集羣或者加入一個已存在的 Swarm 集羣,這樣這個運行 Docker 的主機就成爲一個 Swarm 集羣的節點 (node) 。app
節點分爲管理 (manager) 節點和工做 (worker) 節點。
管理節點用於 Swarm 集羣的管理,docker swarm 命令基本只能在管理節點執行(節點退出集羣命令 docker swarm leave 能夠在工做節點執行)。一個 Swarm 集羣能夠有多個管理節點,但只有一個管理節點能夠成爲 leader,leader 經過 raft 協議實現。
工做節點是任務執行節點,管理節點將服務 (service) 下發至工做節點執行。管理節點默認也做爲工做節點。你也能夠經過配置讓服務只運行在管理節點。
如下展現了集羣中管理節點與工做節點的關係。
服務和任務
任務 (Task)是 Swarm 中的最小的調度單位,目前來講就是一個單一的容器。
服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
replicated services 按照必定規則在各個工做節點上運行指定個數的任務。
global services 每一個工做節點上運行一個任務
兩種模式經過 docker service create 的 --mode 參數指定。
來自 Docker 官網的這張圖片形象的展現了容器、任務、服務的關係。
總體環境
關於Swarm集羣構建
在構建Docker swarm集羣時,能夠經過docker自帶的Swarm mode進行構建。Swarm mode是Docker Engine內置支持的一種默認實現模式,很容易使用,而且不須要安裝任何額外的軟件。Docker 1.12或者更高的版本中,都默認支持Swarm mode。經過Swarm mode構建Docker集羣的方式很簡單,基本包括:初始化一個Swarm集羣、將node節點加入到集羣中、將應用服務部署到Swarm集羣中。這樣一個Swarm集羣及應用部署就構建好了。
Swarm集羣基本特性:
集羣管理模式集成於Docker Engine
靈活添加集羣Manager節點或node節點
服務的發現、滾動更新和擴容及縮容
指定node節點分發服務容器,實現負載均衡
設置Swarm集羣
初始化集羣
[root@centos7 ~]# docker swarm init --advertise-addr 192.168.39.185 Swarm initialized: current node (cu0e19sasn77t44wbjnsjtn8s) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-503tbj031pm5udwskezixpeu666bce2valkvt9wq0uco1af2os-4a1z8tbjhf3diyxo7kghf26v4 192.168.39.185:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
多個網卡須要--advertise-addr參數指定相應網卡,其中node個節點都是經過此參數指定的網卡與Manager節點創建的通訊。此時經過netstat命令能夠查看到端口2377監聽集羣節點請求。
輸出包括如下命令:
docker swarm join --token SWMTKN-1-503tbj031pm5udwskezixpeu666bce2valkvt9wq0uco1af2os-4a1z8tbjhf3diyxo7kghf26v4 192.168.39.185:2377
在node節點上執行此條命令便可將node節點加入到集羣中。
經過docker info命令查詢狀態信息:
[root@centos7 ~]# docker info Containers: 7 Running: 5 Paused: 0 Stopped: 2 Images: 3 Server Version: 18.06.0-ce Storage Driver: devicemapper Pool Name: docker-8:2-107044267-pool Pool Blocksize: 65.54kB Base Device Size: 10.74GB Backing Filesystem: xfs Udev Sync Supported: true Data file: /dev/loop0 Metadata file: /dev/loop1 Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 488.7MB Data Space Total: 107.4GB Data Space Available: 8.372GB Metadata Space Used: 1.176MB Metadata Space Total: 2.147GB Metadata Space Available: 2.146GB Thin Pool Minimum Free Space: 10.74GB Deferred Removal Enabled: true Deferred Deletion Enabled: true Deferred Deleted Device Count: 0 Library Version: 1.02.140-RHEL7 (2017-05-03) Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog Swarm: active NodeID: mhfkjl27xt3d459ioz23ve2om Is Manager: true ClusterID: cnrh9656rqjmd0bvpyhz0zhlu Managers: 1 Nodes: 5 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 10 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Force Rotate: 0 Autolock Managers: false Root Rotation In Progress: false Node Address: 192.168.39.185 Manager Addresses: 192.168.39.185:2377 Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: d64c661f1d51c48782c9cec8fda7604785f93587 runc version: 69663f0bd4b60df09991c08812a60108003fa340 init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-693.17.1.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 975.3MiB Name: centos7 ID: CYJZ:PO67:6LBM:BCPB:DZLG:J4ZS:TKYS:UTD7:7P5Y:6MI2:SM5U:RSFD Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
加入Swarm集羣
在全部要加入集羣的節點上面執行 docker swarm join命令,表示要把這臺機器加入這 個集羣當中。經過Salt命令將4個Slave節點加入集羣中:
[root@centos7 ~]# salt "*" cmd.run "docker swarm join --token SWMTKN-1-503tbj031pm5udwskezixpeu666bce2valkvt9wq0uco1af2os-4a1z8tbjhf3diyxo7kghf26v4 192.168.39.185:2377"
執行結果返回「This node joined a swarm as a worker.」,說明已經將Slave節點加入集羣當中。
注意:若是不能正常加入集羣,請檢查防火牆。
查看集羣
經過docker node命令,在master端能夠查看當前集羣狀態:
[root@centos7 ~]# docker node ls
以上信息中AVAILABILITY表示Swarm Scheduler是否能夠向集羣中的某個node指派Task,對應的有三種狀態:
Active:集羣中該Node能夠被指派Task
Pause:集羣中該Node不能夠被指派新的Task,可是其餘已經存在的Task保持運行
Drain:集羣中該Node不能夠被指派新的Task,Swarm scheduler停掉已經存在的Task,並將它們調度到可用的Node上
查看某個Node狀態詳細信息:
docker node inspect [NodeID]
管理Swarm node狀態
Node的AVAILABILITY有三種狀態,所以,能夠將AVAILABILITY值經過docker node update修改不一樣的狀態,下面常見的變動操做有:
設置Manager node只具有管理功能
對服務進行中止維護,能夠修改AVAILABILITY值爲Drain狀態
暫停一個Node,而後該node再也不接收新的Task
恢復一個不可用或者暫停的Node
例如:
1)將Manager Node的AVAILABILITY值修改成Drain狀態,使其只具有管理功能,執行以下:
[root@centos7 ~]# docker node update --availability drain centos7
這樣,ManagerNode不能被指派Task,也就是不能部署實際的Docker容器來運行服務,而只做爲管理Node角色。
2)Node提權/降權
Worker node能夠變爲Manager Node,執行以下:
[root@centos7 ~]# docker node demote centos7-1
3) 退出Swarm集羣
若是node想要退出Swarm,能夠在node節點上執行以下:
# docker swarm node leave
問題:
有時候在執行Swarm集羣相關命令時候,會出現如下報錯信息,如:
[root@centos7 ~]# docker node ls Error response from daemon: rpc error: code = 2 desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
出現這個問題的主要緣由是由於集羣節點中manager節點出現異常致使,能夠強制初始化集羣解決此問題:
docker swarm init --force-new-cluster
部署服務
咱們部署服務能夠經過docker service 命令去部署和管理Swarm集羣中的服務,或者能夠經過圖形化工具Portainer快速部署swarm集羣下服務。經過Swarm能夠實現服務運行、服務擴容縮容、刪除服務、滾動升級等功能。
新建服務
新建服務過程主要包括,Manager節點執行docker service create命令,node節點從倉庫下載相應鏡像,而且建立相應容器。
在Swarm集羣中建立一個名爲redis的服務,其nginx版本選定1.10.3:
[root@centos7 ~]# docker service create --replicas 4 -p 80:80 --name nginx nginx:1.10.3 njq0hw2ksap3mz2s4qg3bpoks overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: running [==================================================>] 3/4: running [==================================================>] 4/4: running [==================================================>] verify: Service converged
docker service create:建立服務
--replicas 4:指定服務副本數爲4
--name:指定服務名稱爲nginx
查看當前swarm集羣中運行的服務:
查看某個服務的詳情:
[root@centos7 ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS keto9vpc1bgi nginx.1 nginx:1.10.3 centos7 Running Running 8 minutes ago 314oeshow4la nginx.2 nginx:1.10.3 centos7-4 Running Running 8 minutes ago rchz606fd5wx nginx.3 nginx:1.10.3 centos7-3 Running Running 8 minutes ago pzeyazxk3p6a nginx.4 nginx:1.10.3 centos7-1 Running Running 8 minutes ago
查看服務相關日誌:
[root@centos7 ~]# docker service logs nginx nginx.4.pzeyazxk3p6a@centos7-1 | 10.255.0.6 - - [14/Sep/2018:06:39:48 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
擴容服務及縮容服務
Docker Swarm支持服務的擴容和縮容,Swarm經過--mode選項設置服務類型,提供兩種模式:一種是replicated,能夠指定服務的Task的個數(須要建立幾個冗餘副本),這是Swarm默認使用的服務類型;另外一個是golbal,這樣會在Swarm集羣中的每一個Node上建立一個服務。
例如,剛纔建立服務時指定了4個副本nginx服務,能夠擴容到5個副本,以下:
[root@centos7 ~]# docker service scale nginx=5 nginx scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged
經過docker service ps查看擴容後的狀態:
服務縮容只須要將副本數小於當前副本數便可,大雨指定縮容副本會被刪除。以下:
# docker service scale nginx=3
刪除服務
刪除服務,只須要在Manager節點上執行以下便可:
[root@centos7 ~]# docker service rm nginx
滾動升級
參考官網對redis服務升級示例:
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
上面經過指定--update-delay標誌配置服務任務或任務集更新之間的時間延遲。 須要進行更新的服務,每次成功部署一個,延遲10分鐘,而後更新下一個服務。若是某個服務更新失敗,則swarm的調度器就會暫停本次服務的部署更新。
詳細升級方法能夠參考官方示例:https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/
參考資料:
https://docs.docker.com/swarm/overview/
https://www.kancloud.cn/docker_practice/docker_practice