摘要: 前言在上一篇中,和大家一起討論了傳統軟體交付的問題、持續傳遞的痛點、以及為什麼雲端的容器交付可以協助大家快速的持續傳遞。但是當真正的將一個系統通過雲端容器交付的時候會發現不能單純的將Docker作為一種交付工具來對待,其他的時候是作為一個交付平臺的基礎設施來看待,還需要關心的是使用Docker後網路、隱藏、安全、效能、監控等等不同方面帶來的變革。
前言
在上一篇中,和大家一起討論了傳統軟體交付的問題、持續傳遞的痛點、以及為什麼雲端的容器交付可以協助大家快速的持續傳遞。
但是當真正的將一個系統通過雲端容器交付的時候會發現不能單純的將Docker作為一種交付工具來對待,其他的時候是作為一個交付平臺的基礎設施來看待,還需要關心的是使用Docker後網路、隱藏、安全、效能、監控等等不同方面帶來的變革。
因為交付的本質是將一套複雜的軟體系統從零到一完成開發、測試、部署、上線的程序,軟體的複雜度直接關係到了交付的難度,特別是現在微服務的架構方式越來越成為主流,給交付也帶了其他的挑戰。
我們不僅要考慮一個系統交付的環境,而且還要考慮針對特定的軟體架構,交付系統的網路、隱藏和安全等等是否能夠滿足需求。本文中將會針對上面提到的內容,分享我們是怎樣從以上幾個方面打磨交付能力。
關於容器服務
基於容器的交付方案有非常多的開源選型,K8S、Mesos等等都是目前非常流行的方案,K8S脫胎於Google的Borg系統,在Google內部已經執行多年,成熟度等級與穩定性上是其他系統無法比擬的;Mesos則在資源分派上有先天的優勢。
阿裡雲容器服務是基於阿裡雲ECS服務構建的CaaS層產品,提供相容Docker的API、DockerCompose的範本,通過整合阿裡雲已有的IaaS層、SaaS層的的雲原生服務,提供完整的Docker的雲原生的解決方案。對Docker的相容性以及雲原生的服務能力是容器服務與開源方案最大的區別,當開發人員已經開始使用雲端服務作為軟體架構的基礎設施的時候,Docker帶來不應該是破舊立新的變化,而應該是更便捷的使用雲端服務來實現交付。
系統架構
上面是容器服務的基本原理圖,用戶可以通過容器服務建立屬於自己的容器服務集群,每個節點上會預設安裝容器服務的Agent,容器服務通過提供高可用管控服務,用戶可以通過主控台或者API下發指令到容器集群。對外暴漏的API分為服務API與集群API,服務API是完全相容Docker的API,開發人員可以直接通過Docker指令動作遠端容器集群;集群API是標準的阿裡雲OPENAPI,開發人員可以通過SDK進行集群的建立、移除、擴縮容等動作。此外容器服務還同SLB(負載平衡服務)、SLS(日誌服務)、CMS(雲監控服務)、OSS(物件隱藏服務)、NAS(NAS共用隱藏)等雲原生服務打通,開發人員可以在阿裡雲容器服務中便捷的使用雲原生的服務能力。
下面我們主要在網路、隱藏、監控、日誌等方面來關於下阿裡雲容器服務的交付能力。
網路
網路在容器的方案中是一個繞不開的老話題,使用容器可以讓每台機器上執行其他的套用提高機器的資源使用率,可以讓套用更簡單的在機器之間遷移等等。
但是對外提供的服務都需要暴漏特定的埠或者服務端點,傳統套用與宿主機共用網路的方式就很難滿足需求。
Docker預設提供了None、Bridge、Host、Overlay四種網路型號,其中Host網路型號就是宿主機與套用共用網路的架構,但是對於很多開發人員而言,Overlay的網路型號是更常用的網路方案。Overlay網路是在集群上構建了一個全域的二層的網路,容器啟動在這個全域的網路上,每個容器有自己在集群中硬地的IP位址,集群節點上的容器可以直接通過容器的這個硬地IP進行通信,而不需要通過NAT暴漏到主機埠,解耦了與宿主機IP的依賴,因此避免了做NAT的時候多個容器埠衝突的問題。但是Overlay網路是Vxlan的一種實現,在傳送資訊或者接收訊息的時候會進行封包與解包,這樣會在效能上造成20%左右的網路損耗。
因此阿裡雲容器服務在VPC網路中針對Overlay網路做了效能的優化。在VPC網路圖樣下容器互通是結合了阿裡雲VPC服務的自訂路由的功能,通過DockerNetwork Plugin的設定容器的IP在固定的網段,下圖是VPC+Docker的網路結構:
網路要求無需再封包解包,可以直接通過虛擬交換器與虛擬路由網域直接進行轉寄,降低了網路的效能損耗。
隱藏
Docker的屬性,決定了容器本身是非持久化的;容器被移除後,其中的資料也一併被移除了。而且使用容器進行部署的套用通常以無狀態的套用為主,大多是水準擴充的,因此一旦涉及到落盤的隱藏就需要在不同的容器之間進行共用。
針對落盤的隱藏,Docker提供資料卷(Volume),通過掛載宿主機上的目錄來實現持久隱藏。但在集群環境中,宿主機上的資料卷有很大的局限性。容器在機器間遷移時,資料無法遷移,不同機器之間不能共用資料卷。容器服務通過DockerVolume Plugin的方式整合了阿裡雲磁碟,OSS,NAS的容器隱藏,在容器重啟和遷移的時候也可以自動的掛載,許諾了容器持久化隱藏的共用和安全。容器服務通過將OSS、NAS的遠端存放端點對應成為一個主機的磁碟掛載點,開發人員可以像使用本地磁碟的方式直接使用不同類型的共用隱藏。
對於非落盤的隱藏,例如快取、資料庫等,可以直接使用雲原生的服務例如RDS(關係型數據庫)、KVStore(快取服務)等等來實現,不建議使用容器化的隱藏服務,雲原生的資料存放區服務強固更高,效能更好,而且在運維、安全等場景中有先天的優勢。
監控
監控在容器的場景中是一個非常重要的功能,因為容器的場景下需要做宿主機與容器兩個維度監控,而容器的彈性擴縮容也依託於監控的功能。
為了應對特定的場景實現,我們的監控依託於阿裡雲雲監控服務,提供預設的監控、警示規則設定等服務。與此同時容器服務還提供了非常簡單快速地與協力廠商開源監控方案(例如InfluxDB、Grafana)整合的能力,用戶可以方便的和自己的監控或報警系統對接。並且,多維度全方位地提供各個層次的彙總監控指標,以期在不同的維度做監控、警示通知、剖析以及實現自動化運維。開發人員可以在雲監控中查看主機分級、套用等級、服務等級、容器等級等多個維度監控,依託著四個維度監控指標,可以進行主機分級的彈性伸縮與容器等級的彈性伸縮。
日誌
日誌是套用排查問題的最後一個手段,當應用程式容器化之後日誌的收集面臨了更大的挑戰。需要能夠收集、彙總多個容器的日誌並且容器遷移或者重新部署後日誌仍然可以進行收集,因此傳統的落盤採集式的日誌收集方式就無法滿足需求了。
容器服務提供了整合阿裡雲日誌服務的能力,日誌服務是針對日誌場景的平臺化服務。無需開發就可以快速完成日誌收集、分發、投遞與查詢,適用於日誌中轉、監控、效能診斷、日誌剖析、審計等場景。在容器服務中整合的日誌服務,可以方便的把容器日誌傳送到日誌服務裡,只需要在DockerCompose編排範本中新增aliyun.log_store_name:的標籤就能實現容器日誌的自動採集與上報。日誌的設定與套用是關聯的,日誌的採集與套用的容器是動態連結的,容器的變更會觸發日誌外掛程式重新連結與容器的關聯關聯,當日誌流從容器產生時就會動態地被採集到日誌服務,通過日誌服務進行彙總,如果有更細細微性的剖析需求,可以將日誌投遞到MaxCompute(大規模計算)進行資料分析。
尾聲
在上面我們瀏覽了下阿裡雲容器服務提供的能力,雲端交付的首要條件是能夠交付,然後才是如何交付。阿裡雲容器服務在網路、隱藏、監控方面對基於容器場景的架構進行了美化。讓複雜的系統在雲端容器交付中成為了可能。此外容器給開發人員帶來的最大價值是可能性,容器服務也在機器學習服務、高效能運算等領域進行了探索,希望越來越多的領域可以在容器的說明下更好地實現自身的價值。在下一篇本文中,我們將會討論如何從零搭建一個持續傳遞系統並交付軟體。
簡歷
莫源,阿裡雲進階研發工程師。在上線阿裡巴巴之前,先後在北京天方地圓科技有限公司、微軟亞洲研究院任職。現主要負責阿裡雲容器服務供應項目的底層服務發現系統、集群管理系統的研發,從事容器的持續傳遞、持續整合的方案的設計與實現。在雲端運算、分散式系統、影像辨識與虛擬實境方向有多年的開發經驗。
相關產品:
- 容器服務(Docker)
- 企業級分散式套用服務
- 日誌服務
- 雲端服務器ECS