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

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

![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/270ea0fa207949f8a841d7fe0b5af4fb~tplv-k3u1fbpfcp-zoom-1.image) ## 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 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/95dd3cc12ce04a52afb1a0b3a3a2cf95~tplv-k3u1fbpfcp-zoom-1.image)   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)上。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5c0487cef51d49199afcddab69bf9474~tplv-k3u1fbpfcp-zoom-1.image)    ### Services and Tasks      **服務**(Service)是一個抽象的概念,是對要在管理節點或工作節點上執行的**任務的定義**。它是集群系統的中心結構,是使用者與叢集互動的主要根源。Swarm 建立服務時,可以為服務定義以下資訊: - 服務名稱; - 使用哪個映象來建立容器; - 要執行多少個副本; - 服務的容器要連線到哪個網路上; - 要對映哪些埠。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/58f3a6cf250a4eb8bb4d502fcf852632~tplv-k3u1fbpfcp-zoom-1.image)   **任務**(Task)包括**一個 Docker 容器**和**在容器中執行的命令**。任務是一個叢集的最小單元,任務與容器是一對一的關係。管理節點根據服務規模中設定的副本數量將任務分配給工作節點。一旦任務被分配到一個節點,便無法移動到另一個節點。它只能在分配的節點上執行或失敗。    ### Replicated and global services      Swarm 不只是提供了優秀的高可用性,同時也提供了節點的**彈性擴容和縮容**的功能。可以通過以下兩種型別的 Services 部署實現: - **Replicated Services**:當服務需要動態擴縮容時,只需通過 `scale` 引數或者 `--replicas n` 引數指定執行相同任務的數量,即可複製出新的副本,將一系列複製任務分發至各節點當中,這種操作便稱之為**副本服務**(Replicate)。 - **Global Services**:我們也可以通過 `--mode global` 引數將服務分發至全部節點之上,這種操作我們稱之為**全域性服務**(Global)。在每個節點上執行一個相同的任務,不需要預先指定任務的數量,每增加一個節點到 Swarm 中,協調器就會建立一個任務,然後排程器把任務分配給新節點。   下圖用黃色表示擁有三個副本服務 Replicated Service,用灰色表示擁有一個全域性服務 Global Service。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4992640dab9342c599dc5c07deaea80b~tplv-k3u1fbpfcp-zoom-1.image)    ## Swarm 工作流程    ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2473832227214ca4870468f4ba9ac2dc~tplv-k3u1fbpfcp-zoom-1.image) 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 網路和虛擬機器都是依託在下層實體的基礎之上,使用軟體虛擬出來的層級。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ac2284334f8943869f643980786fcc01~tplv-k3u1fbpfcp-zoom-1.image)   在 Docker 版本 1.12 以後 **Swarm 模式原生已支援覆蓋網路**(Overlay Network),只要是這個覆蓋網路內的容器,不管在不在同一個宿主機上都能相互通訊,即跨主機通訊。不同覆蓋網路內的容器之間是相互隔離的(相互 ping 不通)。   Overlay 網路是目前主流的容器跨節點資料傳輸和路由方案。當然,容器在跨主機進行通訊的時候,除了可以使用 overlay 網路模式進行通訊之外,還可以使用 host 網路模式,直接使用物理機的 IP 地址就可以進行通訊。    ## 參考資料    - https://docs.docker.com/engine/swarm/ - https://docs.docker.com/engine/swarm/key-concepts/ - https://docs.docker.com/engine/swarm/swarm-tutorial/ - https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ - https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/      最後我要說的是,如果只是從使用的角度出發,Docker Swarm 很快就可以上手。所謂知其然知其所以然,概念性的東西該懂還得懂,一些細節的部分比如網路我們到時候再另開文章細說。   下文我們就帶大家從零開始,搭建 Docker Swarm 叢集環境,並通過 Swarm 實現服務的彈性部署。 ![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7515be6599014614bd5c96b3114fa771~tplv-k3u1fbpfcp-zoom-1.image) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `Docker` 的文章。