在現今的雲端原生環境中,容器技術已成為不可或缺的一部分。為了有效管理和協調大量容器的佈署、執行和擴充套件,容器協調技術應運而生。本文將探討兩種主流的容器協調方案:以 Apache Mesos 為底的 Marathon 以及 Docker 原生的 Docker Swarm。Mesos 作為一個分散式系統核心,負責管理叢集資源,而 Marathon 則作為其框架,專注於長期執行的服務佈署。它們共同提供了一個穩健且可擴充套件的平台,適用於大規模應用程式佈署。另一方面,Docker Swarm 則提供了一個更輕量級且易於使用的解決方案,尤其適用於 Docker 技術堆疊的使用者。它簡化了叢集的建立和管理,並提供了一致的使用者經驗。透過比較兩者的架構和特性,開發者能更清晰地瞭解其優缺點,並根據實際需求選擇合適的方案。理解資源分配、任務排程、服務管理等核心概念,對於構建高效且可靠的容器化應用至關重要。
容器協調:Apache Mesos 與 Marathon
在現代資料中心或雲端環境中,容器協調工具扮演著至關重要的角色。本篇文章將探討 Apache Mesos 與其著名的容器協調框架 Marathon,解釋其架構、運作原理及實際應用。
Apache Mesos 的架構
Apache Mesos 是一個開源的容器協調框架,專為大規模生產環境設計。Mesos 類別似於作業系統核心,負責管理叢集中的資源。其架構根據主從模式,主要由以下幾個元件構成:
- Mesos Master:負責管理叢集中的所有代理節點(agents)並分配資源給各個框架(frameworks)。
- Mesos Agents:即工作節點,負責執行實際的任務。
- Frameworks:消費叢集資源並執行任務的應用程式,例如 Marathon、Hadoop 和 Chronos。
Mesos Master 的角色
Mesos Master 是整個叢集的核心,負責管理叢集中的所有資源並分配給各個框架。它的主要職責包括:
- 管理代理節點:監控並管理所有代理節點上的代理程式(agent daemons)。
- 分配資源:將叢集中的 CPU、記憶體、網路和磁碟資源以「offer」的形式提供給註冊的框架。
- 支援多框架運作:允許多個框架在同一個 Mesos 叢集上執行。
資源分配機制
Mesos 透過「offer」機制來分配資源。當代理節點有可用資源時,會通知 Mesos Master,Master 會將這些資源以 offer 的形式提供給註冊的框架。框架可以根據自己的需求接受或拒絕這些 offer。
資源分配策略
Mesos 支援高度可組態的資源分配策略,允許叢集管理員根據組織優先順序或任務關鍵性來定義每個框架的資源配額。
Mesos Agents 的角色
Mesos Agents 即工作節點,負責執行實際的任務。每個工作節點上執行一個代理程式(agent daemon),負責收集並報告統計資料給 Mesos Master。
任務執行流程
- 資源報告:代理節點會將自身可用資源(如 RAM 和 CPU 迴圈數)報告給 Mesos Master。
- 接受任務:Master 將任務分配給具備足夠資源的代理節點。
- 啟動執行器:代理節點接收到任務後,會啟動執行器(executor)來執行任務。
執行器(Executor)
執行器是負責執行實際任務的程式或容器。Mesos 提供簡單的執行器來執行 shell 命令和 Docker 容器,但大多數框架(如 Marathon)會提供自己的執行器來滿足更複雜的需求。
框架(Frameworks)
框架是消費叢集資源並執行任務的應用程式。Mesos 本身僅管理叢集資源,具體的任務排程和執行由框架負責。
框架元件
- 排程器(Scheduler):註冊到 Mesos Master,負責檢查進入的 offer 並決定是否接受。
- 執行器(Executor):在代理節點上執行實際任務。
框架範例:Marathon
Marathon 是一個流行的 Mesos 框架,專門用於佈署和管理長期執行的服務。以下是使用 Marathon 佈署三個例項的目錄微服務的範例:
{
"id": "catalog-svc",
"cpus": 0.5,
"mem": 8.0,
"instances": 3,
"container": {
"type": "DOCKER",
"Docker": {
"image": "helpdesk/catalog-svc",
"network": "BRIDGE",
"portMappings": [
{"containerPort": 80, "hostPort": 80, "protocol": "tcp"}
]
}
}
}
內容解密:
此 JSON 組態檔案描述瞭如何使用 Marathon 在叢集中佈署三個例項的目錄微服務。以下是詳細解釋:
- id: 唯一識別符,這裡命名為
catalog-svc。 - cpus: 每個例項所需的 CPU 資源數量,這裡為 0.5 個 CPU。
- mem: 每個例項所需的記憶體大小,這裡為 8GB。
- instances: 需要佈署的例項數量,這裡為 3 個。
- container: 描述容器型別及其組態。
- type: 指定容器型別為 Docker。
- Docker: Docker 組態詳細資訊。
- image: 指定要使用的 Docker 想像檔案名稱
helpdesk/catalog-svc。 - network: 指定網路模式為橋接模式 (
BRIDGE)。 - portMappings: 組態埠對映。
containerPort: 指定容器內部暴露的埠為 80。hostPort: 指定主機上繫結的埠為 80。protocol: 指定通訊協定為 TCP。
- image: 指定要使用的 Docker 想像檔案名稱
資源分配與排程策略
在 Mesos 中,資源分配與排程策略是高度可組態且靈活的。管理員可以根據組織需求和任務關鍵性來定義不同框架之間的資源配額。這種靈活性使得 Mesos 在處理大規模生產環境中的複雜需求時非常有效。
概述
Apache Mesos 與 Marathon 提供了一種強大且靈活的方式來管理和協調容器化應用程式。透過其高度可組態的資源分配機制和支援多框架運作的能力,Mesos 能夠有效地處理大規模生產環境中的各種需求。透過深入理解其架構和運作原理,我們可以更好地利用這些工具來提升系統效能和可靠性。
容器協調技術探討
容器協調的基本概念
容器協調是現代雲端運算和微服務架構中不可或缺的一部分。它涉及管理和協調多個容器的佈署、執行和擴充套件。在這裡,玄貓將探討兩種主要的容器協調工具:Marathon 和 Docker Swarm。這些工具不僅能夠簡化容器管理,還能提升系統的靈活性和可擴充套件性。
Marathon 與 Mesos 的結合
Marathon 是一個用於管理 Mesos 叢集中的應用程式的協調工具。它能夠自動化容器的佈署和擴充套件,並且與 Mesos 的資源排程系統緊密整合。以下是 Marathon 的一些關鍵特性:
- 資源需求:Marathon 能夠定義每個容器所需的 CPU 和記憶體資源,確保叢集中的資源能夠高效利用。
- 自動還原:當某個容器故障時,Marathon 能夠自動重啟或重新佈署該容器,確保服務的高用性。
- 負載平衡:Marathon 可以根據負載情況自動調整容器的數量,確保系統在高峰期也能保持穩定執行。
提交應用程式到 Marathon
要將應用程式提交到 Marathon,我們需要一個 JSON 檔案來定義應用程式的詳細資訊。以下是一個簡單的 JSON 範例:
{
"id": "catalog-service",
"cmd": "python app.py",
"cpus": 1.0,
"mem": 512.0,
"instances": 3,
"container": {
"type": "DOCKER",
"docker": {
"image": "catalog-service-image",
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 80,
"hostPort": 0,
"protocol": "tcp"
}
]
}
}
}
提交 JSON 檔案
假設這個 JSON 檔案儲存為 application.json,我們可以使用以下命令將其提交到 Marathon:
curl -X POST http://hostip:port/v2/apps \
-d @application.json \
-H "Content-type: application/json"
當我們將這個請求提交給 Marathon 時,Marathon 會等待來自 Mesos 主節點的資源提供(注意:Marathon 不會儲存資源提供歷史)。一旦收到符合要求的資源提供,Marathon 會將請求轉交給 Mesos,讓代理節點中的執行器程式啟動這些容器。例如,如果我們要求啟動三個例項的目錄微服務,而叢集中沒有三個例項時,Marathon 會與 Mesos 嘗試啟動額外的容器以確保叢集中始終有三個例項在執行。
Docker Swarm 的基本概念
Docker Swarm 是 Docker 自家開發的一個本地容器協調引擎。它是一組執行 Docker 容器且啟用了 Swarm 模式的機器群組。Swarm 有效地透過指示叢集節點執行容器來管理叢集。
主要概念
- 節點(Nodes):節點是參與 Swarm 叢集的一台 Docker 引擎。叢集包含工作節點和 Swarm 管理者節點。管理者節點是 Swarm 叢集的大腦,負責管理叢集並指示工作節點執行容器。
- 服務(Services):服務是對需要在叢集節點上執行的內容進行定義。服務定義包括要執行的映像、任何需要在容器內執行的命令以及需要執行的副本或容器例項數量。
- 任務(Tasks):任務是 Swarm 中排程的基本單位。它包含要在容器中執行的 Docker 構成元件和命令。當 Swarm 機制接收到啟動服務的請求時,服務只需要指出要啟動哪個容器以及需要在叢集中執行多少例項。管理者節點然後將任務(即要啟動的容器及其命令)分配給工作節點並讓工作節點啟動這些容器。此外,它還確保達到所需數量的副本(例項)在叢集中啟動。
Docker Swarm 叢集設定
設定一個簡單的 Swarm 叢集並不複雜。以下是如何建立一個由一個管理者和一個工作節點組成的 Swarm 叢集。
初始化 Swarm 叢集
在要作為 Swarm 管理者的節點上執行以下命令以初始化 Swarm 叢集:
docker swarm init --listen-addr 10.88.237.217:2377
這裡 10.88.237.217 是執行該命令的機器介面 IP 地址,2377 是預設埠號用於監聽 Swarm 機制流量。
新增工作節點
初始化完成後,Swarm 叢集中目前沒有工作節點。現在列出叢集中的所有節點以快速檢視當前狀態:
docker node ls
要將一台新機器新增為工作節點,只需在該機上執行 docker swarm join 命令並指定管理者 IP 和埠即可:
docker swarm join --token <tokenID> 10.88.237.217:2377
透過這些步驟,我們可以成功設定並管理一個簡單而高效的 Docker Swarm 叢集。
Docker Swarm 叢集實作範例
以下是一些簡單且實用的範例,幫助你更好地理解如何使用 Docker Swarm 建立和管理叢集。
安裝與組態 Docker
首先,確保你已經安裝了最新版本(至少是17.06版本)的 Docker 構成元件:
sudo apt-get update
sudo apt-get install docker-ce=17.06.0~ce-0~ubuntu -y
安裝完成後,初始化 Docker:docker init
初始化 Swarm 模式
接下來初始化 Docker 的 Swarm 模式:
docker swarm init --advertise-addr <MANAGER-IP>
加入工作節點
在你希望成為工作節點的機上執行以下命令:
docker swarm join --token <SWMTKN-TOKEN> <MANAGER-IP>:<PORT>
完成上述步驟後,你就成功建立了一個包含管理者和工作節點的簡單 Swarm 叢集。
組態服務與任務
接下來我們可以開始組態服務和任務。假設我們有一個名為 web-app 的應用程式映像:
docker service create --name web-app --replicas 3 -p 80:80 web-app-image
這條命令建立了一項名為 web-app 的服務並指定了三個副本(即三個例項)。埠 80 被公開以便外部存取。
檢視服務狀態
可以透過以下命令來檢視服務狀態:
docker service ls
這樣可以確認服務已經成功建立並且正常執行。
錯誤教訓與改進建議
在實際操作中經常會遇到一些錯誤或問題:
- 網路問題:確保所有機上都能夠正常通訊。
- 組態錯誤:檢查所有組態檔案中的 IP 地址、埠號等是否正確。
- 安全性:考慮使用更安全和複雜的 token 和密碼來保護你的叢集。
透過以上步驟和建議可以幫助你更好地理解及應用 Docker Swarm 在日常開發及生產環境中的實踐經驗。
