Docker三劍客之Swarm介紹

jopen 9年前發布 | 18K 次閱讀 Swarm
 

Swarm背景

【編者的話】Swarm項目是Docker公司發布三劍客中的一員,用來提供容器集群服務,目的是更好的幫助用戶管理多個Docker Engine,方便用戶使用,像使用Docker Engine一樣使用容器集群服務。這次分享內容從Swarm項目現狀、Swarm社區現狀和Swarm未來的一些規劃三方面介紹Swarm,目的是能讓 大家對Swarm有個完整的認識,并且希望更多的人采用到Swarm項目中來。

現實中我們的應用可能會有很多,應用本身也可能很復雜的,單個docker engine所能提供的資源未必能夠滿足要求。而且應用本身也會有可靠性這樣的要求,希望避免單點故障,這樣的話勢必需要分布在多個docker engine。在這樣一個大背景下,Docker社區就產生了Swarm項目。

Swarm是什么

Swarm這個項目名稱其他特別貼切。在Wiki的解釋中,Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群;秋天往南飛的雁群都可以稱作Swarm behavior。

Docker三劍客之Swarm介紹

Swarm項目正是這樣,通過把多個Docker Engine聚集在一起,形成一個大的docker-engine,對外提供容器的集群服務。同時這個集群對外提供Swarm API,用戶可以像使用Docker Engine一樣使用Docker集群。

Swarm 特點

* 對外以Docker API接口呈現,這樣帶來的好處是,如果現有系統使用Docker Engine,則可以平滑將Docker Engine切到Swarm上,無需改動現有系統。

  • Swarm對用戶來說,之前使用Docker的經驗可以繼承過來。非常易上手,學習成本和二次開發成本都比較低。同時Swarm本身專注于Docker集群管理,非常輕量,占用資源也非常少。

*“Batteries included but swappable”,簡單說,就是插件化機制,swarm中的各個模塊都抽象出了api,可以根據自己一些特點進行定制實現。

  • Swarm自身對docker命令參數支持的比較完善,Swarm目前與Docker是同步發布的。Docker的新功能,都會第一時間在Swarm中體現。

Swarm框架結構。

Docker三劍客之Swarm介紹

  • Swarm對外提供兩種API, 一種是DockerAPI,用于負責容器鏡像的生命周期管理, 另外一種是Swarm集群管理CLI,用于集群管理。
  • Scheduler模塊,主要實現調度功能。在通過Swarm創建容器時,會經過Scheduler模塊選擇出一個最優節點,里面包含了兩個 子模塊,分別是Filter和Strategy, Filter用來過濾節點,找出滿足條件的節點(比如資源足夠,節點正常等等),Strategy用來在過濾出的節點中根據策略選擇一個最優的節點(比如 對找出的節點進行對比,找到資源最多的節點等等), 當然Filter/Strategy用戶可以定制。
  • Swarm對集群進行了抽象,抽象出了Cluster API,Swarm支持兩種集群,一種是Swarm自身的集群,另外一種基于Mesos的集群。
  • LeaderShip模塊用于Swarm Manage自身的HA,通過主備方式實現。
  • Discovery Service 服務發現模塊,這個模塊主要用來提供節點發現功能。
  • 在每一個節點上,都會有一個Agent,用于連接Discovery Service,上報docker Daemon的IP端口信息,Swarm Manage會直接從服務發現模塊中讀取節點信息。

Swarm各個模塊介紹

集群管理

swarm Manage CLI用于集群管理。大家可以看這張圖,通過三部就可以將集群創建起來。

Docker三劍客之Swarm介紹

Swarm容器集群創建完成后,就可以采用docker命令,像使用Docker engine一樣使用Swarm集群創建容器了。

服務發現

服務發現,在swarm中主要用于節點發現,每一個節點上的agent會將docker-egine的ip端口注冊到服務發現系統中。Manager會從服務發現模塊中讀取節點信息。Swarm中服務發現支持已下3中類型的后端。

第一種,是hosted discovery service,是Docker Hub提供的服務發現服務,需要連接外網訪問。

第二種,是KV分布式存儲系統,現在已支持etcd、zookeeper、consul三種。

第三種,是靜態IP:可以使用本地文件或者直接指定節點IP,這種方式不需要啟動額外使用其他組件,一般在調試中會使用到。

Scheduler

調度模塊主要用戶容器創建時,選擇一個最優節點。在選擇最優節點過程中,分為了兩個階段:

第一個階段,是過濾。根據條件過濾出符合要求的節點,過濾器有以下5中,

(1)Constraints,約束過濾器,可以根據當前操作系統類型、內核版本、存儲類型等條件進行過濾,當然也可以自定義約束,在啟動daemon的時候,通過Label來指定當前主機所具有的特點。

(2)Affnity,親和性過濾器,支持容器親和性和鏡像親和性,比如一個web應用,我想將db容器和web容器放在一起,就可以通過這個過濾器來實現。

(3)Dependency,依賴過濾器。如果在創建容器的時候使用了--volume-from/--link/--net某個容器,則創建的容器會和依賴的容器在同一個節點上。

(4)Health filter,他會根據節點狀態進行過濾,會去除故障節點。

(5)Ports filter,會根據端口的使用情況過濾。

調度的第二個階段是根據策略選擇一個最優節點。有以下三種策略

(1)Binpack,在同等條件下,選擇資源使用最多的節點,通過這一個策略,可以將容器聚集起來。

(2)Spread,在同等條件下,選擇資源使用最少的節點,通過這一個策略,可以將容器均勻分布在每一個節點上。

(3)Random,隨機選擇一個節點。

Leadership

Leadership模塊,這個模塊主要用來提供swarm manager自身的HA。

Docker三劍客之Swarm介紹

為了防止Swarm Mange單點故障,引入了HA機制,Swarm Manage自身是無狀態的,所以還是很容易實現HA的。 實現過程中采用主備方式,當主節點故障以后,會從新選主提供服務,選主過程中采用分布式鎖實現,現在支持etcd、zookeeper、consul三種 類型的分布式存儲,用來提供分布式鎖。 當備節點收到消息后,會將消息轉發給主節點。

以上就是框架中各個模塊的相關介紹,下來和大家一起再看一下,swarm與周邊項目的集成。

首先看一下,與三劍客之間的集成。

Swarm與周邊項目集成

三劍客是docker公司去年底發布的三個項目,這三者是可以緊密協作的。可以看一下這張圖

Docker三劍客之Swarm介紹

最下面是Machine,通過machine可以在不同云平臺上創建出包含docker-engine的主機。Machine通過driver機 制,目前支持多個平臺的docker-egine環境的部署,比如亞馬遜、openstack等。 Docker engine創建完以后,就該swarm上場了,swarm將每一個主機上的docker-egnine管理起來,對外提供容器集群服務。最上面是 compose項目,compose項目主要用來提供基于容器的應用的編排。用戶通過yml文件描述由多個容器組成的應用,然后由Compose解析 yml,調用docker API,在swarm集群上創建出對應的容器。

我們知道現在圍繞Docker已經產生了很大的一個生態圈。 因此swarm不僅在和自家兄弟集成,也能積極和周邊的一些項目集成。比如,swarm現在已經可以和mesos進行集成。Swarm與Mesos集成 時,也是以Framework方式集成,實現了Framework所需的接口。這個大特性處在experiment階段。

Swarm社區的現狀。

Swarm項目去年底發布,發展了短短半年時間,已經到了0.4版本,目前還處于正在快速演進階段。 Swarm發布版本周期目前是跟著docker一起發布,基本上兩個月一個版本,在開發過程中,采用迭代方式開發,基本上每兩個星期完成一輪迭代。參與社 區的方法基本上和其他社區一致。當遇到問題時,可以在社區創建issue,然后描述問題,最好能上環境信息以及問題重現的步驟,這樣有利于問題的定位。當 然也可也直接通過IRC或者郵件直接交流。 Swarm社區很歡迎大家的參與,不論是使用中遇到的問題/Bug,還是Swarm功能上目前無法滿足大家的地方。都歡迎大家提出來,一起討論。

如果對代碼感興趣的話,可以參考docker社區的提交代碼流程來提交代碼,也非常歡迎大家能夠參與到Swarm社區中提交代碼。

Swarm未來規劃

(1)首先是支持所有的docker api,現在支持率大概在95%,其中一些實現還存在問題,需要改進。

(2)第二塊是網絡部分,通過libnetwork項目,實現overlay network。

(3)第三塊是Self healing,通過這一個功能可以實現,當一個節點故障以后,會將故障節點上的容器在另外一些節點上創建。

(4)第四塊是Global Scheduler。這個特性主要用來將一個容器在每一個節點上進行創建。比如,想將一個log容器在每一個節點創建,用來記錄日志,則可以通過這一特性實現。

(5)最后是volume,這一塊社區最近在討論

QA

Q:K8s和swarm 相比較來看如何選擇呢

A:一個很Open的話題,根據特點,選擇適合自己的就OK。swarm對外提供docker api,自身輕量、學習成本、二次開發成本都比較低,自身是插件式框架。從功能上講,swarm是k8s的一個子集,個人感覺,compose+swarm = k8s

Q:Swarm最終目標是什么,只是為了管理容器嗎,有沒有考慮過提升資源利用率,會把資源彈性伸縮做上來嗎,最終把所有機器負載提升,防止有些低負載或空負載浪費資源。

A:Auto-scaling能力,個人感覺后邊可能通過compose來實現,感興趣的話,可以在swarm社區提一個proposal。

Q: swarm對節點的選取是否可定制化?指的是策略選擇,感覺只有這三種不夠強大

A:可以,可以根據自己的特點實現對應api

Q:調用Swarm api及Swarm調docker api 安全認證是怎么做的?

A:安全這部分是通過SSL協議實現通信安全以及認證,支持Swarm對外(比如與Client)之間的提供通信安全,同時Swarm與Docker Engine之間的也支持通信安全。

Q:swarm怎么跨節點link?

A:目前不支持跨節點,如果使用了link,創建的容器和link的容器會被調度到同一個節點上。

Q:Swarm的調度系統也是插件形式?可以使用Mesos的資源調度嗎?

A:swarm調度器是插件形式。Mesos采用兩層調度框架,第一層,由mesos將符合框架的資源上報給框架,第二層,框架(swarm)自身的調度器將資源分配給任務。

Q:Swarm IP是怎么管理的?Swarm 下的各個節點是動態分配IP的么

A:當前網絡部分還是用docker-engine自身的能力,后續會和libnetwork進行集成,具體怎么管理正在討論中。

Q: swarm支持根據docker的標簽來調度嗎

A: 支持,通過Constraints Filter來實現

Q:網絡部分集成除了libnetwork還有其他計劃或者考慮嗎

A:libnetwork自身也提供了plugin機制,個人理解,和其他網絡項目很好集成。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!