Docker三劍客之Swarm

What is Docker Swarm?

    Docker Swarm是一套管理docker集羣的工具。它將一羣docker宿主機轉變爲單個的虛擬主機。由於Swarm提供標準的API接口,因此,任何能夠和docker守護進程通信的工具,都可以利用swarm去擴展多個主機,支持的docker工具如,Dokku、Docker compose、Docker machine、jenkis、docker-py、Krane、Deis等等。Docker本身都可以很容易與Swarm進行集成。    

image.png

在使用Swarm管理docker集羣時,會有一個swarm manager以及若干的swarm node,swarm manager上運行swarm daemon,用戶只需要跟swarm manager通信,然後swarm manager再根據discovery service的信息選擇一個swarm node來運行container。

值得注意的是 swarm daemon 只是一個任務調度器(scheduler)和路由器(router),它本身不運行容器,它只接受Docker client發送過來的請求,調度合適的swarm node來運行container。這意味着,即使 swarm daemon 由於某些原因掛掉了,已經運行起來的容器也不會有任何影響。

有以下兩點需要注意:

  • 集羣中的每臺節點上面的Docker的版本都不能小於1.4

  • 爲了讓swarm manager能夠跟每臺swarm node進行通信,集羣中的每臺節點的 Docker daemon都必須監聽同一個網絡接口。

基本概念

節點

運行 Docker 的主機可以主動初始化一個 Swarm 集羣或者加入一個已存在的 Swarm 集羣,這樣這個運行 Docker 的主機就成爲一個 Swarm 集羣的節點 (node) 。

節點分爲管理 (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集羣

初始化集羣

[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參數指定相應網卡。此時通過netstat命令可以查看到端口2377監聽集羣節點請求。

通過docker info命令查詢狀態信息:

image.png

加入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

問題:

有時候在執行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集羣下服務。



未完待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章