??俗話說雞蛋不要都放在一個籃子里面,把各種集群的節點拆分部署,應該把各種節點分機器部署,多個宿主機這樣部署。在自建集群之前,由于不同應用的依賴環境千差萬別,每添加一個應用,不得不考慮主機上的現有環境和已經在跑的服務,而且部署和測試也是比較繁瑣,沒有辦法滿足我快速嘗試新點子的需求。而 Docker 恰好可以解決應用部署的環境問題,自建 Docker 集群可以充分利用我手上的閑置 VPS,并且提高應用的可用性。下面就由小編和大家聊一聊docker集群化自建方案。
![](/upload/ad_content/xuanchuantu-27.jpg)
我們是于2013年開始的成都網站建設公司,提供網站建設,電商網站設計開發,外貿網站制作,響應式網頁設計,微信小程序開發、等服務。為客戶創造有價值的品牌營銷體驗,讓互聯網提升企業的競爭力!
一、硬件資源
自建集群有 8 臺 VPS,其中 4 臺性能比較好的 Vultr 中低配小雞,一臺騰訊云低配 VPS,一臺搬瓦工 CN2 小雞,一臺 CloudCone 低配小雞,還有一臺朋友送的 VirMach 小雞。
手上還有幾臺谷歌,不過考慮到用不長久,而且流量貴,就沒在自建集群的考慮范圍內。
[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
二、集群方案
說到 Docker 集群,一般都會提到鼎鼎有名的 k8s。而我覺得 k8s 太重了,我的眾多低配 VPS 跑 k8s 之后,能分配給應用的資源就少得可憐,所以 k8s 是直接就被我 pass 掉的。
雖然也有 k3s 之類的輕量級 k8s 解決方案,不過我還是選擇了原生的 docker swarm。VPS 安裝好 Docker 之后,不需要額外安裝軟件,就可以馬上建立集群。
# 集群初始化,節點成為 manager 節點 docker swarm init --advertise-addr=x.x.x.x # 集群丟失 Leader 時,強制重建集群 docker swarm init --advertise-addr=x.x.x.x --force-new-cluster # 獲取作為 worker 節點加入集群的命令 docker swarm join-token worker # 獲取作為 manager 節點加入集群的命令 docker swarm join-token manager # 加入集群 docker swarm join --token xxx x.x.x.x:xxx --advertise-addr=x.x.x.x
官方文檔中有提到,Docker 會自動設置--advertise-addr,該參數非必填。不過根據個人經驗來看,還是強烈建議顯式指定該參數,尤其當 VPS 有多個網卡時。
三、統一的服務入口
在集群內部通過docker service create xxx的命令創建服務之后,如果有設置對外暴露端口,那么可以向集群中任意一臺 VPS 的指定端口請求服務。
手上的應用還是 Web 應用居多,而它們都需要 80 或 443 端口,為了讓它們都能正常提供服務,集群需要一個統一的前端應用提供負載均衡服務,根據一定的規則(比如)轉發給后端應用。
雖然 nginx 也可以比較方便地實現負載均衡,但是我此處選用的是相對專業的、功能更完善的 traefik。traefik 提供服務自動發現、HTTPS 證書自動生成、服務監測指標數據 等功能,感興趣的同學可以前往官網了解詳情。
Traefik 還提供了簡易的 Web UI,可以看到當前集群的服務數量和服務狀態。
四、集群管理面板
雖然可以登錄到 manager 節點,敲命令行管理集群節點、服務,但還是稍麻煩些,而且不太希望所有維護人員都有權限直接操作機器。
可以管理 Docker Swarm 集群管理面板也不少,能入法眼的就 Rancher 和 Portainer,然而由于 Rancher 對宿主機配置要求比較高,消耗資源較多,我最終選擇了輕量級的 Portainer。
Portainer 官網提供了比較多的管理方式,踩了比較多的坑之后,我采用的是 agent portainer 這種方式。以 global 模式在每個節點部署 agent 服務,portainer 部署時需要指定連接 agent 服務。欲知詳情,請看官方文檔。
Portainer 還提供了服務更新的 WebHook,我現在的博客和部分站點的代碼倉庫更新后,通過在 GitLab 設置的 CI-CD 配置,自動打包鏡像,然后觸發 WebHook 自動更新,省時省力。
當然,Portainer 也是有不完善的地方,比如查看集群服務時,會偶爾出現「無法連接」的報錯,而且不能連接數據庫,所以部署 Portainer 服務時,要限制它固定在某臺宿主機上。不然,會出現頻繁設置密碼等現象。
五、監控和告警系統
traefik 提供的管理面板是非常簡單的,僅能查看一些基礎數據,比如某個服務有多少后端,整體的服務狀態。為了能夠定制化監控集群中的服務,并且在需要的時候觸發告警,讓物理人介入進行維護,需要一個監控和告警系統。
而 Grafana 恰好可以滿足需求,配合 Prometheus 以及 Prometheus 相關的 Exporter,一個五臟俱全的監控告警系統呼之欲出。
因為騰訊的帶寬極小、性能又比較一般,提供對外服務不太合適,為了充分利用資源,我便把監控和告警系統相關的大多服務都部署在上面。本來還想搞一個 ES 在騰訊上,無奈配置太低,只好作罷。
有了監控面板,可以清楚地知道具體服務的服務狀態和服務數據規律,下圖中的柱狀圖表示了以 5 分鐘為統計周期的「每秒處理請求數」。注:該面板的標題Total requests over容易產生誤解。
下圖是站點升級結束時,Redis 的服務數據。一般情況下,Clients 會在 10 以下,當 Clients 飆升到 50 以上,就要額外關注站點的服務狀態。通過合理設置閾值,可以讓 Grafana 在超過閾值時發送告警通知,提醒維護人員對服務進行擴容等操作。
原有服務都是單機部署,需要改造并打包 Docker 鏡像。改造難點其實在于持久化數據的存儲與讀寫,比如 Web 應用的 Session 存儲、圖片存儲、附件存儲等。
對于 Session 存儲,可以搭建中心化的數據中心解決,或者是改用 token 方式進行登錄驗證。對于圖片存儲、附件存儲,我的改造方案是,將全量數據存放在 BackBlaze 中,每個應用按需從云存儲中心拉取數據,并定期刪除冷門數據。小伙伴們要想獲得更多docker集群化的內容,請關注創新互聯!
標題名稱:docker集群化自建方案有哪些?
網頁網址:http://vcdvsql.cn/article20/sdjhco.html
成都網站建設公司_創新互聯,為您提供服務器托管、虛擬主機、面包屑導航、營銷型網站建設、靜態網站、網站維護
廣告
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創新互聯