Docker監控:基于阿里云容器服務構建自己的Docker監控框架

wfyc4027 8年前發布 | 42K 次閱讀 Docker 阿里云

來自: http://yq.aliyun.com/articles/5065

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

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

阿里云容器服務不但提供了核心的容器和宿主機監控能力,而且支持客戶定制或集成自己的監控解決方案。今天我們會介紹一些關于容器監控的常見技術,并帶領大家在阿里云容器服務上,打造一個自己的Docker監控框架。

Docker監控入門

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

Docker本身提供了Docker stats命令和 stats API 。我們可以通過 docker stats [CONTAINER] 或 docker stats -a 列出指定容器或所有容器的性能信息

yili@yili-mbp:~$ docker stats -a
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O               BLOCK I/O
218f2f69e649        0.00%               6.504 MB / 2.1 GB   0.31%               94.27 kB / 113.5 kB   0 B / 0 B
25f5194a0cd0        0.00%               0 B / 0 B           0.00%               0 B / 0 B             0 B / 0 B
63034ecc8009        0.01%               24.81 MB / 2.1 GB   1.18%               9.12 MB / 249.5 kB    0 B / 0 B
63b421a45729        0.30%               18 MB / 2.1 GB      0.86%               225.7 kB / 9.086 MB   0 B / 0 B
883b157f3a8e        0.00%               0 B / 0 B           0.00%               0 B / 0 B             0 B / 0 B

阿里云容器服務上也是利用基于cgroups的信息來展現容器的性能監控指標

</div>

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監控框架

首先我們先看一下Docker Compose模板

influxsrv:
  image: registry.aliyuncs.com/acs-sample/tutum-influxdb:0.8.8
  ports:

- "8083:8083"
- "8086:8086"

expose:

- "8090"
- "8099"

environment:

- PRE_CREATE_DB=cadvisor

cadvisor: image: registry.aliyuncs.com/acs-sample/google-cadvisor:v0.20.5 command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 ports:

- "9090:8080"

volumes:

- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro

links:

- influxsrv:influxsrv

labels: aliyun.global: "true" grafana: image: registry.aliyuncs.com/acs-sample/grafana:2.0.2 ports:

- "3000:3000"

links:

- influxsrv:influxsrv

environment:

- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root

labels: aliyun.routing.port_3000: 'http://grafana' config: image: registry.aliyuncs.com/acs-sample/grafana-config links:

- influxsrv:influxsrv
- grafana:grafana</code></pre><code data-language=""> 

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

  • 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的 示例工程 上面獲得

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

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

感受Docker監控

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

通過容器的端口地址 :,我們可以在瀏覽器里打開cAdvisor控制臺,方便地獲得指定節點OS和Docker容器的監控信息。

然后我們來通過Grafana來訪問整個集群中所有容器的監控信息,選擇grafana服務并點擊訪問端點。

在瀏覽器中會出現Grafana的登錄界面,它缺省的用戶名和密碼是“admin/admin”

之后選擇桌面上的 Container Activity Dashboard,

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

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

總結

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

阿里云容器服務是一個開放的平臺:它提供了的核心的Docker容器和ECS實例的監控能力,更重要的是它能夠讓不同的監控技術非常簡單的部署在Docker集群之上,與用戶現有監控框架集成。

在社區和商業產品中還有很多優秀的Docker監控方案,比如Prometheus,Sysdig,OneAPM的Cloud Insight等。我們期待大家的反饋,我們也歡迎合作伙伴和我們一起為用戶提供一個可以掌控、信賴的容器平臺。

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

</code></code></div>

 本文由用戶 wfyc4027 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!