容器監控方案 cAdvisor + Elasticsearch

qvac1318 7年前發布 | 43K 次閱讀 Docker ElasticSearch

當前環境

  1. docker 1.12.1
  2. centos 7

前言

什么是微服務?微服務帶來的好處?想必大家都了解了很多。但在真正實踐中,還是有各種各樣的挑戰。今天就想和大家分享一下,在服務容器化場景中的服務監控問題。

傳統的服務監控,一般都是針對宿主機的,有對 CPU、內存、進程數、IO 等監控。這些指標做得非常全面,也能很好的反應宿主機的健康狀況。可到了服務容器化的場景中,似乎變得有些力不從心。一臺宿主機上會起 n 個容器,每個容器都會獨立分配資源,如 CPU、內存等。如果還是僅僅針對宿主機做監控,效果可能不太理想。

我們的容器化部署采用的是 docker 技術,所以下面會針對 docker 來進行一系列的服務監控,以及將監控的數據集成進我們已有的日志中心(ELK)。

關于日志中心的搭建,有興趣的可看我之前寫過的一篇 “基于ELK+Filebeat搭建日志中心”

docker 容器監控

cAdvisor 介紹

關于 docker 的監控,我們這里采用的是由 Google 開源的的監控工具 cAdvisor 。采用它的主要原因有:

  • 對 docker 容器提供了原生的支持;
  • 開箱即用的特性,降低了部署的成本;
  • 除了自身提供簡單的可視化界面外,還提供了外部存儲的擴展,如 ES(Elasticsearch)、kafka、InfluxDB等。

Google的cAdvisor(Container Advisor)“為容器用戶提供了了解運行時容器資源使用和性能特征的方法”。cAdvisor的容器抽象基于Google的lmctfy容器棧,因此原生支持Docker容器并能夠“開箱即用”地支持其他的容器類型。cAdvisor部署為一個運行中的daemon,它會收集、聚集、處理并導出運行中容器的信息。這些信息能夠包含容器級別的資源隔離參數、資源的歷史使用狀況、反映資源使用和網絡統計數據完整歷史狀況的柱狀圖。

cAdvisor 部署

由于 cAdvisor 本身也進行了容器化,所以部署極其簡單。只需在運行有 docker-daemon 的宿主機上,運行如下命令:

docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

cAdvisor 演示

它提供了簡單的可視化界面,為我們提供了容器的整體情況,以及每個容器的獨立數據,數據包括有 CPU、內存、網絡IO、磁盤IO等使用情況。

cAdvisor 參數說明

上面的部署只是為了演示使用的,所以參數都使用的是缺省值。為了更好的運用 cAdvisor,有些參數我們還是需要了解的( 詳細信息參考官方文檔 ):

參數 默認值 說明
-allow_dynamic_housekeeping true 設置數據采集的頻率間隔是動態的,這取決于容器的活躍程度。若設為false,采集的時間間隔將和預期的保持一致,但這會增加資源的使用率。
-global_housekeeping_interval 1m0s 設置cAdvisor全局的采集行為的時間間隔,主要通過內核事件來發現新容器的產生。
-housekeeping_interval 1s 每個已發現的容器的數據采集頻率。
-machine_id_file /etc/machine-id,/var/lib/dbus/machine-id 標識宿主機ID的文件地址,可以設置多個文件,當第一個不存在時,會依次向后查找,文件地址用逗號分隔
-storage_duration 2m0s 在內存中保存最近多久的歷史數據
-storage_driver Empty(none) 設置采集的緩存數據將推送至的存儲驅動,可選項有: , bigquery, ES, influxdb, kafka, redis, statsd, stdout。

cAdvisor 不足

從上述的參數列表中可以看出,cAdvisor 做到的是實時監控,數據存儲在內存中,并且只會保存很短的一段時間。所以它是做不到監控數據的存儲,換句話說,它是記錄下近幾天的監控數據。為此它提供了有關的存儲驅動,幫助我們將實時數據傳輸到我們指定的數據存儲器中。

其次,cAdvisor監聽的是宿主機 docker 主進程的變化,這就意味著單單依靠它是做不到分布式的監控。所以,這更添加了我們將它與 ELK 做集成的理由。

與日志中心(ELK)集成

背景

為了降低維護成本,我們這里選擇 ES 作為存儲驅動,將 cAdvisor 與我們已有的 ELK 日志中心進行集成。這也降低了使用者的復雜度,通過同一個平臺,解決了日志收集與服務監控的問題。

架構

從上圖不難看出,cAdvisor 也是采用了協同進程的概念,通過監聽 docker 主進程的事件,將采集到的數據遠程傳輸的方式,push 到 ES 中。并且通過 Machine ID 來區分不同宿主機的容器信息,實現了數據的分布式監控。

cAdvisor 支持 ES 5

其實我們用它與 ES 集成的時候,還是略坑的。如果你用的 ES 是 5.0+,那就杯具了。因為 cAdvisor 官方目前僅對 ES 2 進行了支持。具體的情況可以查看官方 Github 下的討論: https://github.com/google/cadvisor/pull/1597

這當然也體現了開源的力量。從上述的討論中可以看出,對 ES 5 的支持已經有人提供了,也經過了測試驗證,只是因為官方為了考慮兼容 ES 2,所以暫時沒有采納合并請求。但這給了我們解決方案,雖然官方不提供,我們可以根據社區提供的 ES 5 的代碼,進行手動的 build 生成 cadvisor 執行文件。在以官方鏡像啟動容器時,將我們生成的 cadvisor 執行文件以文件掛載方式替換原有的執行文件,這就做到了對 ES 5的支持( 相信官方會很快對 ES 5 進行支持,我們也不用采用這種迂回的方式了 )。

為了避免自己在手動編譯過程會出現一些問題,我這里也提供了 build 好的 cadvisor 執行文件,下載地址: https://github.com/jasonGeng88/cadvisor/releases/download/es5/cadvisor

部署

docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=$YOUR_PATH/cadvisor:/usr/bin/cadvisor \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest \
-storage_driver=elasticsearch.v5 \
-storage_driver_es_index="cadvisor" \
-storage_driver_es_host="http://$ELASTICSEARCH_IP:9200"

展示( Demo數據

總結

本文介紹了微服務下的容器監控方案,從“開箱即用”的 cAdvisor 講起,雖然它也能輸出我們想要的監控數據。但是作為一個完整的應用,我們還要考慮它的可行性、易用性和可擴展性。同時要從實際出發,結合現有的框架體系,將 cAdvisor 融入進已有的 ELK 日志中心,并且對數據可以進行自定義的圖表展示,使用上更靈活。

 

 

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