基於Docker的高可用解決方案
Docker從2013年釋出第一個版本以來,已經火遍全球,技術迭代也比較頻繁,其周邊產品和技術也越來越豐富。Docker的輕量級容器不僅實現了資源隔離,而且幾乎可以執行在任何地方,使得部署和擴充套件變得非常容易,隨著Docker的日趨完善,目前Docker已經被越來越多的公司應用到生產環境中。
Docker是一個由GO語言寫的程式執行的“容器”(Linux containers, LXCs);目前雲服務的基石是作業系統級別的隔離,在同一臺物理伺服器上虛擬出多個主機。Docker則實現了一種應用程式級別的隔離; 它改變我們基本的開發、操作單元,由直接操作虛擬主機(VM),轉換到操作程式執行的“容器”上來。
1、Docker:Docker daemon引擎。
2、consul:服務發現和配置共享的服務軟體。
3、swarm:基於Docker的叢集排程管理軟體,Docker 1.2版本中已經自動整合叢集功能了。
4、rethinkdb:RethinkDB是一個完全支援Memcached協議、資料可持久化的工業級key-value儲存系統,它自帶了cluster和web資源管理功能。
5、shipyard:Docker視覺化資源管理平臺
6、registrator:服務自動註冊
7、nginx:web服務代理軟體
8、consultemplate:Docker服務自動發現軟體,這個要結合nginx使用,當我們在宿主機上啟動一個容器服務時,這時候consultemplate就會自動從consul服務上發現在這個容器,並更新nginx配置檔案。
9、cadvisor:google公司開源的docker容器資源監控軟體
10、influxDB:InfluxDB是一個開源分散式時序、事件和指標資料庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分散式和水平伸縮擴充套件。
11、grafana:圖表展現服務,功能非常強大。
12、graylog+ Elasticsearch:具有報警選項的可插入日誌和事件分析伺服器。
三、安裝consul服務因為consul的高可用叢集最少需要3臺機器,但是這3臺,只要其中一臺故障這個consul的叢集就掛了,按官方的建 議最好5臺,這樣可以同時故障2臺。但是我為節省資源就用3臺。
3.1、master:10.2.0.80
docker run -d \\
-p 8300:8300 \\
-p 8301:8301 \\
-p 8301:8301/udp \\
-p 8302:8302 \\
-p 8302:8302/udp \\
-p 8400:8400 \\
-p 8500:8500 \\
-p 8600:53 \\
-p 53:53/udp \\
-v /opt/test/data/consul:/data \\
-h $HOSTNAME \\
--restart=always \\
--name=consul progrium/consul:latest -server -bootstrap -ui-dir=/ui -advertise 10.2.0.80 -client 0.0.0.0
解釋下各個引數:
-d容器在後臺執行, detached mode
--restart=always重啟模式, always 表示永遠。
-p 8400:8400對映 consul的 rpc 埠8400。
-p 8500:8500對映 UI 介面的埠8500。
-p 53/udp繫結udp 埠53(預設 DNS埠)在 Docker0 bridge 地址上。
-v /opt/test/data/consul:/data 這個把consul的資料檔案目錄掛載到宿主機上,這樣萬一容器重啟,資料就不會丟失。
3.2、slave1:10.2.0.77
docker run -d \\
-p 8300:8300 \\
-p 8301:8301 \\
-p 8301:8301/udp \\
-p 8302:8302 \\
-p 8302:8302/udp \\
-p 8400:8400 \\
-p 8500:8500 \\
-v /opt/test/data/consul:/data \\
-h $HOSTNAME \\
--restart=always \\
--name=consulprogrium/consul:latest\\
-server -join 10.2.0.80 -advertise 10.2.0.77 -client 0.0.0.0
3.3、slave2:10.2.0.134
docker run -d \\
-p 8300:8300 \\
-p 8301:8301 \\
-p 8301:8301/udp \\
-p 8302:8302 \\
-p 8302:8302/udp \\
-p 8400:8400 \\
-p 8500:8500 \\
-v /opt/test/data/consul:/data \\
-h $HOSTNAME \\
--restart=always \\
--name=consulprogrium/consul:latest\\
-server -join 10.2.0.80 -advertise 10.2.0.134 -client 0.0.0.0
這樣consul叢集服務已經安裝完成,進入10.2.0.80啟動的consul容器檢視一下consul的狀態
3.4、進入consul 容器
Docker exec -it d638539891e7 bash
#consul info //檢視consul狀態,看到leader = true和server=true說明整叢集狀態已經正常了。
agent:
check_monitors = 0
check_ttls = 0
checks = 0
services = 29
build:
prerelease =
revision = 9a9cc934
version = 0.5.2
consul:
bootstrap = true
known_datacenters = 1
leader = true
server = true
#consul members //
看到consul叢集已檢測到3臺server了,並且狀態都正常。
Node Address Status Type Build Protocol DC
10.2.0.80 10.2.0.80:8301 alive server 0.5.2 2 dc1
10.2.0.77 10.2.0.77:8301 alive server 0.5.2 2 dc1
10.2.0.134 10.2.0.134:8301 alive server 0.5.2 2 dc1
#現在就可以看到consul的web平臺了,http://10.2.0.80:8500/ui/#/dc1/services。
四、安裝swarm、shipyard管理平臺4.1、新增master:10.2.0.80節點
4.1.1、啟動容器shipyard-rethinkdb
docker run -it -d -p 8080:8080 -h $HOSTNAME -v /opt/test/data:/data --restart=always --name shipyard-rethinkdb rethinkdb:latest
引數解釋:
-v /opt/test/data:data把rethinkdb的資料目錄掛載到宿主機的/opt/test/data目錄下,這樣rethinkdb容器如果重啟,資料不會丟失。
-p 8080:8080 對映rethinkdb的 web UI埠,這樣可以看到rethinkdb的web視覺化資源管理平臺。
#為了增加rethinkdb的高可用,有條件的話可以把它做成一個cluster,具體參考https://github.com/dockerfile/rethinkdb。
4.1.2、啟動shipyard-proxy
docker run -ti -d -p 10.2.0.80:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy:latest
4.1.3、啟動shipyard-swarm-manager
docker run -ti -d --restart=always --name shipyard-swarm-manager registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 manage --replication --addr 10.2.0.80:3375 --host tcp://0.0.0.0:3375 consul://10.2.0.80:8500
4.1.4、啟動shipyard-swarm-agent
docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.80:2375 consul://10.2.0.80:8500
4.1.5、啟動shipyard-controller
docker run -it -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 80:8080 shipyard/shipyard:latest server -d tcp://swarm:3375
4.2、新增slave1:10.2.0.77節點
4.2.1、啟動shipyard-proxy
docker run -ti -d -p 10.2.0.77:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 registry.intra.test.com:5000/ops/shipyard-docker-proxy:v0.1
4.2.2、啟動shipyard-swarm-agent
docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.77:2375 consul://10.2.0.80:8500
4.2.3、新增registrator
registrator 是基於 Docker 的 sock 檔案來做服務發現的一個第三方的方案,有實力的公司也可以自已開發服務註冊agent。
docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip 10.2.0.77 consul://localhost:8500
引數解釋:
-v /var/run/docker.sock:/tmp/docker.sock對映 Docker 的 socket 到 container 中的對應位置,這樣 registration 就能監控有哪些服務啟動了。
registration 所屬的主機 IP, 一定要設定此屬性, 否則服務IP會顯示為127.0.0.1
consul://localhost:8500consul 繫結到本地的 consul 介面上。
4.3、新增slave1:10.2.0.134節點
4.3.1、啟動shipyard-proxy
docker run -ti -d -p 10.2.0.134:2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 registry.intra.test.com:5000/test/ops/shipyard-docker-proxy:v0.1
4.3.2、啟動shipyard-swarm-agent
docker run -ti -d --restart=always --name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 join --addr 10.2.0.134:2375 consul://10.2.0.80:8500
4.3.3、新增registrator
docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip 10.2.0.134 consul://localhost:8500
以上服務都啟動後就可以訪問shipyard的管理