摘要:本文將以多主機(jī)網(wǎng)絡(luò)環(huán)境為基礎(chǔ),探討如何利用內(nèi)置編排工具模式對(duì)各主機(jī)上的容器加以管理。在本文中,我們將立足于臺(tái)主機(jī)與在負(fù)載均衡之上部署應(yīng)用程序容器,同時(shí)將其接入一套覆蓋網(wǎng)絡(luò)。管理節(jié)點(diǎn)會(huì)利用負(fù)載均衡以將服務(wù)公布至集群之外。
Docker Engine – Swarm模式本文將以多主機(jī)網(wǎng)絡(luò)環(huán)境為基礎(chǔ),探討如何利用內(nèi)置編排工具 Docker Swarm模式對(duì)各主機(jī)上的容器加以管理。
在多臺(tái)主機(jī)之上運(yùn)行MySQL容器擁有一定程度的復(fù)雜性,而具體水平則取決于您所選擇的集群技術(shù)。
在嘗試?yán)萌萜骷佣嘀鳈C(jī)網(wǎng)絡(luò)運(yùn)行MySQL之前,我們首先需要理解鏡像的起效原理、各資源的分配方式(包括磁盤、內(nèi)存與CPU)、網(wǎng)絡(luò)(覆蓋網(wǎng)絡(luò)驅(qū)動(dòng)因素,默認(rèn)情況下包括flannel與weave等)以及容錯(cuò)機(jī)制(容器如何實(shí)現(xiàn)重新定位、故障轉(zhuǎn)移以及負(fù)載均衡等)。
這一切都會(huì)給數(shù)據(jù)庫的整體運(yùn)行、正常運(yùn)行時(shí)間以及性能表現(xiàn)造成影響。我們建議大家使用編排工具保證Docker引擎集群擁有更出色的可管理性與可擴(kuò)展性。最新的Docker Engine(版本為1.12,發(fā)布于2016年7月14日)當(dāng)中包含有Swarm模式,專門用于以原生方式管理名為Swarm的Docker Engine集群。
需要注意的是,Docker Engine Swarm模式與Docker Swarm是兩個(gè)不同的項(xiàng)目,二者雖然工作原理類似,但卻擁有不同的安裝步驟。
下面我們來看看著手進(jìn)行之前,首先需要完成的準(zhǔn)備工作:
必須首先打開以下端口:
2377 (TCP) – 集群管理
7946 (TCP 與UDP) – 節(jié)點(diǎn)通信
4789 (TCP與UDP) – 覆蓋網(wǎng)絡(luò)流量
節(jié)點(diǎn)類型分為2種:
管理節(jié)點(diǎn) - 管理節(jié)點(diǎn)負(fù)責(zé)執(zhí)行維護(hù)Swarm必要狀態(tài)所必需的編排與集群管理功能。管理節(jié)點(diǎn)會(huì)選擇單一主管理方執(zhí)行編排任務(wù)。
工作節(jié)點(diǎn) - 工作節(jié)點(diǎn)負(fù)責(zé)從管理節(jié)點(diǎn)處接收并執(zhí)行各項(xiàng)任務(wù)。在默認(rèn)情況下,管理節(jié)點(diǎn)本身同時(shí)也作為工作節(jié)點(diǎn)存在,但大家可以通過配置保證其僅執(zhí)行管理任務(wù)。
在本文中,我們將立足于3臺(tái)Docker主機(jī)(docker1、docker2與docker3)在負(fù)載均衡Galera Cluster之上部署應(yīng)用程序容器,同時(shí)將其接入一套覆蓋網(wǎng)絡(luò)。我們將利用Docker Engine Swarm模式作為編排工具。
集群構(gòu)建首先讓我們將Docker節(jié)點(diǎn)納入Swarm集群當(dāng)中。Swarm模式要求利用奇數(shù)臺(tái)管理節(jié)點(diǎn)(當(dāng)然不止一臺(tái))以維持容錯(cuò)能力。因此,我們在這里需要讓三臺(tái)節(jié)點(diǎn)全部作為管理節(jié)點(diǎn)。需要注意的是,在默認(rèn)情況下,管理節(jié)點(diǎn)同時(shí)亦作為工作節(jié)點(diǎn)。
首先在docker1上對(duì)Swarm模式進(jìn)行初始化。完成之后,該節(jié)點(diǎn)將成為管理節(jié)點(diǎn)及當(dāng)前管理方:
[root@docker1]$ docker swarm init --advertise-addr 192.168.55.111
Swarm initialized: current node (6r22rd71wi59ejaeh7gmq3rge) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-dzvgu0h3qngfgihz4fv0855bo 192.168.55.111:2377
To add a manager to this swarm, run "docker swarm join-token manager" and follow the instructions.
我們還需要將其它兩個(gè)節(jié)點(diǎn)添加為管理節(jié)點(diǎn)。使用join命令將這兩臺(tái)節(jié)點(diǎn)注冊為管理節(jié)點(diǎn):
[docker1]$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-7fd1an5iucy4poa4g1bnav0pt 192.168.55.111:2377
在docker2與docker3上,運(yùn)行以下命令以進(jìn)行節(jié)點(diǎn)注冊:
$ docker swarm join
--token SWMTKN-1-16kit6dksvrqilgptjg5pvu0tvo5qfs8uczjq458lf9mul41hc-7fd1an5iucy4poa4g1bnav0pt 192.168.55.111:2377
驗(yàn)證是否全部節(jié)點(diǎn)都已經(jīng)正確添加:
[docker1]$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
5w9kycb046p9aj6yk8l365esh docker3.local Ready Active Reachable
6r22rd71wi59ejaeh7gmq3rge * docker1.local Ready Active Leader
awlh9cduvbdo58znra7uyuq1n docker2.local Ready Active Reachable
到這里,我們的docker1.local作為主管理節(jié)點(diǎn)。
覆蓋網(wǎng)絡(luò)要讓不同主機(jī)之上的運(yùn)行的容器彼此實(shí)現(xiàn)對(duì)接,惟一的方式就是使用覆蓋網(wǎng)絡(luò)。大家可以將其視為一套構(gòu)建于另一網(wǎng)絡(luò)(在本示例中為物理主機(jī)網(wǎng)絡(luò))之上的容器網(wǎng)絡(luò)。Docker Swarm模式提供一套默認(rèn)覆蓋網(wǎng)絡(luò),其負(fù)責(zé)配合libnetwork與libkv實(shí)現(xiàn)一套基于VxLAN的解決方案。當(dāng)然,大家也可以選擇Flannel、Calico或者Weave等其它覆蓋網(wǎng)絡(luò)驅(qū)動(dòng)方案,但需要執(zhí)行額外的安裝步驟。
在Docker Engine Swarm模式當(dāng)中,大家可以單純立足管理節(jié)點(diǎn)創(chuàng)建一套覆蓋網(wǎng)絡(luò),而且其不需要etcd、consul或者Zookeeper等額外的鍵值存儲(chǔ)機(jī)制。
這套Swarm僅為集群內(nèi)的各節(jié)點(diǎn)提供覆蓋網(wǎng)絡(luò)。當(dāng)大家創(chuàng)建一項(xiàng)需要用到覆蓋網(wǎng)絡(luò)的服務(wù)時(shí),管理節(jié)點(diǎn)會(huì)自動(dòng)將覆蓋網(wǎng)絡(luò)延伸至運(yùn)行該服務(wù)任務(wù)的節(jié)點(diǎn)處。
下面讓我們?yōu)楦魅萜鲃?chuàng)建一套覆蓋網(wǎng)絡(luò)。在這里,我們需要將Percona XtraDB集群與應(yīng)用程序容器分別部署在各Docker主機(jī)之上,用以實(shí)現(xiàn)容錯(cuò)性。這些容器必須運(yùn)行在同一覆蓋網(wǎng)絡(luò)當(dāng)中,從而確保其能夠彼此通信。
這里我們將網(wǎng)絡(luò)命名為“mynet”。大家只能在管理節(jié)點(diǎn)上完成這一創(chuàng)建工作:
[docker1]$ docker network create --driver overlay mynet
下面來看我們的現(xiàn)有網(wǎng)絡(luò):
[docker1]$ docker network ls NETWORK ID NAME DRIVER SCOPE 213ec94de6c9 bridge bridge local bac2a639e835 docker_gwbridge bridge local 5b3ba00f72c7 host host local 03wvlqw41e9g ingress overlay swarm 9iy6k0gqs35b mynet overlay swarm 12835e9e75b9 none null local
現(xiàn)在Swarm當(dāng)中擁有2套覆蓋網(wǎng)絡(luò)。其中“mynet”網(wǎng)絡(luò)正是我們在部署容器時(shí)所創(chuàng)建的成果。而ingress覆蓋網(wǎng)絡(luò)則為默認(rèn)提供。Swarm管理節(jié)點(diǎn)會(huì)利用ingress負(fù)載均衡以將服務(wù)公布至集群之外。
利用服務(wù)與任務(wù)實(shí)現(xiàn)部署接下來我們將通過服務(wù)與任務(wù)進(jìn)行Galera集群容器部署。當(dāng)大家創(chuàng)建一項(xiàng)服務(wù)時(shí),需要指定使用哪套容器鏡像并在容器內(nèi)執(zhí)行哪些命令。服務(wù)類型共分為兩種:
復(fù)制服務(wù)——將一系列復(fù)制任務(wù)分發(fā)至各節(jié)點(diǎn)當(dāng)中,具體取決于您所需要的設(shè)置狀態(tài),例如“——replicas 3”。
全局服務(wù)——適用于集群內(nèi)全部可用節(jié)點(diǎn)上的服務(wù)任務(wù),例如“——mode global”。如果大家在Swarm集群中設(shè)有7臺(tái)Docker節(jié)點(diǎn),則全部節(jié)點(diǎn)之上都將存在對(duì)應(yīng)容器。
Docker Swarm模式在管理持久數(shù)據(jù)存儲(chǔ)方面功能有限。當(dāng)一臺(tái)節(jié)點(diǎn)發(fā)生故障時(shí),管理節(jié)點(diǎn)會(huì)繞過各相關(guān)容器并創(chuàng)建新容器,用于繼續(xù)保持原有運(yùn)行狀態(tài)。由于容器在下線后會(huì)被丟棄,因此我們會(huì)失去其中的全部數(shù)據(jù)分卷。幸運(yùn)的是,Galera集群允許各MySQL容器以自動(dòng)方式在加入時(shí)利用狀態(tài)/數(shù)據(jù)接受配置。
部署鍵-值存儲(chǔ)我們在這里使用的docker鏡像為Percona-Lab。這套鏡像要求各MySQL容器訪問一套鍵-值存儲(chǔ)(僅支持etcd)以實(shí)現(xiàn)集群初始化與引導(dǎo)過程中的IP地址發(fā)現(xiàn)。各容器將在etcd當(dāng)中搜索其它IP地址,從而利用正確的wsrep_cluster_address完成MySQL啟動(dòng)。否則,首套容器將使用gcomm://作為引導(dǎo)地址。
首先部署我們的etcd服務(wù)。大家可以點(diǎn)擊此處獲取我們使用的etcd鏡像。其要求我們根據(jù)所需部署的etcd節(jié)點(diǎn)數(shù)量使用一條發(fā)現(xiàn)URL。在這種情況下,我們需要設(shè)置多帶帶的etcd容器,其具體命令為:
[docker1]$ curl -w " " "https://discovery.etcd.io/new?size=1" https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68
在此之后,使用生成的URL作為“-discovery”值,同時(shí)為etcd創(chuàng)建該服務(wù):
[docker1]$ docker service create --name etcd --replicas 1 --network mynet -p 2379:2379 -p 2380:2380 -p 4001:4001 -p 7001:7001 elcolio/etcd:latest -name etcd -discovery=https://discovery.etcd.io/a293d6cc552a66e68f4b5e52ef163d68
到這里,Docker Swarm模式將編排其中一臺(tái)Docker主機(jī)上的容器部署工作。
檢索etcd服務(wù)虛擬IP地址。我們需要在下一步部署集群時(shí)使用此IP地址:
[docker1]$ docker service inspect etcd -f "{{ .Endpoint.VirtualIPs }}" [{03wvlqw41e9go8li34z2u1t4p 10.255.0.5/16} {9iy6k0gqs35bn541pr31mly59 10.0.0.2/24}]
到這里,我們的架構(gòu)如下圖所示:
部署數(shù)據(jù)庫集群
利用以下命令為etcd指定虛擬IP地址,用于部署Galera(Percona XtraDB集群)容器:
[docker1]$ docker service create
--name mysql-galera
--replicas 3
-p 3306:3306
--network mynet
--env MYSQL_ROOT_PASSWORD=mypassword
--env DISCOVERY_SERVICE=10.0.0.2:2379
--env XTRABACKUP_PASSWORD=mypassword
--env CLUSTER_NAME=galera
perconalab/percona-xtradb-cluster:5.6
整個(gè)部署流程需要耗費(fèi)一段時(shí)間,包括將鏡像下載至對(duì)應(yīng)的工作/管理節(jié)點(diǎn)。大家可以使用以下命令驗(yàn)證其部署狀態(tài):
[docker1]$ docker service ps mysql-galera
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
8wbyzwr2x5buxrhslvrlp2uy7 mysql-galera.1 perconalab/percona-xtradb-cluster:5.6 docker1.local Running Running 3 minutes ago
0xhddwx5jzgw8fxrpj2lhcqeq mysql-galera.2 perconalab/percona-xtradb-cluster:5.6 docker3.local Running Running 2 minutes ago
f2ma6enkb8xi26f9mo06oj2fh mysql-galera.3 perconalab/percona-xtradb-cluster:5.6 docker2.local Running Running 2 minutes ago
可以看到,mysql-galera服務(wù)目前已經(jīng)開始運(yùn)行。下面列出全部現(xiàn)有服務(wù):
[docker1]$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
1m9ygovv9zui mysql-galera 3/3 perconalab/percona-xtradb-cluster:5.6
au1w5qkez9d4 etcd 1/1 elcolio/etcd:latest -name etcd -discovery=https://discovery.etcd.io/a29...
Swarm模式包含一項(xiàng)內(nèi)部DNS組件,其負(fù)責(zé)自動(dòng)為Swarm中的每項(xiàng)服務(wù)分配一條DNS入口。因此,大家可以使用該服務(wù)名稱以解析至對(duì)應(yīng)的虛擬IP地址:
[docker2]$ docker exec -it $(docker ps | grep etcd | awk {"print $1"}) ping mysql-galera
PING mysql-galera (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.078 ms
64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.179 ms
或者直接使用“docker service inspect”命令檢索該虛擬IP地址:
[docker1]# docker service inspect mysql-galera -f "{{ .Endpoint.VirtualIPs }}" [{03wvlqw41e9go8li34z2u1t4p 10.255.0.7/16} {9iy6k0gqs35bn541pr31mly59 10.0.0.4/24}]
到這里,我們的架構(gòu)如下圖所示:
部署應(yīng)用程序最后,大家可以創(chuàng)建應(yīng)用程序服務(wù)并將MySQL服務(wù)名稱(mysql-galera)作為數(shù)據(jù)庫主機(jī)值進(jìn)行交付:
[docker1]$ docker service create --name wordpress --replicas 2 -p 80:80 --network mynet --env WORDPRESS_DB_HOST=mysql-galera --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=mypassword wordpress
部署完成之后,我們隨后能夠通過“docker service inspect”命令檢索wordpress服務(wù)的虛擬IP地址:
[docker1]# docker service inspect wordpress -f "{{ .Endpoint.VirtualIPs }}" [{p3wvtyw12e9ro8jz34t9u1t4w 10.255.0.11/16} {kpv8e0fqs95by541pr31jly48 10.0.0.8/24}]
現(xiàn)在再來看目前的架構(gòu)示意圖:
我們的分布式應(yīng)用程序與數(shù)據(jù)庫設(shè)置已經(jīng)由Docker容器部署完成。
到這里,以下端口都已經(jīng)在集群中的全部Docker節(jié)點(diǎn)上被打開(基于每條“docker service create”命令上的-p標(biāo)記),而無論各節(jié)點(diǎn)目前是否正在運(yùn)行該服務(wù)任務(wù):
etcd - 2380, 2379, 7001, 4001
MySQL - 3306
HTTP - 80
如果我們直接利用簡單循環(huán)接入PublishedPort,則可看到MySQL服務(wù)已經(jīng)在各容器之上實(shí)現(xiàn)負(fù)載均衡:
[docker1]$ while true; do mysql -uroot -pmypassword -h127.0.0.1 -P3306 -NBe "select @@wsrep_node_address"; sleep 1; done 10.255.0.10 10.255.0.8 10.255.0.9 10.255.0.10 10.255.0.8 10.255.0.9 10.255.0.10 10.255.0.8 10.255.0.9 10.255.0.10 ^C
現(xiàn)在,Swarm管理節(jié)點(diǎn)負(fù)責(zé)負(fù)載均衡的內(nèi)部管理,而且我們無法配置該負(fù)載均衡算法。在此之后,我們可以利用外部負(fù)載均衡器將外部流量路由至各Docker節(jié)點(diǎn)當(dāng)中。一旦任何Docker節(jié)點(diǎn)發(fā)生故障,該服務(wù)將被重新定位至其它可用節(jié)點(diǎn)。
作者:Severalnines
原文鏈接:
http://severalnines.com/blog/...
基于最新 Docker SwarmKit 技術(shù)的數(shù)人云容器管理面板Crane發(fā)布新版本啦,點(diǎn)擊下方了解更多:
十一生快!數(shù)人云開源項(xiàng)目Crane攜新版本獻(xiàn)禮啦
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26728.html
摘要:由于沒有了中心化的負(fù)載均衡器,集群不會(huì)因某臺(tái)機(jī)器異常而導(dǎo)致整個(gè)服務(wù)對(duì)外不可用,很好的避免了單點(diǎn)問題,同時(shí)也帶了可擴(kuò)展性。 Mesos/Marathon 折騰久了,我們一直希望有機(jī)會(huì)深入到 Swarm 內(nèi)部一探究竟。 另外, Mesos 這一套東西雖然是久經(jīng)企業(yè)級(jí)考驗(yàn)的, 但是安裝、部署和使用相對(duì)復(fù)雜,上手有門檻。同時(shí),在今年的 DockerCon 上,內(nèi)置了Swarm 功能的 Dock...
摘要:后續(xù)將其他節(jié)點(diǎn)加入集群都會(huì)用到這個(gè)值將節(jié)點(diǎn)加入集群查看節(jié)點(diǎn)信息相關(guān)命令創(chuàng)建服務(wù)更新服務(wù)刪除服務(wù)減少服務(wù)實(shí)例增加服務(wù)實(shí)例查看所有服務(wù)查看服務(wù)的容器狀態(tài)查看服務(wù)的詳細(xì)信息。前言本篇是Docker第十三篇,Docker的使用至此就介紹完成,接下來繼續(xù)Kubernetes。Docker系列文章:為什么要學(xué)習(xí)DockerDocker基本概念Docker鏡像基本原理Docker容器數(shù)據(jù)卷Dockerfi...
摘要:本文主要和大家分享下容器技術(shù)和頂象風(fēng)控系統(tǒng)私有化部署的優(yōu)勢以及容器技術(shù)在頂象內(nèi)部的應(yīng)用實(shí)踐。容器技術(shù)在頂象內(nèi)部的應(yīng)用目前容器技術(shù)已在頂象內(nèi)部大規(guī)模推行,所有應(yīng)用均通過容器實(shí)現(xiàn)部署交付與更新。 頂象全景式業(yè)務(wù)安全風(fēng)控體系基于新一代風(fēng)控體系構(gòu)建,并采用Docker技術(shù)進(jìn)行私有云和公有云部署。本文主要和大家分享下Docker容器技術(shù)和頂象風(fēng)控系統(tǒng)私有化部署的優(yōu)勢以及Docker容器技術(shù)在頂象...
閱讀 4727·2021-11-18 13:23
閱讀 905·2021-09-22 15:24
閱讀 1929·2021-09-06 15:00
閱讀 2634·2021-09-03 10:30
閱讀 1289·2021-09-02 15:15
閱讀 2079·2019-08-30 15:54
閱讀 3038·2019-08-30 15:44
閱讀 1460·2019-08-29 15:12