Docker Swarm原理大解密

2021-07-28 08:58:49 字數 2918 閱讀 6338

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...