Docker三劍客之Swarm

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

image.png

在使用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) 下發至工做節點執行。管理節點默認也做爲工做節點。你也能夠經過配置讓服務只運行在管理節點。

如下展現了集羣中管理節點與工做節點的關係。

image.png

服務和任務

任務 (Task)是 Swarm 中的最小的調度單位,目前來講就是一個單一的容器。

服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

  • replicated services 按照必定規則在各個工做節點上運行指定個數的任務。

  • global services 每一個工做節點上運行一個任務

兩種模式經過 docker service create 的 --mode 參數指定。

來自 Docker 官網的這張圖片形象的展現了容器、任務、服務的關係。

image.png

總體環境

image.png

關於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

image.png

以上信息中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集羣中運行的服務:image.png

查看某個服務的詳情:

[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查看擴容後的狀態:image.png

服務縮容只須要將副本數小於當前副本數便可,大雨指定縮容副本會被刪除。以下:

# 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

相關文章
相關標籤/搜索