運維之我的docker-swarm節點運行和服務運行詳解

         本次介紹swarm節點運行服務運行的原理。


         因爲swarm使用的是raft集羣管理方式所以集羣內節點分爲三種角色:頭目(leader),被選舉者(Reachable),小弟(worker)。頭目和被選舉者其實都是manager,根據下圖可以看出swarn集羣中至少得有2個可用的被選舉節點才能選舉主節點出來,否則集羣將無法執行操作

         這裏有個raft的幻燈片講解【傳送門

         在docker裏面有兩個手動操作promotedemote分別代表提權和降權。promote用戶將變爲備用主,demote將變爲worker。不能直接變爲leader

    集羣中每個節點又可分爲倆個狀態:active(活躍),Drain(排空)。

下圖是一個集羣簡單示意圖。

wKioL1i6hqywI0gOAAH1wrs7oio684.png


  • 管理節點和worker節點的比例

    看完上圖大家可能更關心你的manager節點可以損壞幾個而不影響你,簡單的說你至少有兩個manager節點纔可以進行選舉


   爲了利用羣模式的容錯功能,Docker建議您根據組織的高可用性要求實現奇數個節點。當有多個manager時,您可以manager節點的故障中恢復,而無需停機。

  • 三個manager容忍一個manager的最大損失。

  • 五manager容忍兩個manager節點的最大同時丟失。

  • N個manager集羣將容忍最多(N-1)/ 2個manager的丟失。

  • Docker建議一個羣集最多有七個manager節點。

重要說明:添加更多manager並不意味着增加可伸縮性或更高的性能。一般來說,情況恰恰相反。

下面是節點數,選舉數,可損壞節點數。

wKiom1i6hx2z-PrDAAAxR262Y5Y308.png


    如果有的確實想要從swarm集羣中刪除,你應該先把這個節點容器排空,然後再把節點從集羣中去掉。

如何刪除一個swarm節點


刪除節點後恢復到集羣

     之前節點在集羣內,如果節點自身主動退出集羣,manager也需要從集羣刪除節點,否則在進入時重複加入集羣報錯,如下

[root@data-node2 ~]#  docker swarm join \

>     --token SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-1oso860e7n5yn3fs9sya17u9m \

>     192.168.198.117:2377

Error response from daemon: Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the "docker info" command to see the current swarm status of your node.

 

[root@salt-node2 ~]# docker node ls
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
0jopsrt8eygko1jlfmbjr4uax    salt-node1  Ready   Active        Reachable
0jz3o2avbbugyoejzs1ed3djz    data-node3  Ready   Active       
2pzv4kzc2p8f7c4wqlfupp9h9    salt-node1  Down    Active        Unreachable
37lpbieigtc2cz6njwqfe0c4b    compute1    Ready   Active       
3lw43iyd2m89rrmodjt2ym4bf    data-node2  Ready   Active        Reachable
g36lvv23ypjd8v7ovlst2n3yt    salt-node3  Ready   Active        Reachable
h14re9viizbs5yj3zunuo9zo8 *  salt-node2  Ready   Active        Leader


 

管理節點重新加入

      下面報錯是因爲之前節點是主動離開集羣的,所以集羣內還有本節點信息,但是本節點已經不再主動加入集羣,所以需要從集羣刪除本管理節點才能重新加入到集羣,因爲manager節點不能刪除,所以需要先降級爲worker才能刪除。

[root@salt-node2 ~]# docker node rm 2pzv4kzc2p8f7c4wqlfupp9h9

Error response from daemon: rpc error: code = 9 desc = node 2pzv4kzc2p8f7c4wqlfupp9h9 is a cluster manager and is a member of the raft cluster. It must be demoted to worker before removal

[root@salt-node2 ~]# docker node ls
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
0jopsrt8eygko1jlfmbjr4uax    salt-node1  Ready   Active        Reachable
0jz3o2avbbugyoejzs1ed3djz    data-node3  Ready   Active       
2pzv4kzc2p8f7c4wqlfupp9h9    salt-node1  Down    Active        Unreachable
37lpbieigtc2cz6njwqfe0c4b    compute1    Ready   Active       
3lw43iyd2m89rrmodjt2ym4bf    data-node2  Ready   Active        Reachable
g36lvv23ypjd8v7ovlst2n3yt    salt-node3  Ready   Active        Reachable
h14re9viizbs5yj3zunuo9zo8 *  salt-node2  Ready   Active        Leader
 
[root@salt-node2 ~]# docker node demote 2pzv4kzc2p8f7c4wqlfupp9h9
Manager 2pzv4kzc2p8f7c4wqlfupp9h9 demoted in the swarm.
[root@salt-node2 ~]# docker node rm 2pzv4kzc2p8f7c4wqlfupp9h9
2pzv4kzc2p8f7c4wqlfupp9h9
[root@salt-node2 ~]# docker node ls
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
0jopsrt8eygko1jlfmbjr4uax    salt-node1  Ready   Active        Reachable
0jz3o2avbbugyoejzs1ed3djz    data-node3  Ready   Active       
37lpbieigtc2cz6njwqfe0c4b    compute1    Ready   Active       
3lw43iyd2m89rrmodjt2ym4bf    data-node2  Ready   Active        Reachable
g36lvv23ypjd8v7ovlst2n3yt    salt-node3  Ready   Active        Reachable
h14re9viizbs5yj3zunuo9zo8 *  salt-node2  Ready   Active        Leader


Swarm創建的服務運行狀態

  • 如果你創建一個service,每個節點開放指定端口提供service的服務,去訪問節點內的容器即使節點當前沒有容器

  • 服務內分發請求到容器的默認方法是順序輪詢

  • Port 7946 TCP/UDP 容器的網絡發現接口

  • Port 4789 UDP 容器的網絡入口.


下圖爲例:


wKiom1jJDeWTNNSpAAGC3eKaoMo045.png


當我們swarm在生產中就得換成下圖的方式,這樣增加系統高可用。



wKioL1jJDebTAoCtAAHAx9lswMc918.png


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