深入淺出Swarm

2021-09-02 16:46:32 字數 4107 閱讀 6397

docker自誕生以來,其容器特性以及映象特性給devops愛好者帶來了諸多方便。然而在很長的一段時間內,docker只能在單host上執行,其跨host的部署、執行與管理能力頗受外界詬病。跨host能力的薄弱,直接導致docker容器與host的緊耦合,這種情況下,docker容器的靈活性很難令人滿意,容器的遷移、分組等都成為很難實現的功能點。

swarm是docker公司在2023年12月初新發布的容器管理工具。和swarm一起發布的docker管理工具還有machine以及compose。

swarm是一套較為簡單的工具,用以管理docker集群,使得docker集群暴露給使用者時相當於乙個虛擬的整體。swarm使用標準的docker api介面作為其前端訪問入口,換言之,各種形式的docker client(dockerclient in go, docker_py, docker等)均可以直接與swarm通訊。swarm幾乎全部用go語言來完成開發,並且還處於乙個alpha版本,目前在github上發布的版本僅有v0.1.0-rc1。然而swarm的發展十分快速,功能和特性的變更迭代還非常頻繁。因此,可以說swarm還不推薦被用於生產環境中,但可以肯定的是swarm是一項很有前途的技術。

swarm的設計和其他docker專案一樣,遵循「batteries included but removable」原則。筆者對該原則的理解是:batteries included代表設計swarm時,為了完全體現分布式容器集群部署、執行與管理功能的完整性,swarm和docker協同工作,swarm內部包含了乙個較為簡易的排程模組,以達到對docker集群排程管理的效果;「but removable」意味著swarm與docker並非緊耦合,同時swarm中的排程模組同樣可以定製化,使用者可以按照自己的需求,將其替換為更為強大的排程模組,如mesos等。另外,這套管理引擎並未侵入docker的使用,這套機制也為其他容器技術的集群部署、執行與管理方式提供了思路。

swarm作為乙個管理docker集群的工具,首先需要將其部署起來,可以單獨將swarm部署於乙個節點。另外,自然需要乙個docker集群,集群上每乙個節點均安裝有docker。具體的swarm架構圖可以參照下圖:

圖2.1 swarm架構圖

swarm架構中最主要的處理部分自然是swarm節點,swarm管理的物件自然是docker cluster,docker cluster由多個docker node組成,而負責給swarm傳送請求的是docker client。

swarm架構圖可以讓大家對swarm有乙個初步的認識,比如swarm的具體工作流程:docker client傳送請求給swarm;swarm處理請求並傳送至相應的docker node;docker node執行相應的操作並返回響應。除此之外,swarm的工作原理依然還不夠明了。

深入理解swarm的工作原理,可以先從swarm提供的命令入手。swarm支援的命令主要有4個:swarm create、swarm manage、swarm join、swarm list。當然還有乙個swarm help命令,該命令用於指導大家如何正確使用swarm命令,本文不再贅述。

swarm中swarm create命令用於建立乙個集群標誌,用於swarm管理docker集群時,docker node的節點發現功能。

發起該命令之後,swarm會前往docker hub上內建的發現服務中獲取乙個全球唯一的token,用以唯一的標識swarm管理的docker集群。

注:swarm的執行需要使用服務發現,目前該服務內建與docker hub,該服務發現機制目前還在alpha版本,站點為: 。

swarm中swarm manage是最為重要的管理命令。一旦swarm manage命令在swarm節點上被觸發,則說明使用者需要swarm開始管理docker集群。從執行流程的角度來講,swarm經歷的階段主要有兩點:啟動swarm、接收並處理docker集群管理請求。

swarm啟動的過程包含三個步驟:

發現docker集群中的各個節點,收集節點狀態、角色資訊,並監視節點狀態的變化;

初始化內部排程(scheduler)模組;

建立並啟動api監聽服務模組;

第乙個步驟,swarm發現docker集群中的節點。發現(discovery)是swarm中用於維護docker集群狀態的機制。既然涉及到發現(discovery),那在這之前必須先有註冊(register)。swarm中有專門負責發現(discovery)的模組,而關於註冊(register)部分,不同的discovery模式下,註冊(register)也會有不同的形式。

目前,swarm中提供了5種不同的發現(discovery)機制:node discovery、file discovery、consul discovery、etcd discovery和zookeeper discovery。

第二個步驟,swarm內部的排程(scheduler)模組被初始化。swarm通過發現機制發現所有註冊的docker node,並收集到所有docker node的狀態以及具體資訊。此後,一旦swarm接收到具體的docker管理請求,swarm需要對請求進行處理,並通過所有docker node的狀態以及具體資訊,來篩選(filter)決策到底哪些docker node滿足要求,並通過一定的策略(strategy)將請求**至具體的乙個docker node。

第三個步驟,swarm建立並初始化api監聽服務模組。從功能的角度來講,可以將該模組抽象為swarm server。需要說明的是:雖然swarm server完全相容docker的api,但是有不少docker的命令目前是不支援的,畢竟管理docker集群與管理單獨的docker會有一些區別。當swarm server被初始化並完成監聽之後,使用者即可以通過docker client向swarm傳送docker集群的管理請求。

swarm的swarm manage接收並處理docker集群的管理請求,即是swarm內部多個模組協同合作的結果。請求入口為swarm server,處理引擎為scheduler,節點資訊依靠disocovery。

swarm的swarm join命令用於將docker node新增至swarm管理的docker集群中。從這點也可以看出swarm join命令的執行位於docker node,因此在docker node上執行該命令,首先需要在docker node上安裝swarm,由於該swarm只會執行swarm join命令,故可以將其當成docker node上用於註冊的agent模組。

功能而言,swarm join可以認為是完成docker node在swarm節點處的註冊(register)工作,以便swarm在執行swarm manage時可以發現該docker node。然而,上文提及的5種discovery模式中,並非每種模式都支援swarm join命令。不支援的discovery的模式有node discovery與file discovery。

docker node上swarm join執行之後,標誌著docker node向swarm註冊,請求加入swarm管理的docker集群中。swarm通過註冊資訊,發現docker node,並獲取docker node的狀態以及具體資訊,以便處理docker請求時作為排程依據。

swarm中的swarm list命令用以列舉docker集群中的docker node。

docker node的資訊均**於swarm節點上註冊的docker node。而乙個docker node在swarm節點上註冊,僅僅是註冊了docker node的ip位址以及docker監聽的埠號。

使用swarm list命令時,需要指定discovery的型別,型別包括:token、etcd、file、zk以及。而swarm list並未羅列docker集群的動態資訊,比如docker node真實的執行狀態,或者docker node在docker集群中扮演的角色資訊。

swarm的架構以及命令並沒有很複雜,同時也為希望管理docker集群的docker愛好者降低了學習和使用門檻。

俗話說得好,沒有一種一勞永逸的工具,有效的管理docker集群同樣也是如此。缺乏場景來談論swarm的價值,意義並不會很大。相反,探索和挖掘swarm的特點與功能,並為docker集群的管理提供一種可選的方案,是docker愛好者更應該參與的事。

本文初步介紹swarm,並涉及架構與命令,下期將帶來swarm的具體使用,以及swarm的架構剖析。

孫巨集亮,daocloud

1.2.

3.

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...

深入淺出ShellExecute

深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...