容器叢集管理平臺的比較

發表於2016-10-31

容器化和微服務是當前最熱話題,不久之前,筆者(據說因為現在都不用筆了,“筆者”的稱謂已經不合適了,因為輸入用鍵盤,叫“鍵人”更為合適)參加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使用TaskService的概念來管理應用。

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的使用者或者不希望自己管理資料中心的雲使用者。

參考

相關文章