×

docker集群化自建方案有哪些?

分類(lèi):云服務(wù)資訊 編輯: 瀏覽量:100
2021-07-23 15:04:36

??俗話說(shuō)雞蛋不要都放在一個(gè)籃子里面,把各種集群的節(jié)點(diǎn)拆分部署,應(yīng)該把各種節(jié)點(diǎn)分機(jī)器部署,多個(gè)宿主機(jī)這樣部署。在自建集群之前,由于不同應(yīng)用的依賴環(huán)境千差萬(wàn)別,每添加一個(gè)應(yīng)用,不得不考慮主機(jī)上的現(xiàn)有環(huán)境和已經(jīng)在跑的服務(wù),而且部署和測(cè)試也是比較繁瑣,沒(méi)有辦法滿足我快速嘗試新點(diǎn)子的需求。而 Docker 恰好可以解決應(yīng)用部署的環(huán)境問(wèn)題,自建 Docker 集群可以充分利用我手上的閑置 VPS,并且提高應(yīng)用的可用性。下面就由新網(wǎng)小編和大家聊一聊docker集群化自建方案。


??一、硬件資源

??自建集群有 8 臺(tái) VPS,其中 4 臺(tái)性能比較好的 Vultr 中低配小雞,一臺(tái)騰訊云低配 VPS,一臺(tái)搬瓦工 CN2 小雞,一臺(tái) CloudCone 低配小雞,還有一臺(tái)朋友送的 VirMach 小雞。

??手上還有幾臺(tái)谷歌云服務(wù)器,不過(guò)考慮到用不長(zhǎng)久,而且流量貴,就沒(méi)在自建集群的考慮范圍內(nèi)。

??[root@ctrl-bwh-01 scripts]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION q0kllzk1ezr9h449cjatak17z GLBS-CC-01 Ready Active 18.09.5 ioacz1khl94m01wul1z70qatu * ctrl-bwh-01 Ready Active Reachable 18.09.5 1sj867qzlrgdp72705pcnvleb db-vultr-01 Ready Active 18.09.5 dua8lh9h6yt5b58jwwn5vtlu6 db-vultr-02 Ready Active 18.09.5 rk4newk0r7z51lvgjil564bar web-qq-01 Ready Active 18.09.5 xaq6d5n4kzcxj7phnvc32xw21 web-virmach-01 Ready Active 18.09.5 1e2a4scv0eskgq0og3xqpedco web-vultr-01 Ready Active Reachable 18.09.5 5jw8pe7vkzr2iwo3m1rrr1ef5 web-vultr-02 Ready Active Leader 18.09.5

??二、集群方案

??說(shuō)到 Docker 集群,一般都會(huì)提到鼎鼎有名的 k8s。而我覺(jué)得 k8s 太重了,我的眾多低配 VPS 跑 k8s 之后,能分配給應(yīng)用的資源就少得可憐,所以 k8s 是直接就被我 pass 掉的。

??雖然也有 k3s 之類(lèi)的輕量級(jí) k8s 解決方案,不過(guò)我還是選擇了原生的 docker swarm。VPS 安裝好 Docker 之后,不需要額外安裝軟件,就可以馬上建立集群。

??# 集群初始化,節(jié)點(diǎn)成為 manager 節(jié)點(diǎn) docker swarm init --advertise-addr=x.x.x.x # 集群丟失 Leader 時(shí),強(qiáng)制重建集群 docker swarm init --advertise-addr=x.x.x.x --force-new-cluster # 獲取作為 worker 節(jié)點(diǎn)加入集群的命令 docker swarm join-token worker # 獲取作為 manager 節(jié)點(diǎn)加入集群的命令 docker swarm join-token manager # 加入集群 docker swarm join --token xxx x.x.x.x:xxx --advertise-addr=x.x.x.x

??官方文檔中有提到,Docker 會(huì)自動(dòng)設(shè)置--advertise-addr,該參數(shù)非必填。不過(guò)根據(jù)個(gè)人經(jīng)驗(yàn)來(lái)看,還是強(qiáng)烈建議顯式指定該參數(shù),尤其當(dāng) VPS 有多個(gè)網(wǎng)卡時(shí)。

??三、統(tǒng)一的服務(wù)入口

??在集群內(nèi)部通過(guò)docker service create xxx的命令創(chuàng)建服務(wù)之后,如果有設(shè)置對(duì)外暴露端口,那么可以向集群中任意一臺(tái) VPS 的指定端口請(qǐng)求服務(wù)。

??手上的應(yīng)用還是 Web 應(yīng)用居多,而它們都需要 80 或 443 端口,為了讓它們都能正常提供服務(wù),集群需要一個(gè)統(tǒng)一的前端應(yīng)用提供負(fù)載均衡服務(wù),根據(jù)一定的規(guī)則(比如域名)轉(zhuǎn)發(fā)給后端應(yīng)用。

??雖然 nginx 也可以比較方便地實(shí)現(xiàn)負(fù)載均衡,但是我此處選用的是相對(duì)專(zhuān)業(yè)的、功能更完善的 traefik。traefik 提供服務(wù)自動(dòng)發(fā)現(xiàn)、HTTPS 證書(shū)自動(dòng)生成、服務(wù)監(jiān)測(cè)指標(biāo)數(shù)據(jù) 等功能,感興趣的同學(xué)可以前往官網(wǎng)了解詳情。

??Traefik 還提供了簡(jiǎn)易的 Web UI,可以看到當(dāng)前集群的服務(wù)數(shù)量和服務(wù)狀態(tài)。

??四、集群管理面板

??雖然可以登錄到 manager 節(jié)點(diǎn),敲命令行管理集群節(jié)點(diǎn)、服務(wù),但還是稍麻煩些,而且不太希望所有維護(hù)人員都有權(quán)限直接操作機(jī)器。

??可以管理 Docker Swarm 集群管理面板也不少,能入法眼的就 Rancher 和 Portainer,然而由于 Rancher 對(duì)宿主機(jī)配置要求比較高,消耗資源較多,我最終選擇了輕量級(jí)的 Portainer。

??Portainer 官網(wǎng)提供了比較多的管理方式,踩了比較多的坑之后,我采用的是 agent + portainer 這種方式。以 global 模式在每個(gè)節(jié)點(diǎn)部署 agent 服務(wù),portainer 部署時(shí)需要指定連接 agent 服務(wù)。欲知詳情,請(qǐng)看官方文檔。

??Portainer 還提供了服務(wù)更新的 WebHook,我現(xiàn)在的博客和部分站點(diǎn)的代碼倉(cāng)庫(kù)更新后,通過(guò)在 GitLab 設(shè)置的 CI-CD 配置,自動(dòng)打包鏡像,然后觸發(fā) WebHook 自動(dòng)更新,省時(shí)省力。

??當(dāng)然,Portainer 也是有不完善的地方,比如查看集群服務(wù)時(shí),會(huì)偶爾出現(xiàn)「無(wú)法連接」的報(bào)錯(cuò),而且不能連接數(shù)據(jù)庫(kù),所以部署 Portainer 服務(wù)時(shí),要限制它固定在某臺(tái)宿主機(jī)上。不然,會(huì)出現(xiàn)頻繁設(shè)置密碼等現(xiàn)象。

??五、監(jiān)控和告警系統(tǒng)

??traefik 提供的管理面板是非常簡(jiǎn)單的,僅能查看一些基礎(chǔ)數(shù)據(jù),比如某個(gè)服務(wù)有多少后端,整體的服務(wù)狀態(tài)。為了能夠定制化監(jiān)控集群中的服務(wù),并且在需要的時(shí)候觸發(fā)告警,讓物理人介入進(jìn)行維護(hù),需要一個(gè)監(jiān)控和告警系統(tǒng)。

??而 Grafana 恰好可以滿足需求,配合 Prometheus 以及 Prometheus 相關(guān)的 Exporter,一個(gè)五臟俱全的監(jiān)控告警系統(tǒng)呼之欲出。

??因?yàn)轵v訊云主機(jī)的帶寬極小、性能又比較一般,提供對(duì)外服務(wù)不太合適,為了充分利用資源,我便把監(jiān)控和告警系統(tǒng)相關(guān)的大多服務(wù)都部署在上面。本來(lái)還想搞一個(gè) ES 在騰訊上,無(wú)奈配置太低,只好作罷。

??有了監(jiān)控面板,可以清楚地知道具體服務(wù)的服務(wù)狀態(tài)和服務(wù)數(shù)據(jù)規(guī)律,下圖中的柱狀圖表示了以 5 分鐘為統(tǒng)計(jì)周期的「每秒處理請(qǐng)求數(shù)」。注:該面板的標(biāo)題Total requests over容易產(chǎn)生誤解。

??下圖是站點(diǎn)升級(jí)結(jié)束時(shí),Redis 的服務(wù)數(shù)據(jù)。一般情況下,Clients 會(huì)在 10 以下,當(dāng) Clients 飆升到 50 以上,就要額外關(guān)注站點(diǎn)的服務(wù)狀態(tài)。通過(guò)合理設(shè)置閾值,可以讓 Grafana 在超過(guò)閾值時(shí)發(fā)送告警通知,提醒維護(hù)人員對(duì)服務(wù)進(jìn)行擴(kuò)容等操作。

??原有服務(wù)都是單機(jī)部署,需要改造并打包 Docker 鏡像。改造難點(diǎn)其實(shí)在于持久化數(shù)據(jù)的存儲(chǔ)與讀寫(xiě),比如 Web 應(yīng)用的 Session 存儲(chǔ)、圖片存儲(chǔ)、附件存儲(chǔ)等。

??對(duì)于 Session 存儲(chǔ),可以搭建中心化的數(shù)據(jù)中心解決,或者是改用 token 方式進(jìn)行登錄驗(yàn)證。對(duì)于圖片存儲(chǔ)、附件存儲(chǔ),我的改造方案是,將全量數(shù)據(jù)存放在 BackBlaze 云存儲(chǔ)中,每個(gè)應(yīng)用按需從云存儲(chǔ)中心拉取數(shù)據(jù),并定期刪除冷門(mén)數(shù)據(jù)。小伙伴們要想獲得更多docker集群化的內(nèi)容,請(qǐng)關(guān)注新網(wǎng)!

聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)

送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)

需注明出處:新網(wǎng)idc知識(shí)百科

免費(fèi)咨詢獲取折扣

Loading