天天看點

Docker Swarm搭建多伺服器下Docker叢集

  對于有多台伺服器來講,如果每一台都去手動操控,那将會是一件非常浪費時間的事情,畢竟時間這東西,于我們而言,十分寶貴,或許在開始搭建環境的時候耗費點時間,感覺是正常的,我也如此,花費大堆時間在采坑和填坑的路上,但是當你踩完後,還通過手動管理的方式去維護,那便是折磨,是以對于多台伺服器下的容器編排管理,借助工具将會節省着大把時間,現如今有名的容器編排工具,K8s、Docker Swarm,甚至功能更強大的Rancher,本次我将使用且是我唯一使用過的Docker Swarm工具搭建Docker叢集并部署服務。

  Docker Swarm官方文檔位址:https://docs.docker.com/engine/swarm/

  在之前的文章中,對于一台新的伺服器加入到伺服器叢集中,通過Docker Machine去管理,配置好Docker Enginee環境,簡單也友善,同時在配置時,将本地的私鑰發送給了新的伺服器,也就配置好了關聯關系,如有需要可以檢視該文章:https://www.cnblogs.com/CKExp/p/9552272.html

  

Docker Swarm搭建多伺服器下Docker叢集

  加入進來後對于整個伺服器叢集來講,可預見的Swarm方式是這樣的,也是最為簡便的方式管理,Manager作為容器叢集發起者,也是管理者,一般來講,我會盡可能少的在上面部署服務,通過一些方式過濾掉服務在上面的部署,畢竟它的職責更多的側重于管理整個容器叢集,但是對于一些開支小的且比較穩定的服務,也是可以i直接部署在Manager節點中的,這是一種建議。

  這是我目前的伺服器下的容器叢集,存在一個Leader也就是Manager,也可以設定多個,但是現有場景下,完全滿足我的需求了。

Docker Swarm搭建多伺服器下Docker叢集

  我們利用Docker Swarm中的Docker CLI去建立叢集、管理叢集、動态擴容服務。而對于Swarm的版本,建議是Docker版本要高于1.13,在1.13之上,将Swarm功能內建到了Docker中,而對于1.13之下,需要單獨設定Swarm模式,在此建議,使用1.13之上的版本。

  在Swarm中有幾個名字概念:

  Node:節點,分為Manager Node和Worker Node,在上圖中有一個Manager節點和三個Worker節點,這個概念很好了解。

  Service:服務,對于Swarm而言,部署服務是它對外的職責,對于整個叢集來講,都是通過部署服務的形式,并且通過擴容、縮放來動态的決定服務數量。

  Task:服務的具體承載,在于Manager節點将服務分發到具體的Worker節點上,屬于下達具體任務概念。相較于Service屬于微觀概念。

   對于Swarm模式下,需要開啟幾個相關的端口,而在系統中,這幾個端口是預設打開的:

  TCP Port 2377:用于叢集間通信,

  TCP 和UDP Port 7946:用于節點間通信,

  UDP Port 4789:用于Overlay網絡方式下通信,這個是在叢集模式下的網絡通信方式,單機下采用的是Bridge方式。

   在需要設定為Manager的節點上輸入如下指令,開始容器叢集搭建,IP位址寫現在服務對外IP。

  可以獲得如下資訊,叢集建立完畢,複制該指令,在其他子節點上執行完畢,子節點便是加入了該容器叢集(可通過docker-machine ssh xxx的方式快速進入到目的節點中執行)。

Docker Swarm搭建多伺服器下Docker叢集

  對所有節點加入完畢,通過docker node ls指令檢視節點資訊,加入的節點和本身節點将會顯示出來。

 如果有新的伺服器加入了,并且已經安裝好了docker  enginee需要加入到節點中且忘記了這一條token的值,可以通過在manager上執行該指令再次獲得這個值

Docker Swarm搭建多伺服器下Docker叢集

  至此,整個容器叢集就搭建完畢,Manager節點和Worker節點都接入進來了。

   進入到Manager節點,開始部署一個服務到容器叢集中,通過如下指令建立一個服務:

  指令解讀:

  1、docker service create:用于建立服務;

  2、--replicas 用于确定需要多少個節點容器去運作服務;

  3、對于參數alpine ping docker.com 則是指定alpine鏡像,并在容器啟動後執行ping docker.com操作;

  通過docker service ls檢視目前建立的所有服務,可以通過docker service remove 服務名或ID的形式移除服務,這類操作和Docker的操作是差不多的。

   

Docker Swarm搭建多伺服器下Docker叢集

  通過docker service inspect --pretty 服務名或ID方式檢視服務的詳細資訊,

Docker Swarm搭建多伺服器下Docker叢集

  在不帶--pretty參數下,可以檢視到Json格式的詳細資訊,

Docker Swarm搭建多伺服器下Docker叢集

  通過指令docker service ps 服務名或ID檢視服務運作狀态,

Docker Swarm搭建多伺服器下Docker叢集

  1、擴容/伸縮現有服務承載容器數量  

  通過scale指令執行,并再次檢視服務運作資訊:

Docker Swarm搭建多伺服器下Docker叢集

   2、滾動更新使用服務使用鏡像版本,本次重新搭建一個redis服務,用四個執行個體承載服務,并通過滾動更新redis版本。

Docker Swarm搭建多伺服器下Docker叢集

  對于--update-delay 為更新前後切換時間,對于後面跟随的時間類型可以有時分秒如10h10m10s,

  通過--update -parallelism參數可以指定最大的執行個體更新數量,如本次中有四個執行個體,指定為2後将最大允許兩個執行個體更新到新版本中,

  更新執行個體版本規則,當一個執行個體更新完畢并傳回running才繼續更新下一個執行個體,如果有一個執行個體更新失敗,整個更新隊列将會中止,可以通過--update-failure-action參數指定更新失敗後的解決方式,如docker swarm create或是update服務。

  服務建立後執行個體運作結果結果

Docker Swarm搭建多伺服器下Docker叢集

     現在開始更新版本:

Docker Swarm搭建多伺服器下Docker叢集

   指定新版本鏡像及現有服務名稱,開始更新,檢視目前服務運作情況,四個redis均完成更新。

Docker Swarm搭建多伺服器下Docker叢集

   接下來,通過控制worker節點的狀态來控制是否承載某一個服務,通過如下指令,将現有節點下的host1不再承載redis服務,指令如下

   通過參數--availability指定為drain(置空)來設定host1節點不參與服務承載,如下可以看到原有服務已經移交到manager節點下了。

Docker Swarm搭建多伺服器下Docker叢集

  然後啟用該host1節點恢複為活躍模式,但是該節點不會再去承載redis服務,因為服務現在并不需要它去承載。

Docker Swarm搭建多伺服器下Docker叢集

  至此,對于容器叢集的搭建就此完成了。

  對于容器叢集的其他進階用法可以參見官方文檔:https://docs.docker.com/engine/swarm/services/#roll-back-to-the-previous-version-of-a-service

  本文位址:https://www.cnblogs.com/CKExp/p/9651244.html

  歡迎關注微信訂閱号,有新的文章将同步到訂閱号中

Docker Swarm搭建多伺服器下Docker叢集

繼續閱讀