DockerSwarm入門(二)配置選項與基本執行環境要求
Docker Swarm叢集執行環境的最低要求
建立基本的Docker Swarm叢集對執行環境的要求並不是很高。事實上,我們可以將Swarm守護程式執行在現有的Docker主機上,使其在不新增任何其他的硬體或虛擬資源的情況下就能夠直接執行,這種方式絕對是可行的(也許不是最好的做法)。此外,在執行最基本的Docker Swarm叢集的過程中,在基於發現機制識別檔案或節點的時候,並不需要新增其他的基礎設施(當然除了Docker本身)。
我個人認為在另一臺伺服器上執行Swarm master服務本身是一個不錯的想法。該伺服器並不需要大量的資源,但它卻需要用很多的檔案描述符來處理所有的TCP流量的輸入和輸出。在下面例子中,我會使用dockerswarm01
來作為專用的Swarm master服務。
配置選項
在預設情況下Swarm有各種各樣的配置,當涉及到執行守護程式及其配套的基礎設施時,配置過程的靈活性就變得很強。下面列出了不同類別的配置選項以及它們是如何進行配置的。
發現服務
Swarm使用的發現服務是一種維護叢集狀態的機制。它可以與各種後端服務協同工作,基本的工作流程都是一致的,都涉及到以下的概念:
- 後端服務維護著Docker結點的列表,這些服務應該是叢集的一部分。
- 通過節點的列表,Swarm 會檢查每一個結點的健康狀況並且跟蹤進出叢集的節點。
節點發現
節點發現僅需要通過命令列來完成。這是最基本的發現機制型別,它並不需要對配置檔案或者其他相關內容進行維護。Swarm守護程式使用節點發現的啟動命令會是這樣:
swarm manage --discovery dockerhost01:2375,dockerhost02:2375,dockerhost03:2375 -H=0.0.0.0:2375
檔案發現
檔案發現利用放置在檔案系統中 (例如:/etc/swarm/cluster_config)的配置檔案,使用<IP>:<Port>
的格式來列出叢集中的Docker主機。雖然該列表是靜態的,但是通過健康檢查服務仍然可以確定健康和不健康的節點,並且可以過濾對不健康的節點請求。基於檔案發現的啟動命令和配置檔案的例子如下:
sswarm manage --discovery file:///etc/swarm/cluster_config -H=0.0.0.0:2375
#/etc/swarm/cluster_config dockerhost01:2375 dockerhost02:2375 dockerhost03:2375
Consul發現
Docker Swarm也支援Consul發現。它的工作原理是利用Consul的鍵值儲存,來維護構成叢集的伺服器的<IP>:<Port>
列表。在這種配置模式下,每個Docker主機會以join模式執行一個Swarm守護程式,並且指向Consul叢集的HTTP介面(進行服務註冊)。這樣的操作使Docker主機的配置、執行以及安全維護產生了一定的開銷,但開銷並不大。Swarm客戶端將會進行這樣的操做:
swarm join --discovery consul://consulhost01/swarm # This can be an internal IP as long as the other # Docker hosts can reach it. --addr=10.100.199.200:2375
之後Swarm master會從Consul服務中讀取主機列表,它以這樣的方式執行:
swarm manage --discovery consul://consulhost01/swarm -H=0.0.0.0:2375
這些基於鍵/值的基本配置模式會引發一個問題:Swarm叢集的健康狀況檢查服務如何與Swarm客戶端(在 join模式下)協同工作?由於通過鍵/值儲存的列表本身就是動態的,它是否需要運內部Swarm健康檢查服務呢?我對相關的功能並不熟悉,所以不妄加評論,但這個問題應該引起注意。
EtcD發現
EtcD發現的工作方式與Consul發現大致相同。叢集中的每個Docker主機會以join模式執行一個Swarm守護程式,並指向一個EtcD的終端(endpoint)。這樣EtcD可以通過心跳檢測來維護一個記錄叢集中活躍伺服器(active servers)的列表。一個執行有標準Docker守護程式的Docker主機會同時執行一個具有類似配置Swarm的客戶端:
swarm join --discovery etcd://etcdhost01/swarm --addr=10.100.199.200:2375
通過以下命令,Docker Swarm master 服務會連線EtcD,搜尋所提供的路徑資訊並且成節點列表:
swarm manage --discovery etcd://etcdhost01/swarm -H=0.0.0.0:2375
Zookeeper發現
Zookeeper發現模式與其他基於鍵/值對儲存的配置模式類似。一個ZK集合被建立之後用於儲存主機資訊列表同時還有一個與Docker一起執行的客戶端,這個客戶端可以向鍵/值儲存服務傳送心跳檢測資訊,幾乎可以實時地維護列表。Swarm master也會連線到ZK集合並使用/swarm
路徑下的的資訊來維護主機列表(之後會進行健康檢測)。
Swarm客戶端(與Docker一起):
swarm join # All hosts in the ensemble should be listed --discovery zk://zkhost01,zkhost02,zkhost03/swarm --addr=10.100.199.200
Swarm Master:
swarm manage --discovery zk://zkhost01,zkhost02,zkhost03/swarm -H 0.0.0.0:2375
Hosted Token Based Discovery (預設)
我還沒有使用過這個功能,在這點上沒有多少可以總結的。
排程
排程機制的主要功能是選擇在哪個伺服器上建立並啟動一個容器。它是由一個裝箱演算法(packing algorithm)和過濾器(或標籤)組合而成。每個Docker守護程式啟動的時候都帶著一組標籤,像以下這樣:
docker -d --label storage=ssd --label zone=external --label tier=data -H tcp://0.0.0.0:2375
然後,當開啟一個Docker容器時,Swarm將基於過濾器選擇一組伺服器,然後根據排程機制來分配每次執行的命令。過濾器會告訴Swarm哪些伺服器上的容器是可用的或是不可用的,之後排程器會把命令分發到可用的伺服器上。以下是幾個過濾機制:
- 約束(Constraint) 這是利用了一個Docker守護程式開始的標籤。目前,它只支援`=`,(譯註:官方doc裡是`==`,請讀者遵循最新的官方doc)但在將來它可能支援`!=`。節點必須符合所有的由容器提供的約束以便能進行匹配排程。比如按照下面的例子來開啟有一些約束的容器:
docker run -d -P -e constraint:storage=ssd -e constraint:zone=external -t nginx
- 類同(Affinity )
類同可以以兩種方式工作:容器類同或映象類同。為了在同一臺主機上啟動兩個容器可以執行以下命令:docker run -d -P --name nginx -t nginx docker run -d -P --name mysql -e affinity:container=nginx -t mysql
由於Swarm並沒有對映象進行管理,設定類同映象也是可行的。這意味著一個容器僅能在已包含映象的節點上啟動。這就避免了在開啟一個容器之前需要在後臺等待拉取映象的過程。舉個例子:
docker run -d -P --name nginx -e affinity:image=nginx -t nginx
- 埠(Port) 埠過濾可以防止在同一主機上任意兩個具有相同靜態埠對映的容器啟動。這樣做的意義很大,你不能重複在Docker主機上埠對映。例如,兩個節點以
-p 80:80
開啟不會被允許在同一Docker主機上執行。 - 健康狀況(Healthy) 它阻止了對不健康節點進行排程。
一旦Swarm將主機列表限制在一組符合上述條件的節點上,它就會讓對容器進行排程,從以上結點中選出一個,在上面建立並啟動容器。目前以下排程是器內建的:
- 隨機分配(Random) 將容器隨機分佈在可用的結點上。
- 裝箱(Binpacking) 用容器將節點填滿(每個容器得到的資源固定),然後再移動到下一個節點。如果在執行時需要動態地給容器分配資源,採用這個策略可能會使過程變得更復雜。這意味著即使為每個容器的記憶體和CPU設定上限,也並不能保證執行期間一切正常。我個人比較喜歡讓容器彼此之間競爭,看哪個容器能得到資源。
還有一些其他的排程機制正在開發中,比如平衡策略以及新增Apache Mesos的特性。
TLS(傳輸層安全協議Transport Layer Security)
令人高興的是,Swarm可以在TLS啟用下執行。這使得客戶端、Swarm守護程式以及Docker守護程式之間的互動變更安全。這是一件好事,因為在我研究安全方面的夥伴看來,在網路中並沒有邊界。
為了實現以上目標,需要一個包含CA的完整PKI,但我有個解決辦法,在另一篇已釋出的文章裡會提到,它是如何為Docker與Swarm產生所需的TLS證書。
按照上面部落格中的內容,一旦證書生成並安裝,Docker與Swarm守護程式就可以進行如下操作:
Docker:
docker -d --tlsverify --tlscacert=/etc/pki/tls/certs/ca.pem --tlscert=/etc/pki/tls/certs/dockerhost01-cert.pem --tlskey=/etc/pki/tls/private/dockerhost01-key.pem -H tcp://0.0.0.0:2376
Swarm master:
swarm manage --tlsverify --tlscacert=/etc/pki/tls/certs/ca.pem --tlscert=/etc/pki/tls/certs/swarm-cert.pem --tlskey=/etc/pki/tls/private/swarm-key.pem --discovery file:///etc/swarm_config -H tcp://0.0.0.0:2376
然後客戶端必須知道連線TLS。以下是環境變數設定:
export DOCKER_HOST=tcp://dockerswarm01:2376 export DOCKER_CERT_PATH="`pwd`" export DOCKER_TLS_VERIFY=1
這樣你就設定好了TLS。
還有更多精彩內容!
當涉及到複雜的叢集軟體的配置時,還有很多內容可以討論,但我覺得對於一個概述性的介紹來說,以上內容已經足夠,這可以讓你設定、執行並思考如何配置你的Swarm叢集。下一篇部落格中我會介紹關與Swarm叢集架構的一些例子。敬請關注,並歡迎在下面發表評論!
所有這些在博文背後的研究能成為可能歸功於我工作的公司: Rally Software in Boulder, CO.。每季度我們至少有一個駭客周,它使我們能夠研究很棒的東西,像Docker Swarm。如果您想切入正題,直接開始Vagrant 例子,這裡有一個repo,它是我在2014年Q1駭客周研究的成果:
原文連結:Intro to Docker Swarm: Part 2 – Configuration Options and Requirements (翻譯:田浩浩審校:王哲)
===========================
譯者介紹
田浩浩,悉尼大學USYD碩士研究生,目前在珠海從事Android應用開發工作。業餘時間專注Docker的學習與研究,希望通過DockerOne把最新最優秀的譯文貢獻給大家,與讀者一起暢遊Docker的海洋。
相關文章
- gitbook 入門教程之環境要求Git
- Java執行環境配置Java
- 執行PbootCMS系統有哪些環境要求?boot
- Docker 入門(Mac環境)-part 1 入門基本操作DockerMac
- PageAdmin CMS 環境配置要求
- 手摸手帶你入門ionic3(二):環境配置
- JavaScript執行環境與執行棧JavaScript
- 開發環境配置pyenv快速入門開發環境
- fn project 執行時配置選項Project
- SpringMVC入門與環境搭建SpringMVC
- Servlet入門二:Tomcat安裝與執行ServletTomcat
- eclipse配置遠端執行環境Eclipse
- OpenCV入門:環境配置與測試(VS2017)OpenCV
- 新手入門經典:Jsp環境配置JS
- Flutter入門教程(二)開發環境搭建Flutter開發環境
- Zookeeper入門:基本概念、5項配置、啟動
- linux登入bash shell環境執行環境變數Linux變數
- FreaMarker入門教程,環境整合到使用例項
- Mac 基本開發環境配置Mac開發環境
- 一、Flutter初始入門構建window環境,並且執行helloWorldFlutter
- Golang入門(1):安裝與配置環境變數的意義Golang變數
- Apache Thrift 配置環境和執行(Linux)ApacheLinux
- Ubuntu 16.04 + PyCharm + spark 執行環境配置UbuntuPyCharmSpark
- Linux & Windows 環境下 RabbitMQ 安裝與基本配置LinuxWindowsMQ
- Linux & Windows 環境下 Redis 安裝與基本配置LinuxWindowsRedis
- VScode中配置C++執行環境VSCodeC++
- 配置Linux+Nginx+PHP+MySQL執行環境LinuxNginxPHPMySql
- apache2.4配置Django1.7執行環境ApacheDjango
- Apache+PHP配置執行環境(getenv的使用)ApachePHP
- scrapy入門教程1:scrapy環境配置以及安裝
- 【Hibernate】—Hibernate+mysql 環境搭建+入門例項MySql
- vue入門(安裝環境與搭建專案)Vue
- (二) electron 開發環境配置開發環境
- Mac 配置 Flutter 環境,執行 iOS Android 兩端MacFlutteriOSAndroid
- 壓測工具之JMeter之環境配置及執行JMeter
- CLion和WSL配置MPI執行及除錯環境除錯
- JDK20安裝+環境配置+編譯執行JDK編譯
- MySQL Proxy應用入門(2)--MySQL Proxy配置選項MySql