Docker學習—Swarm

前言:

  前一篇《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驗證,加深理解及操作。

參考:

   //docs.docker.com/engine/swarm/

Tags: