溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

『高級篇』docker之DockerSwarm的了解(27)

發(fā)布時間:2020-06-25 18:37:10 來源:網(wǎng)絡(luò) 閱讀:417 作者:IT人故事 欄目:云計算

原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:轉(zhuǎn)載自IT人故事會,謝謝!
原文鏈接地址:『高級篇』docker之DockerSwarm的了解(27)

這次一起了解下docker Swarm,什么是dockerSwarm。

『高級篇』docker之DockerSwarm的了解(27)

什么是docker Swarm

  • 產(chǎn)品背景

    使用docker的流程,ssh到一臺服務(wù)器,運行docker命令來運行本機的docker服務(wù),隨著docker發(fā)展,越來越多的服務(wù)想要運行在docker容器中,如果在這樣挨個的登錄在每個ssh主機上管理容器,就非常的吃力了,而且我們的應(yīng)用也需要高可用,也需要避免單點的故障,docker現(xiàn)有的能力已經(jīng)很難滿足這樣的需求了,在這樣的背景下,docker社區(qū)就產(chǎn)生類的dockerSwarm項目。

  • 概念

    什么是swarm,swarm這個名詞比較貼切,swarm這個單詞的意思就是動物的集群行為,比如我們常見的蜂群,魚群,大雁南飛都可以成為swarm,swarm項目就是把多個docker 實例聚集在一起形成一個大的docker實例,對外提供集群服務(wù),同時這個集群提供所有的api,用戶可以相使用docker實例一樣使用docker的集群。

  • 昨日今日

    docker swarm在1.12之前是一個獨立的項目,需要單獨下載,在1.12之后該項目就合并到了docker中,成為docker的子項目,目前docker唯一的一個原生支持docker集群的管理工具。

docker swarm的架構(gòu)圖

下面這個圖,就可以看到docker swarm管理docker的一個架構(gòu)圖。以前使用docker命令行是針對docker主機的,然后到這臺機器上單獨的控制這臺機器上的主機,有了swarm之后,客戶端命令是針對docker集群的。它的命令幾乎等同于docker的原生命令,它把命令發(fā)送給swarm,swarm選擇發(fā)送一個節(jié)點去真正的執(zhí)行,swarm是通過docker自帶的遠程的API,來實現(xiàn)對docker的控制。

『高級篇』docker之DockerSwarm的了解(27)

下面這個圖,這張圖跟上面一張圖描述的是一個事情,只不過它暴露了更多的的細節(jié),上面的大框和下面的小框都代表了一臺服務(wù)器,物理機或者虛擬機,我們從上面說,上面是swarm的一個manager節(jié)點,管理這個worker節(jié)點,可以看到管理了多少個cpu,多少個內(nèi)存,每個上面運行的服務(wù),每個服務(wù)的狀況,比如他們的標簽,他們的健康狀態(tài),Manager管理者每個節(jié)點的生命周期,比如加入一個節(jié)點,下線一個節(jié)點,manager還管理者每個服務(wù)的生命周期,服務(wù)的部署,更新,停止,刪除,Node節(jié)點比較單純他就運行了docker daemon,因為在1.12之后swarm已經(jīng)融入了docker本身,開發(fā)一個遠程的api給manager節(jié)點調(diào)度,運行具體的服務(wù)和容器,下面咱們一起看看服務(wù)的部署流程是怎樣的,在這樣的架構(gòu)上是如何體現(xiàn)的。

『高級篇』docker之DockerSwarm的了解(27)

環(huán)境的搭建

想想之前學習的mesos,需要先安裝docker,Marathon,zookeeper,加入我們現(xiàn)在有5臺liunx服務(wù)器,每個上面都裝有docker,選擇一臺作為manager,上面執(zhí)行下圖的第一條命令, 執(zhí)行完之后會打印出來一個token作為dockerSwarm的憑證,然后在每個worker節(jié)點下執(zhí)行第二條命令,表示要加入集群,只需要token和對應(yīng)manager節(jié)點的ip和端口號,集群環(huán)境就搭建完畢了

『高級篇』docker之DockerSwarm的了解(27)

如何部署

客戶端的發(fā)起docker命令,兩種方式

  1. 直接ssh到manager節(jié)點,執(zhí)行docker命令。
  2. 通過遠程訪問的方式,通過Remote API調(diào)用manager上的docker命令,我們這張圖畫的就是第二種方式。

『高級篇』docker之DockerSwarm的了解(27)

docker Client 在manager節(jié)點的外邊,假如執(zhí)行了docker service create,先會經(jīng)過docker Deamon接受這條命令,傳給Scheduler模塊,Scheduler模塊主要實現(xiàn)調(diào)度的功能,負責選擇出來最優(yōu)的節(jié)點,里面包含了2個子模塊,F(xiàn)iter 和Strategy,F(xiàn)iter很明顯是過濾節(jié)點,用來找出滿足條件的節(jié)點(資源足夠多,節(jié)點正常的),Strategy是過濾出來后選擇出最優(yōu)的節(jié)點(對比選擇資源剩余最多的節(jié)點,或者找到資源剩余最少的節(jié)點),當然Fiter 和Strategy都是用戶可以單獨定制的,中間的Cluster是抽象的worker節(jié)點集群,包含了Swarm節(jié)點里面每個節(jié)點的信息,右邊的Discovery是信息維護的模塊,比如Label Health。Cluster最終調(diào)用容器的api,完成容器啟動的劉而成。

調(diào)度模塊

用戶在創(chuàng)建服務(wù)的時候,選擇最優(yōu)的節(jié)點,選擇最優(yōu)節(jié)點的管理分為2個階段。
過濾和策略

filter
  • Constraints

    約束過濾器,根據(jù)當前的操作系統(tǒng)的類型,內(nèi)核版本,存儲的類型進行指標上的約束,也可以自定義約束。當前系統(tǒng)啟動的時候可以通過label指定當前機器所具有的特性然后通過Constraints把他們過濾出來。

  • Affinity

    親和性過濾器,支持容器的親和性和鏡像的親和性,比如一個應(yīng)用,DB容器和web容器放在一起,就可以通過這個來實現(xiàn),

  • Dependency

    依賴過濾器,link等等吧Dependency會將這些容器放在同一個節(jié)點上,有依賴管理的會將創(chuàng)建的容器和依賴的容器放在同一個節(jié)點上。

  • Health filter

    健康過濾器,根據(jù)節(jié)點的健康狀態(tài)進行過濾,把有問題的節(jié)點去掉。

  • Ports filter

    端口過濾器,根據(jù)端口的使用情況進行過濾,比如一個8080端口在某個主機上被占用,某些主機未被占用,會選用未被占用的那些主機。

Strategy
  • Binpack

    在同等情況下,會使用資源最多的節(jié)點,通過這個策略可以讓容器聚集起來。

  • Spread

    在同等情況下,會使用資源最少的節(jié)點,通過這個策略可以讓容器均勻的分布在每個節(jié)點上。

  • Random

    隨機選擇一個節(jié)點。

服務(wù)發(fā)現(xiàn)

稍微有點復(fù)雜,根據(jù)場景來說吧

  • Ingress

    基于物理網(wǎng)絡(luò)之上的虛擬網(wǎng)絡(luò),Swarm的上層應(yīng)用不在依賴于物理網(wǎng)絡(luò),并且能夠讓下面的物理網(wǎng)絡(luò)保持不變,老鐵就理解到這里就可以了,網(wǎng)絡(luò)本身涉及到的東西太多了,應(yīng)該也聽過網(wǎng)絡(luò)工程師,既然有這個職位肯定這個不是那么容易學的,在這里就不會深入的進行詳解了。

『高級篇』docker之DockerSwarm的了解(27)

PS:假定運行了一個nginx服務(wù)2個實例,nginx1 和nginx2,容器內(nèi)的端口是80,主機內(nèi)的端口是8080, 這2個容器分別運行在node2和node3上,看到了吧node1雖然沒有運行實例但是依然有8080端口在監(jiān)聽,一個集群在所有的worker節(jié)點上都是可以訪問到的,隨便選一個節(jié)點輸入它的ip和8080端口就可以訪問到,或者搭建一個負載均衡External LB,負責輪詢的方式訪問每個上邊的8080端口,為什么在每個節(jié)點上都可以訪問我們的服務(wù)呢?每個服務(wù)啟動后所有的節(jié)點都會更新自己的VIP LB,把新的服務(wù)端口號和服務(wù)的信息建立一個關(guān)系,VIP LB是基于虛擬IP的負載均衡,VIP LB可以通過虛擬IP解析到真實IP,然后訪問到服務(wù)。

  • Ingress+ link

    就類型docker-compose,可以通過docker-compose.yml文件創(chuàng)建出來一組容器,他們之前通過link的方式進行訪問,其實這種就類型docker-compose的link網(wǎng)絡(luò)。

『高級篇』docker之DockerSwarm的了解(27)

PS:也就是在Ingress之上多了一個link的場景,可以通過link的方式訪問,也不需要主機的網(wǎng)絡(luò),link怎么實現(xiàn)的呢,如果讓一個容器link到另一個容器很容易畢竟他們在一臺主機上,一個服務(wù)link到另一個服務(wù)其實沒有那么簡單了,可能包含一個容器,也可能包含很多個容器,可能運行在一臺機器上,也可能分布在多臺機器上,我們?nèi)绾螌崿F(xiàn)可以通過名字來訪問彼此呢,這用到了容器的dns,這里的nginx服務(wù)依賴于tomcat服務(wù),nginx有2個實例,tomcat有一個實例,所有的nginx的容器都會對tomcat的解析,把它解析到tomcat的VIP,VIP負責做負載均衡,原理就是這樣的原理,link的方式外部是訪問不到的。link只適合swarm集群內(nèi)部的場景。

  • 自定義網(wǎng)絡(luò)

    使用自定義的網(wǎng)絡(luò),首先要創(chuàng)建網(wǎng)絡(luò),所有的網(wǎng)絡(luò)都可以通過名字來連接彼此,而不需要link操作了。只要連接這個網(wǎng)絡(luò)的彼此,都可以通過名字。底層來說它和link是類型的。通過dns來解析應(yīng)用的名字。然后通過VIP LB的形式來進行負載均衡。

#創(chuàng)建自定義網(wǎng)絡(luò)
docker network create --driver=overlay --attachable mynet
#創(chuàng)建服務(wù)
docker  service create -p 80:80 --network=mynet --name nginx nginx

『高級篇』docker之DockerSwarm的了解(27)

Ingress 支持外部訪問,Ingress+ link和自定義網(wǎng)絡(luò)只能容器間進行訪問。

服務(wù)編排

  1. 服務(wù)部署&服務(wù)發(fā)現(xiàn)(上邊說到了)
  2. 服務(wù)更新 -- docker service update
  3. 服務(wù)擴縮容 -- docker service scale

Swarm

  • 對外以Docker API 接口呈現(xiàn)

    好處直接可以平滑的切換到docker swarm上?;静恍枰淖儸F(xiàn)有的系統(tǒng)

  • 容易上手,學習成本低

    之前docker的經(jīng)驗可以完成繼承過來。

  • 輕量級,節(jié)省資源

    專注docker集群的管理。插件的機制swarm的模塊都抽象出來對應(yīng)的API,可以根據(jù)自己的特點進行定制實現(xiàn)。

  • 對docker命令參數(shù)支持完善

    跟docker同步發(fā)布,docker的新的特性在dockerSwarm上都可以得到體現(xiàn)。

PS:docker Swarm基本都了解的差不多了。下次開始docker swarm的環(huán)境搭建。

『高級篇』docker之DockerSwarm的了解(27)

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI