docker swarm在設計上遵從了可插拔的設計思想,安裝集群只需要啟動幾個docker就可以完成,安裝過程可以參考這裡:
總結下swarm的特性:
1.工作節點的註冊和發現
2.管理節點收集集群中所有的資訊
3.管理節點支援ha
4.管理節點能感知集群的變化,在節點掛掉後重新排程上面的container
5.提供filter和scheduler的排程策略排程集群裡的容器
下面,本文會從原始碼層面解密swarm是如何實現上面的特性的。
首先上一張整體的架構圖。
來自daocloud的架構圖。
在工作節點啟動時會在後端的kvstore上註冊乙個節點,路徑是etcd://ip:2376/docker/swarm/nodeip,worker會把當前集群的eth0
的ip註冊上etcd,然後設定上乙個ttl時間,比如3秒。然後啟乙個for迴圈每隔2秒(配置heartbeat)註冊一次,這樣,如果etcd上這個節點沒了就說明這個worker已經掛了。
for ).infof("registering on the discovery service every %s...", hb)
if err := d.register(addr); err != nil
time.sleep(hb)
}
manager的leader會啟動乙個go router watch後端的kvstore上註冊上來的ip,如果是新節點註冊上來就把節點加入到manager的記憶體中,開始收集資料,如果是節點掛了就刪除
discoverych, errch := cluster.discovery.watch(nil)
go cluster.monitordiscovery(discoverych, errch)
go cluster.monitorpendingengines()
for
for _, entry := range added
case err :=
log.errorf("discovery error: %v", err)}}
管理節點會收集集群中所有主機的資訊放到記憶體中。當乙個主機加入到swarm中時,首先會對節點上所有的資訊都收集一把到記憶體中,然後會建立乙個docker client長鏈結,通過event api獲取這個主機上的更新。
加入主機時的**,首先做主機的全同步,然後啟動eventmonitor,監控主機上的event:
e.eventsmonitor = neweventsmonitor(e.apiclient, e.handler)
// fetch the engine labels.
if err := e.updatespecs(); err != nil
e.startmonitorevents()
// force a state update
before returning.
if err := e.refreshcontainers(true); err != nil
if err := e.refreshimages(); err != nil
// do
notcheck error as older daemon doesn't support this call.
e.refreshvolumes()
e.refreshnetworks()
event的handler,會根據event的類別更新對應型別的資料。這裡由於考慮docker event的相容性有點長,我就只貼一段:
switch msg.type
switch action , c.globalbool("debug"), c.bool("cors"))
replica := api.newreplica(primary, tlsconfig)
go func()
}()go func()
}()server.sethandler(primary)
由於worker會loop往kvstore上傳送訊息,因此如果節點掛掉時manager能立刻感知到變化,並觸發removeengine的動作,把container重新排程到其他節點上就很容易做到了。
其實有了所有集群裡的所有節點的資訊,排程容器就變得比較簡單了。swarm提供了filter和scheduler來讓使用者定義排程的策略。
排程本質上是讓使用者可以定義container分配到集群中的策略。
filter指定了如果滿足這樣的條件的節點不會(會)被分配上。
scheduler指定了滿足filter後的節點按照怎樣的優先順序排序,排在前面的會被有限分配上container。
filter和scheduler的種類我就不贅述了,可以參考官方文件: (貌似最近又有了新的策略 rescheduler)
排程的**如下:
if err != nil
iflen(accepted) ==0
return s.strategy.rankandsort(config, accepted)
1.worker的行為過於簡單。只是往kvstore上同步狀態,就啟動乙個container,不做任何實際的工作,把所有活都交給manager幹,頗為浪費。
2.由於worker」啥也不幹「,manager必須保持所有節點的tcp長鏈結,擴充套件性很差。
3.沒有加入副本控制。
總結下,swarm作為一代的docker排程工具提供了基本的排程能力,可以滿足一些內部的ci/cd系統使用,但是由於擴充套件性較差和沒有副本控制,不能直接拿來部署線上系統,這是有的遺憾的。
Docker Swarm 介紹 or 工作原理
docker swarm 介紹 swarm 簡介 swarm是docker公司自研發的容器集群管理系統,swarm在早期是作為乙個獨立服務存在,在docker engine v1.12中整合了swarm的集群管理和編排功能。可以通過初始化swarm或加入現有swarm來啟用docker引擎的swar...
Docker Swarm排程策略
swarm在用命令swarm manager啟動swarm manager時,可用 strategy指定排程策略。swarm提供了三種排程策略計算節點的排名,在排程 例如選擇哪乙個節點執行容器時 時,取排名最前的節點。這三種排程策略是 spread binpack random random策略 隨...
docker swarm核心概念
翻譯自docker官方文件,原文 本節介紹了docker1.12中集群管理和編排特性的特有概念。節點是swarm中的乙個docker引擎例項。你也可以把它想成是乙個docker節點。你可以在乙個物理機或雲伺服器上執行多個節點,但生產環境中的swarm部署通常包括分布在多個物理機和雲平台上的docke...