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

Swarm 簡介

  

  Docker Swarm 是 Docker 官方推出的容器集群管理工具,基於 Go 語言實現。程式碼開源在://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 的文章。

  

🤗 您的點贊和轉發是對我最大的支援。

📢 掃碼關注 哈嘍沃德先生「文檔 + 影片」每篇文章都配有專門影片講解,學習更輕鬆噢 ~