摘要:節點管理器將利用該聲明該集群服務。在本示例當中,我們將部署一項服務。此標記用于告知公布端口作為該服務的可用端口。將此稱為入口負載均衡。當外部系統調用某項服務時,接收節點會接受流量并利用提供的內部服務對其進行負載均衡。
在Ubuntu 16.04之上激活Swarm Mode最新版本Docker Engine v1.12中,包含了多項與Docker Swarm緊密相關的功能變更。在今天的文章中,數人云將和大家探討如何利用Docker的Swarm Mode進行服務部署。
在向Docker Engine Swarm部署一項服務之前,我們首先需要設置一套Swarm集群。由于本文旨在展示1.12版本中的各項新增功能,因此我們應當安裝Docker Engine的最新版本。
以下操作指南適用于Ubuntu 16.04環境下的Docker Engine安裝。對于其它版本及平臺,大家可以查看Docker的官方安裝指南。
設置Docker Apt庫在安裝過程中,我們需要使用Ubuntu提供的標準安裝方法,即Apt軟件包管理器。由于我們將安裝Docker Engine的最新版本,因此需要配置Apt以從Docker官方Apt庫處獲取docker-engine軟件包,而非直接使用系統預配置庫。
添加Docker公鑰配置Apt以使用新庫的第一步,需要使用apt-key命令將該庫的公鑰添加至Apt緩存當中。
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
以上apt-key命令會向p80.pool.sks-keyservers.net密鑰服務器請求該特定密鑰(58118E89F3A912897C070ADBF76221572C52609D)。該公鑰將被用于驗證下載自此新庫的全部軟件包。
指定Docker的庫位置現在Docker公鑰已經導入完成,我們可以配置Apt以使用Docker項目的庫服務器。要實現這一目標,我們需要在/etc/apt/sources.list.d/目錄內添加以下條目。
# echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list.d/docker.list
在刷新Apt軟件包緩存時,Apt會對sources.list.d/目錄內的全部文件進行搜索,旨在查找新的軟件包庫。以上命令會創建(若尚不存在)一個名為docker.list的新文件,并將對應條目添加至apt.dockerproject.org庫當中。
更新Apt的軟件包緩存要更新Apt的軟件包緩存,我們可以運行apt-get命令并添加update選項。
# apt-get update
如此一來,Apt會通過重新讀取全部配置文件以填充各庫列表,其中包括我們剛剛添加的配置文件。另外,其還將查詢這些庫以緩存一份可用軟件包清單。
安裝linux-image-extra的先決條件在安裝Docker Engine之前,我們還需要安裝另一軟件包。linux-image-extra軟件包是一套特定內核軟件包,負責幫助Ubuntu系統支持aufs存儲驅動器。此驅動程序由Docker用于向容器內安裝各分卷。
要安裝此軟件包,我們需要再次使用apt-get命令,但這一次配合install選項。
# apt-get install linux-image-extra-$(uname -r)
在此apt-get命令當中,$(uname -r)部分或者命令將返回當前運行中內核的實際版本。任何對此系統內核的更新都應包含對應linux-image-extra軟件包版本的安裝。如果此軟件包未進行更新,則Docker可能會在安裝分卷時出現某些問題。
安裝Docker EngineApt配置完成且linux-image-extra安裝完畢之后,我們現在可以著手安裝Docker Engine。要完成這項任務,我們需要再次使用apt-get命令配合install選項,從而安裝docker-engine軟件包。
# apt-get install docker-engine
在這里,我們應當已經擁有Docker Engine v1.12.0或者更新版本。要驗證是否具備正確版本,可以執行docker命令配合version選項。
# docker versionClient: Version: 1.12.0 API version: 1.24 Go version: go1.6.3 Git commit: 8eab29e Built: Thu Jul 28 22:11:10 2016 OS/Arch: linux/amd64 Server: Version: 1.12.0 API version: 1.24 Go version: go1.6.3 Git commit: 8eab29e Built: Thu Jul 28 22:11:10 2016 OS/Arch: linux/amd64
在這里,我們可以看到服務器與客戶端版本皆為1.12.0。下面開始創建Swarm。
創建 Docker Swarm在本篇教程中,我們將跨越多臺設備執行此項任務。為了清晰起見,這里我們在命令示例中包含主機名稱。
我們首先建立一套雙節點Swarm集群,其中的兩個節點皆應利用上述操作完成Docker Engine的安裝。
在創建該Swarm集群時,我們需要指定一個節點管理器。在本示例中,我們將使用名稱為swarm-01的主機作為節點管理器。要讓swarm-01成為節點管理器,我們需要首先在swarm-01之上執行一條命令以創建Swarm集群。這里我們使用docker命令配合swarm init選項。
root@swarm-01:~# docker swarm init --advertise-addr 10.0.0.1 Swarm initialized: current node (awwiap1z5vtxponawdqndl0e7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb 10.0.0.1:237 7To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-bwex7fd4u5aov4naa5trcxs34 10.0.0.1:2377
利用以上命令外加swarm init,我們還利用10.0.0.1值指定了--advertise-addr標記。Swarm節點管理器將利用該IP聲明該Swarm集群服務。盡管該地址屬于專有IP,但為了讓各節點順利加入此Swarm,各節點都需要能夠通過此IP在端口2377上接入此節點管理。
在運行docker swarm init命令之后,我們會看到swarm-01已經被分配了一個節點名稱(awwiap1z5vtxponawdqndl0e7)并成為此Swarm集群中的管理器。其輸出結果分為兩條命令:其一用于向該Swarm內添加一個工作節點,其二為向該Swarm內添加另一節點管理器。
Docker Swarm Mode能夠支持多套節點管理器,不過其仍會選擇其中之一作為主節點管理器,并由其負責Swarm集群內部的編排工作。
向Swarm集群內添加一個工作節點在Swarm集群創建完成后,現在我們可以利用由Swarm創建給出的輸出結果,通過docker命令添加新的工作節點。
root@swarm-02:~# docker swarm join > --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb > 10.0.0.1:2377 This node joined a swarm as a worker.
在本示例中,我們將swarm-02添加至Swarm當中作為工作節點。工作節點屬于Swarm集群當中的一個成員,其角色在于運行各類任務; 而其中的任務則表現為容器形式。在另一方面,節點管理器則負責管理任務(容器)編排并維護Swarm集群本身。
除了節點管理職責之外,節點管理器本身亦作為工作節點存在,意味著其同樣能夠為Swarm集群分擔部分任務。
查看當前Swarm節點在上述命令執行完畢之后,現在我們已經擁有了一套基本的雙節點Swarm集群。下面我們執行docker命令與node ls選項以驗證集群的當前狀態。
root@swarm-01:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 13evr7hmiujjanbnu3n92dphk swarm-02.example.com Ready Active awwiap1z5vtxponawdqndl0e7 * swarm-01.example.com Ready Active Leader
從此命令的輸出結果中,我們可以看到swarm-01與swarm-02都處于Ready與Active狀態。如此一來,現在我們即可進一步向此套Swarm集群部署服務了。
創建一項服務在Docker Swarm Mode當中,服務屬于一套長期運行的Docker容器,其可被部署在任意工作節點之上。另外,該服務亦允許任意Swarm集群內的遠程系統或者容器進行接入與使用。
在本示例當中,我們將部署一項Redis服務。
部署一項復制服務復制服務屬于一項Docker Swarm服務,其中包含特定數量的運行副本。這些副本由特定Docker容器的多個實例所構成。在本示例中,每套副本都將表現為一個獨特的Redis實例。
要創建新服務,我們使用docker命令并配合service create選項。以下命令將創建一項名為redis的服務,其擁有2套副本并在整套集群內通過6379端口進行發布。
root@swarm-01:~# docker service create --name redis --replicas 2 --publish 6379:6379 redis er238pvukeqdev10nfmh9q1kr
除了指定service create選項之外,我們還需要使用--name標記以命名redis服務,并由--replicas標記指定該服務應運行在2套不同節點之上。我們可以在兩個節點中執行docker命令配合service ls選項以實現這一效果。
root@swarm-01:~# docker service ls ID NAME REPLICAS IMAGE COMMAND er238pvukeqd redis 2/2 redis
在輸出結果中,我們可以看到2套副本中的2套正處于運行當中。如果我們希望了解與這些任務相關的更多細節信息,則可運行docker命令配合service ps選項。
root@swarm-01:~# docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 5lr10nbpy91csmc91cew5cul1 redis.1 redis swarm-02.example.com Running Running 40 minutes ago 1t77jsgo1qajxxdekbenl4pgk redis.2 redis swarm-01.example.com Running Running 40 minutes ago
其中service ps選項將顯示此特定服務的全部任務(容器)。在本示例中,我們可以看到redis服務擁有一項任務(容器),且同時運行在兩個Swarm節點之上。
接入此 Redis服務由于我們已經證實此服務開始運行,因此接下來可利用redis-cli客戶端立足于遠程系統接入該項服務。
vagrant@vagrant:~$ redis-cli -h swarm-01.example.com -p 6379 swarm-01.example.com:6379>
通過以上連接,我們能夠成功接入該redis服務。這意味著我們的服務已經啟動并處于可用狀態。
DockerSwarm如何公布服務在創建此redis服務時,我們使用了--publish標記并配合docker service create命令。此標記用于告知Docker公布6379端口作為該redis服務的可用端口。
而當Docker為某項服務發布端口時,其會在Swarm集群內的全部節點之上監聽該端口。當有流量經過該端口,則對應流量會被路由至負責運行該服務的對應容器。盡管此概念在全部節點皆運行單一服務容器時能夠以標準化方式實現,但在面對多套副本時則會發生一些變化。
要了解其工作原理,讓我們向Swarm集群中添加第三個工作節點。
將第三個工作節點添加進來要添加另一工作節點,我們只需要重復文章開頭處的安裝與設置步驟即可。這里直接跳過重復部分,而后再次運行docker命令以檢查集群中的當前運行狀態。
root@swarm-01:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 13evr7hmiujjanbnu3n92dphk swarm-02.example.com Ready Active awwiap1z5vtxponawdqndl0e7 * swarm-01.example.com Ready Active Leader e4ymm89082ooms0gs3iyn8vtl swarm-03.example.com Ready Active
現在可以看到我們的集群由三個節點構成:
swarm-01
swarm-02
swarm-03
當我們利用兩套副本創建服務時,其會在swarm-01與swarm-02之上創建任務(容器)。下面看看添加另一工作節點會對此產生何種影響。
root@swarm-01:~# docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 5lr10nbpy91csmc91cew5cul1 redis.1 redis swarm-02.example.com Running Running 55 minutes ago 1t77jsgo1qajxxdekbenl4pgk redis.2 redis swarm-01.example.com Running Running 55 minutes ago
利用復制服務,Docker Swarm能夠確保每套指定副本皆擁有一個任務(容器)處于運行當中。在創建redis服務時,我們指定其中應存在2套副本。這意味著即使添加第三個節點,Docker仍然不會在該節點上建立新的任務。
這樣一來,我們就面對著一種有趣的狀態:我們的服務運行在3個Swarm節點中的2個之上。在非Swarm環境下,這意味著redis服務將無法接入第三個Swarm節點。然而由于Swarm Mode的存在,這種接入關系仍可正常實現。
在未運行任務的工作節點上接入服務之前我們已經探討了Docker如何公布一個服務端口,當時提到該端口會被公布至Swarm內的全部節點。而真正值得關注的是,當我們接入某個并未運行服務相關容器(任務)的工作節點時,會發生怎樣的情況。
下面我們看看經由redis公開端口接入swarm-03,會有怎樣的結果。
vagrant@vagrant:~$ redis-cli -h swarm-03.example.com -p 6379 swarm-03.example.com:6379>
有趣的是,我們的連接嘗試仍然能夠成功。之所以成功,是因為盡管swarm-03并沒有運行任何redis容器,但Docker內部會將我們的redis服務流量重新路由至運行有redis容器的工作節點。
Docker將此稱為入口負載均衡。其工作原理在于,全部工作節點都會監聽指向公開服務端口的連接。當外部系統調用某項服務時,接收節點會接受流量并利用Docker提供的內部DNS服務對其進行負載均衡。
所以即使我們將Swarm集群擴展至包含100個工作節點,服務的最終用戶仍然能夠輕松接入任意工作節點。他們的請求隨后會被重新定向至兩套運行有redis服務任務(容器)的Docker主機之一。
這種重新路由與負載均衡機制對于最終用戶是完全透明的,且全程發生于Swarm集群內部。
實現全局服務現在我們設置的redis服務已經運行有2套副本,意味著其運行在3個節點中的2個之上。
如果希望我們的redis服務在每個工作節點上皆擁有實例,我們可以將服務的必要副本數量由2修改為3。這意味著只要添加或者除去工作節點,我們就需要對副本數量做出調整。
當然,我們也可以將服務轉化為全局服務從而自動完成上述調整。Docker Swarm Mode中的全局服務用于創建能夠自動在各個工作節點上擁有運行任務的服務。這項機制適用于Redis等需要在內部由其它服務使用的常規服務。
要完成這一調整,我們需要將自己的redis服務重新創建為一項全局服務。
root@swarm-01:~# docker service create --name redis --mode global --publish 6379:6379 redis 5o8m338zmsped0cmqe0guh2to
以上命令同樣使用docker service create命令進行復制服務的創建,不過區別在于--mode標記之后添加了global值。
服務創建完成之后,可以看到Docker如何一次執行docker命令與service ps選項將該服務的各項任務進行分發。
root@swarm-01:~# docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 27s6q5yvmyjvty8jvp5k067ul redis redis swarm-03.example.com Running Running 26 seconds ago 2xohhkqvlw7969qj6j0ca70xx \_ redis redis swarm-02.example.com Running Running 38 seconds ago 22wrdkun5f5t9lku6sbprqi1k \_ redis redis swarm-01.example.com Running Running 38 seconds ago
現在該服務已經被創建為全局服務,接下來Swarm集群內的各個節點皆將運行與之相關的任務(容器)。
總結在本篇文章中,我們不僅完成了Docker Engine的安裝,同時亦設置了一套Swarm集群,部署了復制服務而后創建了全局服務。
在將Docker Swarm Mode服務與Kubernetes服務進行比較時,我們發現Swarm Mode服務的設置與創建更為簡便易行。如果大家需要使用Kubernetes的“服務”功能但又用不到其它機制,那么Docker Swarm Mode可能是更為理想的便捷選項。
(文章轉自:CODESHIP,作者 Ben Cane)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26683.html
摘要:利用分布式應用捆綁包簡稱部署服務相較于利用大量參數創建網絡及服務,這里我們選擇使用一個文件。 在Docker 1.12版本中,全新的Swarm捆綁包相較于原有編排及調度機制做出了巨大改進。它不再需要運行一組獨立的Swarm容器,這部分容器已經被直接捆綁在Docker Engine當中,故障轉移策略更為可靠,服務發現機制實現內置,新的網絡功能極為順暢……看起來很棒是不是? 數人云這...
摘要:年容器大火,圍繞著容器技術的發展也涌現了許多新項目。項目類本節綜述了目前開源社區和互聯網公司圍繞容器技術開發的相關項目。是公司開源項目,旨在為提供守護進程。 2015年容器大火,圍繞著容器技術的發展也涌現了許多新項目。同時,許多老項目也開始支持容器作為運行環境。下面介紹這些項目: 規范標準類 容器使用了Linux內核的特性,Docker的成功也主要在于其充分挖掘了此類特性。但Docke...
閱讀 1336·2023-04-25 23:47
閱讀 912·2021-11-23 09:51
閱讀 4432·2021-09-26 10:17
閱讀 3706·2021-09-10 11:19
閱讀 3254·2021-09-06 15:10
閱讀 3546·2019-08-30 12:49
閱讀 2421·2019-08-29 13:20
閱讀 1730·2019-08-28 18:14