fbpx

用 Docker Swarm 部署你的雲服務 (概念篇)

實踐 DevOps 透過 Docker Swarm 管理 Container 集群

在前一篇廢文有討論過「開發環境建構」在敏捷開發中的重要性,在我們一開始對開發環境與服務進行 Dockerize 時,單機開發與測試環境下確實解決了環境一致性的問題,深深體會 Docker 的高度可攜性與專案快速切換等等特性。但是,當產品實際要部署到上線環境時,並不是像平常開發的單機架構,而是需要將服務部署到上百台 VM 中,而且常會遇到複雜的 Cluster Service 與分散式服務佈署架構,若是採用傳統的方式同時對許多 VM 進行 Docker 的升級與管理,不死也半條命,是有很大的困難。還好,有 Docker Swarm 專門應付 Docker Cluster 部署架構,可以集中透過 Docker Cluster Manager 分派與啟動 Container 在不同的機器節點 (Node) 上,可隨時調度資源、監控、部署與管理 Container,算是很好的微服務雲佈署解決方案。

Docker Swarm Worker 與 Master

Docker Swarm 可以透過 Docker Compose File 直接部署大量 Container,用起來感覺就像在 Local 啟動 Docker Compose 一樣,只是 Container 會直接在一群 Node 中自動啟動與執行,不用一台一台去設定與啟動。先簡單介紹一下 Docker Swarm 架構,Cluster 主要由 Master Node 與 Worker Node 兩種角色所組成:

docker swarm node

Manager Node 負責管理 Node Worker 與協調 Container 的部署工作,可以由一群 Manager Node 所組成 Manager Cluster,共同管理 Container State,如此一來便可以應付單點失效 (SPOF) 的問題,一般來說官方建議 Manager Node 由單數數量的 Node 節點來組成。Manager Node 透過一種去中心化的 Raft 驗算法 (Raft 超精彩介紹) 進行協調與同步,可以自動推舉 Master Leader,在有節點失效或新節點加入時自動重組,並且透過演算法確保節點資料間的正確性。

Worker Node 顧名思義負責執行 Container,實際應用上 Manager Node 也可以同時擔任 Worker 的角色,幫忙執行 Container。不同實例中的 Worker Node 透過 Stack Network建立虛擬網路,並且透過加密的方式進行連線。

Docker Swarm 群集機制

為了要即時管理大規模的集群架構,複雜的網路管理會透過一個類似 Key/Value 分散資料庫實現,底層透過 Gossip Protocol (著名的 Cassandra 也是透過這個協定處理資訊) 同步資訊。可以在自建的網路中,採用 P2P (非 C/S) 快速散佈 Container 網路狀態到大量的節點中,如下圖 TCP/UDP 7946 Port 所示:

docker cluster control

Docker Swarm 透過實現 VXLAN 來建構 Container 之間的 Stack Network,Network 實際資料的傳輸是透過 UDP 4789 Port 進行傳遞,你沒看錯就是 UDP 協議沒錯,在區網使用 UDP 確實比較快,但要注意你的 VM 環境 UDP 千萬不要被防火牆給檔了,不然就會發現網路貌似有通,但是又互相連不上的怪問題。

Docker Swarm 網路架構介紹

我覺得 Docker Swarm 比較難入門的地方就是網路架構,為了在 Stack Overlay Network 中配置各種 Cluster 與 Replication Service ,並且能夠跨 VM 裝置進行通訊、動態配置與拓展,Docker Swarm 實作了許多特異功能,像是 DNSRR, Load Balancing, Ingress Network 等等。這些實作可以讓不同 VM 裝置中的 Container 網路,透過加密的通道串連起來,並且在動態拓展時可以自動進行 Balance,預設 Docker Swarm 提供了 L4/L7 Load Balance (L7 要透過 UCP External L7 Load Balancing),一個典型的 Docker Cluster (Ingress Network) 架構如下:

Docker_Reference_Architecture

在 Ingress Network 中,Container Expose Port 無論在哪一個 Worker Node,所有的 Node 將開啟一樣的 Port,如上圖的 8080。當有連線進入到任何一台 Worker Node 時,會透過 Ingress Network Forward 網路封包,並且透過 iptables NAT 到真正開啟服務的 Container 中。Load Balance 透過 Ingress Network 實現,透過 Docker Swarm 的控制可以動態 Scale-out Service 而不會中斷服務,感覺很威吧!? 在對岸,很多雲服務在產品環境都已經透過 Docker,進行大規模部署與資源調配,透過「微服務」的概念讓 VM 的資源更有效被利用,只要正確地使用 Docker (正確使用就比較難 XD),我相信 Docker Swarm 已經很成熟囉。

這裡介紹的網路架構只是 Docker Swarm 的冰山一角,其實還有很多不同的設計架構。個人領悟能力有限,我 K 完一本書之後還是濛濛略懂。實際建置 Docker 服務時,其實還需要搭配其他的系統管理服務 (像是 etcd 或 confd 等等),才能實現 HASPOF, Auto Scale-out 等等雲端服務必備特性,光靠 Docker 既有的功能是不夠的 (要學更多了)。今天廢話說了太多了,說好的安裝與實作教學呢?抱歉了,這次只介紹完 Docker Swarm 的架構就沒力了 (先有概念吧),完整的 Docker Swarm 教學只好下一次再介紹了....... 這次是真的!