天天看點

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

微服務架構通過将一個複雜系統分解成一系列獨立開發、部署和運維的服務,提升了整個系統的靈活性,可以靈活的響應業務和規模的變化。而docker技術則将服務的部署和環境完全解耦,利用docker的可移植性和靈活性,快速傳遞分布式應用,進而大大提升了部署運維效率。然而大規模分布式微服務應用,也會給系統監控帶來新的挑戰。

除去分布式應用自身的複雜性,微服務倡導的快速疊代和動态部署都會加劇管控的複雜性。從技術角度來看,傳統的監控系統大多是針對實體機或虛拟機設計的,通常使用靜态的配置項來建立應用、環境與監控名額的映射。然而微服務的架構的部署形态則打破了這種靜态的綁定關系。每個服務的執行個體都可能被分布在多個節點上,當一個節點失效時,服務執行個體可能會動态遷移到其他節點上;每個服務可以獨立演化,生命周期大大提速,需要考慮支援多版本并存。此外docker容器提供了獨立的程序空間,鼓勵一個容器隻運作單一任務,這一方面改善了隔離性,同時也導緻一些傳統的系統監控手段無法直接采集在容器中運作的應用狀态。

阿裡雲容器服務不但提供了核心的容器和主控端監控能力,而且支援客戶定制或內建自己的監控解決方案。今天我們會介紹一些關于容器監控的常見技術,并帶領大家在阿裡雲容器服務上,打造一個自己的docker監控架構。

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

docker容器通過namespace做資源隔離,通過cgroup來做資源限制。對容器資源的監控,其實就是在主控端上檢視對應容器的cgroup stats,這是所有docker監控工具的技術基礎。

docker本身提供了docker stats指令和stats api。我們可以通過<code>docker stats [container]</code> 或 <code>docker stats -a</code>列出指定容器或所有容器的性能資訊

阿裡雲容器服務上也是利用基于cgroups的資訊來展現容器的性能監控名額

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構
Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

google的cadvisor是另一個知名的開源容器監控工具。隻需在主控端上部署cadvisor容器,使用者就可通過web界面或rest服務通路目前節點和容器的性能資料(cpu、記憶體、網絡、磁盤、檔案系統等等),非常詳細。預設cadvisor是将資料緩存在記憶體中,資料展示能力有限;它也提供不同的持久化存儲後端支援,可以将監控資料儲存、彙總到google bigquery、influxdb或者redis之上。使用者可以進一步加工處理這些監控名額,實作資料展現、報警、基于規則的自動化執行等能力。

influxdb和grafana是開源軟體中比較流行的用于監控的組合。influxdb是一個強大好用的時間序列(time series)資料庫,可以非常簡單地利用類sql的方式處理時序資料;grafana是一個流行的監控儀表盤(metrics dashboard)應用,可以非常友好的展現資料資訊,頁面相當酷炫。它們能夠與cadvisor聯合起來建構一個簡單而又強大的docker監控架構。

著名雲計算布道師brian christner寫過一篇“如何搭建docker監控”的部落格文章,介紹了如何利用一個docker compose模闆檔案,通過一個簡單的“docker-compose up”指令就在單機建立一個使用cadvisor、influxdb和grafana的監控環境。

然而這個方案還不夠完美:隻支援單機環境,需要很多手工配置關聯。keith提供了一個改進的版本,讓使用者執行一個shell腳本來使得一部配置設定置自動化。

下面我們将提供一個進一步改進的方案,利用阿裡容器服務的能力為docker叢集建構真正一個分布式監控架構。整個部署完全自動化并能夠監控一個docker叢集上所有節點上的容器。

首先我們先看一下docker compose模闆

這個模闆非常直覺,在模闆中包含了四個服務:

influxsrv: 提供influxdb時序資料庫

cadvisor: 部署cadvisor并将監控名額通過容器連結上報給influxdb,由于指明了“aliyun.global”标簽,cadvisor容器會在每個節點上部署,且會随着叢集節點伸縮,自動調整執行個體數量。

grafana: 提供了監控資料控制台,通過容器連結從influxdb查詢監控名額,并實作監控資料可視化。為了提供web通路端口,可以輕松的利用叢集的二級域名“grafana”來進行通路grafana的3000端口。

config: 它會運作自動化腳本來配置grafana上的資料源和預定義的dashboard,配置完成後停止運作。

在keith的方案基礎上,我們做了幾個小小的調整

使用grafana-config容器來在compose模闆中運作grafana的配置腳本

利用阿裡雲容器服務的特性簡化部署

支援cadvisor容器在叢集每個節點上的“全局”部署

支援跨主控端容器連結,任意節點上的cadvisor容器都能連接配接influxdb

利用路由服務提供的叢集二級域名,友善的提供web通路接口

改用阿裡雲hub上面的鏡像而不是從dockerhub下載下傳

其中grafana-config鏡像和compose模闆内容可以在github的示例工程上面獲得

好了,開始建立編排模闆并部署應用吧!

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

在我的測試環境中,我會把“monitoring-sample-default“應用部署在一個由3個節點構成的docker叢集上;兩分鐘後我們可以看到這個應用包含3個cadvisor容器;一個influxdb和一個grafana容器;和一個停止的config容器(已經完成配置腳本執行)

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

首先讓我選擇cadvisor服務,我們可以看到3個cadvisor容器分别部署在三個不同節點上,這是由“aliyun.global”标簽保證的。

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

通過容器的端口位址 :,我們可以在浏覽器裡打開cadvisor控制台,友善地獲得指定節點os和docker容器的監控資訊。

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構
Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

然後我們來通過grafana來通路整個叢集中所有容器的監控資訊,選擇grafana服務并點選通路端點。

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

在浏覽器中會出現grafana的登入界面,它預設的使用者名和密碼是“admin/admin”

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

之後選擇桌面上的 container activity dashboard,

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

這樣整個叢集中所有容器的監控資訊就展現在我們的眼前了。(如果暫時沒有資料呈現,請耐心等待兩分鐘)

Docker監控:基于阿裡雲容器服務建構自己的Docker監控架構

整個過程是不是非常簡單 :-d,你可以進一步根據brian的文章來定義和添加自己所需的監控名額。

微服務架構和容器技術雖然給監控帶來新的挑戰,但是整個社群都在推動相關技術的進展。“cadvisor + influxdb + grafana”是一個簡單而又強大的組合,可以滿足docker監控的基本需求。這裡再次感謝brian和keith的貢獻和分享,基于他們的工作,我們才可以輕松的享受部署和使用過程。

阿裡雲容器服務是一個開放的平台:它提供了的核心的docker容器和ecs執行個體的監控能力,更重要的是它能夠讓不同的監控技術非常簡單的部署在docker叢集之上,與使用者現有監控架構內建。

在社群和商業産品中還有很多優秀的docker監控方案,比如prometheus,sysdig,oneapm的cloud insight等。我們期待大家的回報,我們也歡迎合作夥伴和我們一起為使用者提供一個可以掌控、信賴的容器平台。

同時本文還沒有涉及到容器應用的應用性能管理(apm),那會是一個更加開放的話題。在未來,我們會持續分享我們的一些心得和最佳實踐。