容器化和微服務是當前最熱話題,不久之前,筆者(據說因為現在都不用筆了,“筆者”的稱謂已經不合適了,因為輸入用鍵盤,叫“鍵人”更為合適)參加QCon上海一個微服務監控的Session,場面爆棚,我不得不在擁擠的過道聽完了整個session。隨著要管理的容器越來越多,容器的叢集管理平臺成為了剛需!
Docker Swarm
Swarm是Docker公司在2014年12月初新發布的容器叢集管理工具。它可以把多個主機變成一個虛擬的Docker主機來管理。Swarm使用Go語言開發,並且開源,在github上可以找到它的全部source code。Swarm使用標準的Docker API,給Docker使用者帶來無縫的叢集使用體驗。2016年7月, Swarm已經被整合進入Docker Engine。
功能
Docker Swarm提供API 和CLI來在管理執行Docker的叢集,它的功能和使用本地的Docker並沒有本質的區別。但是可以通過增加Node帶來和好的擴充套件性。理論上,你可以通過增加節點(Node)的方式擁有一個無限大的Docker主機。
Swarm並不提供UI,需要UI的話,可以安裝UCP,不過很不幸,這個UCP是收費的。
架構
Swarm的架構並不複雜,可以說非常簡單。Manager負責容器的排程,Node負責容器的執行,Node執行Docker Daemon和Manager之間通過HTTP來通訊。Docker Client通過Manager上暴露的標準Docker API來使用Docker的功能。
Swarm的叢集協調和業務發現可以支援不同的第三方元件,包括:
- Consul
- Etcd
- ZooKeeper
- Docker Hub
如果對叢集協調的概念不熟悉,可以參考我的另一篇部落格《使用Python進行分散式系統協調 (ZooKeeper,Consul, etcd )》
Swarm的基本容器排程策略有三種:
- spread 容器儘可能分佈在不同的節點上
- binpack 容器儘可能分佈在同一個節點上
- random 容器分佈在隨機的節點上
Swarm叢集的高可用配置很容易,以下圖為例:
manager配置在不同的AWS AZ中,通過領導選舉選出Primary manager。
多個節點分佈在不同的AZ中,同時Consul/etcd/ZooKeeper也需要配成冗餘的。
特點
Docker Swarm的特點是配置和架構都很簡單,使用Docker原生的API,可以很好的融合Docker的生態系統。
Kubernetes
Kubernetes是Google開發的一套開源的容器應用管理系統,用於管理應用的部署,維護和擴張。利用Kubernetes能方便地管理跨機器執行容器化的應用。Kubernetes也是用Go語言開發的,在github上可以找到原始碼。
Kubernetes 源於谷歌公司的內部容器管理系統Borg,經過了多年的生產環境的歷煉,所以功能非常強大。
功能
Kubernetes主要提供一下的功能:
- 使用Docker對應用程式包裝(package)、例項化(instantiate)、執行(run)。
- 以叢集的方式執行、管理跨機器的容器。
- 解決Docker跨機器容器之間的通訊問題。
- Kubernetes的自我修復機制使得容器叢集總是執行在使用者期望的狀態。
- 應用的高可用和靠擴充套件
- 支援應用的線上升級(Rolling Update)
- 支援跨雲平臺(IaaS)的部署
為了支援這些功能,Kubernetes做了做了很多的抽象概念,所以,剛開始使用Kubernetes,需要學習不少的新概念,包括:
- Pod
Pod是Kubernetes的基本操作單元,把相關的一個或多個容器構成一個Pod,通常Pod裡的容器執行相同的應用,或者是相關的應用。Pod包含的容器執行在同一個Minion(Host)上,看作一個統一管理單元,共享相同的volumes和network namespace/IP和Port空間。 - Job
Job是一個生命週期比較短的應用,一般只會在出錯的情況下重啟,可以通過配置Job的併發和執行次數來擴充套件Job - Service
Service是一個生命週期比較長的應用,會在任何退出時重啟,可以通過配置Service的複製(Replica)來達到高擴充套件和高可用 - Recplica Controller
Replication Controller確保任何時候Kubernetes叢集中有指定數量的pod副本(replicas)在執行, 如果少於指定數量的pod副本(replicas),Replication Controller會啟動新的Container,反之會殺死多餘的以保證數量不變。Replication Controller使用預先定義的pod模板建立pods,一旦建立成功,pod 模板和建立的pods沒有任何關聯,可以修改pod 模板而不會對已建立pods有任何影響,也可以直接更新通過Replication Controller建立的pods
以上是一些核心概念,除了這些,Kubernetes還提供其它一些概念,來支援應用程式的運維,包括:
- Label
對系統中的物件通過Label的方式來管理 - Namespace
對物件,資源分組,可以用於支援多租戶 - Config Map
提供全域性的配置資料儲存
總之,功能強大,系統概念繁多,比較複雜。
Kubernetes支援安裝UI的addon,來管理整個系統:
架構
下圖是Kubernetes的基本架構:
- Master
Master定義了Kubernetes 叢集Master/API Server的主要宣告,Client(Kubectl)呼叫Kubernetes API,管理Kubernetes主要構件Pods、Services、Minions、容器的入口。Master由API Server、Scheduler以及Registry等組成。
Scheduler收集和分析當前Kubernetes叢集中所有Minion節點的資源(記憶體、CPU)負載情況,然後依此分發新建的Pod到Kubernetes叢集中可用的節點。由於一旦Minion節點的資源被分配給Pod,那這些資源就不能再分配給其他Pod, 除非這些Pod被刪除或者退出, 因此,Kubernetes需要分析叢集中所有Minion的資源使用情況,保證分發的工作負載不會超出當前該Minion節點的可用資源範圍 - Minion
Minion負責執行Pod,Service,Jobs, Minion通過Kubelet和Master通訊。Proxy解決了外部網路能夠訪問跨機器叢集中容器提供的應用服務。 - etcd
負責叢集的協調和服務發現
特點
Kubernetes提供了很多應用級別的管理能力,包括高可用可高擴充套件,當然為了支援這些功能,它的架構和概念都比較複雜,當然我覺得為了獲得這些功能,值!
Apache Mesos
Mesos是為軟體定義資料中心而生的作業系統,跨資料中心的資源在這個系統中被統一管理。Mesos的初衷並非管理容器,只是隨著容器的發展,Mesos加入了容器的功能。Mesos可以把不同機器的計算資源統一管理,就像同一個作業系統,用於執行分散式應用程式。
Mesos的起源於Google的資料中心資源管理系統Borg。你可以從WIRED雜誌的這篇文章中瞭解更多關於Borg起源的資訊及它對Mesos影響。
功能
Mesos的主要功能包括:
- 高度的可擴充套件和高可用
- 可自定義的兩級排程
- 提供API進行應用的擴充套件
- 跨平臺
下圖是Mesos的管理介面:
架構
Mesos的基本架構如下
- Master
Master負責資源的統一協調和Slave的管理。 Master協調全部的Slave,並確定每個節點的可用資源,聚合計算跨節點的所有可用資源的報告,然後向註冊到Master的Framework(作為Master的客戶端)發出資源邀約。Mesos實現了兩級排程架構,它可以管理多種型別的應用程式。第一級排程是Master的守護程式,管理Mesos叢集中所有節點上執行的Slave守護程式。叢集由物理伺服器或虛擬伺服器組成,用於執行應用程式的任務,比如Hadoop和MPI作業。第二級排程由被稱作Framework的“元件”組成。 - Slave
Salve執行執行器(Executor)程式來執行任務。 - Framework
Framework包括排程器(Scheduler)和執行器(Executor)程式,其中每個節點上都會執行執行器。Mesos能和不同型別的Framework通訊,每種Framework由相應的應用叢集管理。
Framework可以根據應用程式的需求,選擇接受或拒絕來自master的資源邀約。一旦接受邀約,Master即協調Framework和Slave,排程參與節點上任務,並在容器中執行,以使多種型別的任務 - ZooKeeper
Zookeeper負責叢集的協調,Master的領導選舉等
特點
Mesos相比Kubernetes和Swarm更為成熟,但是Mesos主要要解決的是作業系統級別的抽象,並非為了容器專門設計,如果使用者出了容器之外,還要整合其它的應用,例如Hadoop,Spark,Kafka等,Mesos更為合適。Mesos是一個更重量級的叢集管理平臺,功能更豐富,當然很多功能要基於各種Framework。
Mesos的擴充套件性非常好,最大支援50000節點,如果對擴充套件性要求非常高的話麼,Mesos是最佳選擇。
AWS ECS
ECS (Amazon EC2 Container Service )是亞馬遜開發出的高度可擴充套件的高效能容器叢集服務。在託管的 Amazon EC2 例項叢集上輕鬆執行容器應用和服務。他最大的好處就是在雲上,不需要自己管理資料中心的機器和網路。
功能
ECS繼承了AWS服務的高擴充套件和高可用性,安全也可以得到保證。
在基本容器管理的基礎上,ECS使用Task和Service的概念來管理應用。
Task類似Docker Compose,使用一個JSON描述要執行的應用。Service是更高一層的抽象,包含多個task的執行例項,通過修改task例項的數量,可以控制服務的伸縮。同時Service可以保證指定數量的Task在執行,當出現錯誤的時候,重啟失敗的Task
架構
下圖是ECS的架構圖:
使用EC2,ELB,安全組等大家熟悉的AWS的概念,AWS使用者可以輕鬆管理你的容器叢集。並且不需要付初基本資源以外的費用。
通過ECS agent可以是Container連線到ECS叢集。ECS Agent使用Go開發,已開源。
我們並不清楚ECS的排程策略,但是AWS提供了一個例子,如果繼承第三方的排程策略。
通過Cloud Watch Log,我們可以很方便的對整個叢集進行監控。
特點
如果你是一個AWS的重度使用者,ECS是個不錯的選擇,因為你可以是把你的容器叢集執行在AWS的雲上,管理起來非常方便。
比較
這裡對幾個平臺做一個簡單的比較:
Swarm | Kubernetes | Mesos | ECS | |
基本功能 | Docker原生的叢集管理工具 | 開源的容器叢集工具,提供應用級別的部署,維護和擴張功能 | 基於資料中心的作業系統 | 基於雲的高可用,高擴充套件容器叢集 |
高層次抽象 | 無 | Pod Job Service |
無 | Task Service |
應用擴充套件性 | 無 | 支援 | Framework 支援 | 支援 |
應用高可用性 | 無 | 支援 | Framework 支援 | 支援 |
叢集協調和服務發現 | etcd ZooKeeper Consul |
etcd | ZooKeeper | / |
排程策略(Schedule) | 內建,可擴充套件 | 內建 | 兩級別,可擴充套件 | 可擴充套件 |
監控 | Logging Driver | Heapter,ELK Addon | 內建 | CloudWatch |
使用者介面 | CLI API UCP UI |
CLI API UI |
API UI |
CLI API AWS Console |
開發語言 | Go | Go | Java | NA |
開源 | 是 | 是 | 是 | 否 |
最大支援管理節點數 | 官方1000 非官方5000 |
官方1000 非官方2000 |
10000 | / |
總結
四個平臺,Swarm是最輕量級的,功能也最簡單,適於有大量Docker例項環境的使用者。Kubernetes增加了很多應用級別的功能,適用於快速應用的部署和維護。Mesos最重,適用於已經有了相當的應用和容器混合的環境。ECS則推薦給AWS的使用者或者不希望自己管理資料中心的雲使用者。
參考
- 巔峰對決之Swarm、Kubernetes、Mesos
- Swarm v. Fleet v. Kubernetes v. Mesos
- Container Orchestration Tools: Compare Kubernetes vs Docker Swarm
- Container Orchestration Tools: Compare Kubernetes vs Mesos
- Compare Kubernetes vs ECS (Amazon EC2 Container Service)
- Evaluating Container Platforms at Scale
- Docker Swarm Wins Scaling Benchmark but Don’t Take That as Gospel