Docker學習—Swarm

chaney1992發表於2020-11-22

前言:

  前一篇《Docker學習—Machine》中對Machine 進行了學習,本篇繼續學習Swarm,那麼Swarm是什麼呢,有什麼用呢?接下來一步步瞭解。

一、什麼是Docker-Swarm?

 Swarm是使用swarmkit專案構建的嵌入在Docker 引擎中的叢集管理和編排功能的工具包,可以直接在docker中使用

 一個叢集由多個Docker主機組成,這些Docker主機以叢集模式執行,並充當管理器(用於管理成員資格和委派)和工作器(執行 叢集服務)。給定的Docker主機可以是管理員,工作人員或同時擔任這兩個角色。建立服務時,請定義其最佳狀態(可用副本數,網路和儲存資源,將服務公開給外界的埠等)。Docker致力於維持所需狀態。例如,如果工作節點不可用,則Docker會在其他節點上排程該節點的任務。一個任務 是執行的容器是一個群服務的一部分,並通過群經理管理,而不是一個獨立的容器。

 與獨立容器相比,群集服務的主要優勢之一是,您可以修改服務的配置,包括它所連線的網路和卷,而無需手動重新啟動服務。Docker將更新配置,使用過期的配置停止服務任務,並建立與所需配置匹配的新任務。

 當Docker以群體模式執行時,您仍然可以在參與群體的任何Docker主機以及群體服務上執行獨立容器。獨立容器和群集服務之間的主要區別在於,只有群集管理節點可以管理群集,而獨立容器可以在任何守護程式上啟動。Docker守護程式可以以管理人員,工作人員或兩者兼有的形式參與。

 正如您可以使用Docker Compose來定義和執行容器一樣,您可以定義和執行Swarm服務堆疊。

 Swarm相關概念:

  • 節點:

 節點是Docker引擎參與swarm的一個例項。也可以將其視為Docker節點。您可以在單個物理計算機或雲伺服器上執行一個或多個節點,但生產叢集部署通常包括分佈在多個物理和雲端計算機上的Docker節點。

 通常分為管理節點和工作節點

 管理節點:要將應用程式部署到swarm,需要向管理節點提交一個服務定義。管理節點將稱為任務的工作單元分派給工作節點。執行所需的編排和群集管理功能,以保持群的所需狀態。管理節點選擇一個領導者來執行編排任務。

 工作節點:接收並執行從管理節點排程的任務。預設情況下,管理節點也將服務作為工作節點執行,但您可以將它們配置為以獨佔方式執行管理任務並僅作為管理節點。代理在每個工作節點上執行,並報告分配給它的任務。worker節點將其分配任務的當前狀態通知給manager節點,以便manager可以保持每個worker的所需狀態。

  • 服務和任務

   服務:是要在管理或工作節點上執行的任務的定義。它是swarm系統的中心結構,是使用者與swarm互動的主要根源。建立時,指定要在執行的容器中使用的容器映像和要執行的命令;在複製服務模型中,swarm manager根據您在所需狀態下設定的規模在節點之間分配特定數量的任務,對於全域性服務,swarm在叢集中的每個可用節點上為服務執行一個任務。

   任務:是攜帶一個Docker容器和在容器內執行的命令。它是swarm的原子排程單元。管理節點根據服務規模中設定的副本數將任務分配給工作節點。任務一旦分配給節點,就不能移動到另一個節點。它只能在指定的節點上執行或失敗。

  • 負載均衡:

   swarm manager使用入口負載平衡來公開你希望向swarm提供的外部服務。swarm manager可以自動為服務分配發布埠,也可以為服務配置釋出埠。您可以指定任何未使用的埠。如果不指定埠,swarm manager會為服務分配30000-32767範圍內的埠。

   外部元件(如雲負載平衡器)可以訪問群集中任何節點的釋出埠上的服務,無論該節點當前是否正在執行該服務的任務。swarm路由中的所有節點都進入到正在執行的任務例項的連線。

   Swarm模式有一個內部DNS元件,它自動為Swarm中的每個服務分配一個DNS條目。swarm manager使用內部負載平衡根據服務的DNS名稱在群集中的服務之間分配請求。

二、Swarm的功能亮點

Docker Engine整合叢集管理:使用Docker Engine CLI建立一個Docker引擎群,您可以在其中部署應用程式服務。你不需要額外的編排軟體來建立或管理蜂群。
分散式設計:Docker引擎在執行時處理任何專門化,而不是在部署時處理節點角色之間的差異。您可以使用Docker引擎部署兩種型別的節點,管理器和工作者。這意味著您可以從一個磁碟映像構建一個完整的群。
宣告性服務模型:Docker引擎使用宣告性方法來定義應用程式堆疊中各種服務的所需狀態。例如,您可以描述一個由web前端服務、訊息佇列服務和資料庫後端組成的應用程式。
擴容縮放:對於每個服務,您可以宣告要執行的任務數。當您放大或縮小時,swarm manager會通過新增或刪除任務來自動進行調整,以保持所需的狀態。
理想狀態協調:swarm manager節點不斷監視群集狀態,並協調實際狀態與所表達的期望狀態之間的任何差異。
多主機網路:可以為您的服務指定overlay網路。swarm管理器在初始化或更新應用程式時自動為覆蓋網路上的容器分配地址。
服務發現:Swarm管理器節點為群中的每個服務分配一個唯一的DNS名稱和執行容器的負載平衡。您可以通過swarm中嵌入的DNS伺服器查詢swarm中執行的每個容器。
負載平衡:可以將服務的埠公開給外部負載平衡器。在內部,swarm允許您指定如何在節點之間分發服務容器。
預設安全:Swarm中的每個節點都強制TLS相互身份驗證和加密,以確保自身和所有其他節點之間的通訊安全。您可以選擇使用自簽名根證書或來自自定義根CA的證書。
滾動更新:升級時,可以逐步更新服務到節點。swarm manager允許您控制服務部署到不同節點集之間的延遲。如果出現任何問題,您可以回滾到該服務的以前版本。

三、Swarm如何工作?

 服務、任務和容器之間關係如下:

  

  下圖顯示了群集模式如何接受服務建立請求以及如何將任務排程到工作者節點

 

四、叢集示例:

 1、使用Machine建立叢集中docker環境,以下環境  

節點角色 名稱 IP地址
manager manager 192.168.0.110
worker worker1 192.168.0.107
worker worker2 192.168.0.108


  進入GitBash命令建立:

docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch manager
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker1
docker-machine create -d hyperv --hyperv-virtual-switch docker_Virtual_Switch worker2

  

 2、開啟叢集模式

#進入manager節點:
docker-machine ssh manager #初始化swarm
docker swarm init
--advertise-addr 192.168.0.110
#用於新增工作節點命令
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377
 

  

 3、加入工作節點到叢集模式

#進入worker1節點:
docker-machine ssh worker1
#工作節點加入叢集
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377 

#進入worker2節點:
docker-machine ssh worker2
#工作節點加入叢集
docker swarm join --token SWMTKN-1-2ixlcvkjnv4tzh3i8qq14v0bfit7876pr0qputxmeu6w14m0p6-586ta6x7nf0y0ewh513qt8dwu 192.168.0.110:2377 

  

 4、部署服務到叢集中  

docker service create --replicas 1 --name helloworld alpine ping docker.com
  • docker service create命令建立服務。
  • --name標誌為服務命名helloworld
  • --replicas標誌指定1個執行例項的所需狀態。
  • 引數alpine ping docker.com將服務定義為執行命令的Alpine Linux容器ping docker.com

  

  5、服務管理

#擴充套件服務語法
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
#示例:
docker service scale helloworld=5

#檢視服務語法
docker service ps <SERVICE-ID>
#示例
docker service ps helloworld

#刪除服務語法、
docker service rm <SERVICE-ID>
#示例
docker service rm helloworld

其他常用命令使用docker service -h 檢視

執行結果如下

 

五、節點操作:

  • 顯示節點列表:docker node ls
  • 修改節點:docker node update 引數
  • 退出叢集:doker swarm leave
  • 節點升級:docker node promote 節點名
  • 節點降級:docker node demote 節點名

後續:

 通過Swarm基本瞭解後,接下來使用實際案例部署到swarm驗證,加深理解及操作。

參考:

   https://docs.docker.com/engine/swarm/

相關文章