1. 程式人生 > 實用技巧 >Docker Swarm 叢集管理利器核心概念掃盲

Docker Swarm 叢集管理利器核心概念掃盲

Swarm 簡介

  

  Docker Swarm 是 Docker 官方推出的容器叢集管理工具,基於 Go 語言實現。程式碼開源在:https://github.com/docker/swarm 使用它可以將多個 Docker 主機封裝為單個大型的虛擬 Docker 主機,快速打造一套容器雲平臺。

  Docker Swarm 是生產環境中執行 Docker 應用程式最簡單的方法。作為容器叢集管理器,Swarm 最大的優勢之一就是 100% 支援標準的 Docker API。各種基於標準 API 的工具比如 Compose、docker-py、各種管理軟體,甚至 Docker 本身等都可以很容易的與 Swarm 進行整合。大大方便了使用者將原先基於單節點的系統移植到 Swarm 上,同時 Swarm 內建了對 Docker 網路外掛的支援,使用者可以很容易地部署跨主機的容器叢集服務。

  Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排工具,但不同的是,Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。

  

Swarm 核心概念

  

Swarm

  Docker Engine 1.12 引入了 Swarm 模式,一個 Swarm 由多個 Docker 主機組成,它們以 Swarm 叢集模式執行。Swarm 叢集由 Manager 節點(管理者角色,管理成員和委託任務)和 Worker 節點

(工作者角色,執行 Swarm 服務)組成。這些 Docker 主機有些是 Manager 節點,有些是 Worker 節點,或者同時扮演這兩種角色。

  Swarm 建立服務時,需要指定要使用的映象、在執行的容器中執行的命令、定義其副本的數量、可用的網路和資料卷、將服務公開給外部的埠等等。與獨立容器相比,群集服務的主要優勢之一是,你可以修改服務的配置,包括它所連線的網路和資料卷等,而不需要手動重啟服務。還有就是,如果一個 Worker Node 不可用了,Docker 會排程不可用 Node 的 Task 任務到其他 Nodes 上。

  

Nodes

  

  Swarm 叢集由 Manager 節點

(管理者角色,管理成員和委託任務)和 Worker 節點(工作者角色,執行 Swarm 服務)組成。一個節點就是 Swarm 叢集中的一個例項,也就是一個 Docker 主機。你可以執行一個或多個節點在單臺物理機或雲伺服器上,但是生產環境上,典型的部署方式是:Docker 節點交叉分散式部署在多臺物理機或雲主機上。節點名稱預設為機器的 hostname。

  • Manager:負責整個叢集的管理工作包括叢集配置、服務管理、容器編排等所有跟叢集有關的工作,它會選舉出一個 leader 來指揮編排任務;
  • Worker:工作節點接收和執行從管理節點分派的任務(Tasks)執行在相應的服務(Services)上。

  

Services and Tasks

  

  服務(Service)是一個抽象的概念,是對要在管理節點或工作節點上執行的任務的定義。它是集群系統的中心結構,是使用者與叢集互動的主要根源。Swarm 建立服務時,可以為服務定義以下資訊:

  • 服務名稱;
  • 使用哪個映象來建立容器;
  • 要執行多少個副本;
  • 服務的容器要連線到哪個網路上;
  • 要對映哪些埠。

  任務(Task)包括一個 Docker 容器在容器中執行的命令。任務是一個叢集的最小單元,任務與容器是一對一的關係。管理節點根據服務規模中設定的副本數量將任務分配給工作節點。一旦任務被分配到一個節點,便無法移動到另一個節點。它只能在分配的節點上執行或失敗。

  

Replicated and global services

  

  Swarm 不只是提供了優秀的高可用性,同時也提供了節點的彈性擴容和縮容的功能。可以通過以下兩種型別的 Services 部署實現:

  • Replicated Services:當服務需要動態擴縮容時,只需通過 scale 引數或者 --replicas n 引數指定執行相同任務的數量,即可複製出新的副本,將一系列複製任務分發至各節點當中,這種操作便稱之為副本服務(Replicate)。
  • Global Services:我們也可以通過 --mode global 引數將服務分發至全部節點之上,這種操作我們稱之為全域性服務(Global)。在每個節點上執行一個相同的任務,不需要預先指定任務的數量,每增加一個節點到 Swarm 中,協調器就會建立一個任務,然後排程器把任務分配給新節點。

  下圖用黃色表示擁有三個副本服務 Replicated Service,用灰色表示擁有一個全域性服務 Global Service。

  

Swarm 工作流程

  

Swarm Manager:

  1. API:接受命令並建立 service 物件(建立物件)
  2. orchestrator:為 service 物件建立的 task 進行編排工作(服務編排)
  3. allocater:為各個 task 分配 IP 地址(分配 IP)
  4. dispatcher:將 task 分發到 nodes(分發任務)
  5. scheduler:安排一個 worker 節點執行 task(執行任務)

  

Worker Node:

  1. worker:連線到排程器,檢查分配的 task(檢查任務)
  2. executor:執行分配給 worker 節點的 task(執行任務)

  

Overlay 網路

  

  關於 Docker 的網路我們在《Docker 網路模式詳解及容器間網路通訊》中已經給大家詳細講解過。不過,Docker Swarm 叢集模式下卻預設使用的是 Overlay 網路(覆蓋網路),這裡簡單介紹一下什麼是 Overlay 網路。

  Overlay 網路其實並不是一門新技術,它是指構建在另一個網路上的計算機網路,這是一種網路虛擬化技術的形式,近年來雲端計算虛擬化技術的演進促進了網路虛擬化技術的應用。所以 Overlay 網路就是建立在另一個計算機網路之上的虛擬網路,它是不能獨立出現的,Overlay 底層依賴的網路就是 Underlay 網路。

  Underlay 網路是專門用來承載使用者 IP 流量的基礎架構層,它與 Overlay 網路之間的關係有點類似物理機和虛擬機器。Underlay 網路和物理機都是真正存在的實體,它們分別對應著真實存在的網路裝置和計算裝置,而 Overlay 網路和虛擬機器都是依託在下層實體的基礎之上,使用軟體虛擬出來的層級。

  在 Docker 版本 1.12 以後 Swarm 模式原生已支援覆蓋網路(Overlay Network),只要是這個覆蓋網路內的容器,不管在不在同一個宿主機上都能相互通訊,即跨主機通訊。不同覆蓋網路內的容器之間是相互隔離的(相互 ping 不通)。

  Overlay 網路是目前主流的容器跨節點資料傳輸和路由方案。當然,容器在跨主機進行通訊的時候,除了可以使用 overlay 網路模式進行通訊之外,還可以使用 host 網路模式,直接使用物理機的 IP 地址就可以進行通訊。

  

參考資料

  

  

  最後我要說的是,如果只是從使用的角度出發,Docker Swarm 很快就可以上手。所謂知其然知其所以然,概念性的東西該懂還得懂,一些細節的部分比如網路我們到時候再另開文章細說。

  下文我們就帶大家從零開始,搭建 Docker Swarm 叢集環境,並通過 Swarm 實現服務的彈性部署。

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 檢視更多關於 Docker 的文章。