天天看點

基于容器服務的持續內建與雲端傳遞(二)- 多元度打磨傳遞能力

前言

在上一篇中,和大家一起讨論了傳統軟體傳遞的問題、持續傳遞的難點、以及為什麼雲端的容器傳遞可以協助大家快速的持續傳遞。

但是當真正的将一個系統通過雲端容器傳遞的時候會發現不能單純的将docker作為一種傳遞工具來對待,更多的時候是作為一個傳遞平台的基礎設施來看待,還需要關心的是使用docker後網絡、存儲、安全、性能、監控等等不同方面帶來的變革。

因為傳遞的本質是将一套複雜的軟體系統從零到一完成開發、測試、部署、上線的過程,軟體的複雜度直接關系到了傳遞的難度,特别是現在微服務的架構方式越來越成為主流,給傳遞也帶了更多的挑戰。

我們不僅要考慮一個系統傳遞的環境,而且還要考慮針對特定的軟體架構,傳遞系統的網絡、存儲和安全等等是否能夠滿足需求。本文中将會針對上面提到的内容,分享我們是怎樣從以上幾個方面打磨傳遞能力。

關于容器服務

基于容器的傳遞方案有非常多的開源選型,k8s、mesos等等都是目前非常流行的方案,k8s脫胎于google的borg系統,在google内部已經運作多年,成熟度與穩定性上是其他系統無法比拟的;mesos則在資源配置設定上有先天的優勢。

阿裡雲容器服務是基于阿裡雲ecs服務建構的caas層産品,提供相容docker的api、docker compose的模闆,通過內建阿裡雲已有的iaas層、saas層的的雲原生服務,提供完整的docker的雲原生的解決方案。對docker的相容性以及雲原生的服務能力是容器服務與開源方案最大的差別,當開發者已經開始使用雲服務作為軟體架構的基礎設施的時候,docker帶來不應該是破舊立新的變化,而應該是更便捷的使用雲服務來實作傳遞。

系統架構

基于容器服務的持續內建與雲端傳遞(二)- 多元度打磨傳遞能力

上面是容器服務的基本原理圖,使用者可以通過容器服務建立屬于自己的容器服務叢集,每個節點上會預設安裝容器服務的agent,容器服務通過提供高可用的管控服務,使用者可以通過控制台或者api下發指令到容器叢集。對外暴漏的api分為服務api與叢集api,服務api是完全相容docker的api,開發者可以直接通過docker指令操作遠端的容器叢集;叢集api是标準的阿裡雲open api,開發者可以通過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服務的自定義路由的功能,通過docker network plugin的配置容器的ip在固定的網段,下圖是vpc+docker的網絡結構:

基于容器服務的持續內建與雲端傳遞(二)- 多元度打磨傳遞能力

https://yqfile.alicdn.com/b71a4e89ba37d8e0c433626bb122bed006296626.png

" >

網絡請求無需再封包解包,可以直接通過虛拟交換機與虛拟路由器直接進行轉發,降低了網絡的性能損耗。

存儲

docker的特性,決定了容器本身是非持久化的;容器被删除後,其中的資料也一并被删除了。而且使用容器進行部署的應用通常以無狀态的應用為主,大多是水準擴充的,是以一旦涉及到落盤的存儲就需要在不同的容器之間進行共享。

針對落盤的存儲,docker提供資料卷(volume),通過挂載主控端上的目錄來實作持久存儲。但在叢集環境中,主控端上的資料卷有很大的局限性。容器在機器間遷移時,資料無法遷移,不同機器之間不能共享資料卷。容器服務通過docker volume plugin的方式內建了阿裡雲磁盤,oss,nas的容器存儲,在容器重新開機和遷移的時候也可以自動的挂載,保證了容器持久化存儲的共享和安全。容器服務通過将oss、nas的遠端存儲端點映射成為一個主機的磁盤挂載點,開發者可以像使用本地磁盤的方式直接使用不同類型的共享存儲。

對于非落盤的存儲,例如緩存、資料庫等,可以直接使用雲原生的服務例如rds(關系型資料庫)、kvstore(緩存服務)等等來實作,不建議使用容器化的存儲服務,雲原生的資料存儲服務可靠性更高,性能更好,而且在運維、安全等場景中有先天的優勢。

監控

監控在容器的場景中是一個非常重要的功能,因為容器的場景下需要做主控端與容器兩個次元的監控,而容器的彈性擴縮容也依托于監控的功能。

為了應對特定的場景實作,我們的監控依托于阿裡雲雲監控服務,提供預設的監控、告警規則配置等服務。與此同時容器服務還提供了非常簡單快速地與第三方開源監控方案(例如influxdb、grafana)內建的能力,使用者可以友善的和自己的監控或報警系統對接。并且,多元度全方位地提供各個層次的聚合監控名額,以期在不同的次元做監控、告警提示、分析以及實作自動化運維。開發者可以在雲監控中檢視主機級别、應用級别、服務級别、容器級别等多個次元的監控,依托着四個次元的監控名額,可以進行主機級别的彈性伸縮與容器級别的彈性伸縮。

日志

日志是應用排查問題的最後一個手段,當應用容器化之後日志的收集面臨了更大的挑戰。需要能夠收集、聚合多個容器的日志并且容器遷移或者重新部署後日志仍然可以進行收集,是以傳統的落盤采集式的日志收集方式就無法滿足需求了。

容器服務提供了內建阿裡雲日志服務的能力,日志服務是針對日志場景的平台化服務。無需開發就可以快速完成日志收集、分發、投遞與查詢, 适用于日志中轉、監控、性能診斷、日志分析、審計等場景。在容器服務中內建的日志服務,可以友善的把容器日志發送到日志服務裡,隻需要在docker compose編排模闆中添加aliyun.log_store_name: 的标簽就能實作容器日志的自動采集與上報。日志的配置與應用是關聯的,日志的采集與應用的容器是動态連結的,容器的變更會觸發日志插件重新連結與容器的關聯關系,當日志流從容器産生時就會動态地被采集到日志服務,通過日志服務進行聚合,如果有更細粒度的分析需求,可以将日志投遞到maxcompute(大規模計算)進行資料分析。

尾聲

在上面我們浏覽了下阿裡雲容器服務提供的能力,雲端傳遞的首要條件是能夠傳遞,然後才是如何傳遞。阿裡雲容器服務在網絡、存儲、監控方面對基于容器場景的架構進行了增強。讓複雜的系統在雲端容器傳遞中成為了可能。此外容器給開發者帶來的最大價值是可能性,容器服務也在機器學習、高性能計算等領域進行了探索,希望越來越多的領域可以在容器的幫助下更好地實作自身的價值。在下一篇文章中,我們将會讨論如何從零搭建一個持續傳遞系統并傳遞軟體。

個人簡介

莫源,阿裡雲進階研發工程師。在加入阿裡巴巴之前,先後在北京天方地圓科技有限公司、微軟亞洲研究院任職。現主要負責阿裡雲容器服務産品的底層服務發現系統、叢集管理系統的研發,從事容器的持續傳遞、持續內建的方案的設計與實作。在雲計算、分布式系統、圖像識别與虛拟現實方向有多年的開發經驗。

繼續閱讀