如今铜幽,越來越多的公司開始使用 Docker 了,2 / 3 的公司在嘗試了 Docker 后最終使用了它。為了能夠更精確的分配每個容器能使用的資源,我們想要實時獲取容器運行時使用資源的情況锭汛,怎樣對 Docker 上的應用進行監(jiān)控呢?Docker 的結構會不會加大監(jiān)控難度袭蝗?
可是在沒有專業(yè)運維團隊來監(jiān)控 Docker 的情況下唤殴,并且還想加快 Docker 監(jiān)控的日程,怎么辦呢到腥?
我們通過調查了解到幾種不錯的 Docker 監(jiān)控方法眨八,其中 Prometheus 和 Cloud Insight 讓人很感興趣。
Prometheis
先來說說一套開源的 Docker 監(jiān)控方案:Prometheus左电;而此篇文字的原文地址:Monitor Docker Containers with Prometheus。
Prometheus 由 SoundCloud 發(fā)明,適合于監(jiān)控基于容器的基礎架構篓足。Prometheus 特點是高維度數(shù)據(jù)模型段誊,時間序列是通過一個度量值名字和一套鍵值對識別。靈活的查詢語言允許查詢和繪制數(shù)據(jù)栈拖。它采用了先進的度量標準類型像匯總(summaries)连舍,從指定時間跨度的總數(shù)構建比率或者是在任何異常的時候報警并且沒有任何依賴,中斷期間使它成為一個可靠的系統(tǒng)進行調試涩哟。
Prometheus 支持維度數(shù)據(jù)索赏,你可以擁有全局和簡單的指標名像 container_memory_usage_bytes
,使用多個維度來標識你服務的指定實例贴彼。
我已經創(chuàng)建了一個簡單的 container-exporter
來收集 Docker 容器的指標以及輸出給 Prometheus 來消費潜腻。這個輸出器使用容器的名字,id 和 鏡像作為維度器仗。額外的 per-exporter
維度可以在 prometheus.conf
中設置融涣。
如果你使用指標名字直接作為一個查詢表達式,它將返回有這個使用這個指標名字作為標簽的所有時間序列精钮。
container_memory_usage_bytes{env="prod",id="23f731ee29ae12fef1ef6726e2fce60e5e37342ee9e35cb47e3c7a24422f9e88",instance="http://1.2.3.4:9088/metrics",job="container-exporter",name="haproxy-exporter-int",image="prom/haproxy-exporter:latest"} 11468800.000000
container_memory_usage_bytes{env="prod",id="57690ddfd3bb954d59b2d9dcd7379b308fbe999bce057951aa3d45211c0b5f8c",instance="http://1.2.3.5:9088/metrics",job="container-exporter",name="haproxy-exporter",image="prom/haproxy-exporter:latest"} 16809984.000000
container_memory_usage_bytes{env="prod",id="907ac267ebb3299af08a276e4ea6fd7bf3cb26632889d9394900adc832a302b4",instance="http://1.2.3.2:9088/metrics",job="container-exporter",name="node-exporter",image="prom/container-exporter:latest"}
... ...
如果你運行了許多容器威鹿,這個看起來像這樣:
為了幫助你使得這數(shù)據(jù)更有意義,你可以過濾(filter) and/or 聚合(aggregate) 這些指標轨香。
使用 Prometheus 的查詢語言忽你,你可以對你想的任何維度的數(shù)據(jù)切片和切塊。如果你對一個給定名字的所有容器感興趣臂容,你可以使用一個表達式像 container_memory_usage_bytes{name="consul-server"}
科雳,這個將僅僅顯示 name == "consul-server"
的時間序列。
像多維度的數(shù)據(jù)模型策橘,來實現(xiàn)數(shù)據(jù)聚合炸渡、分組、過濾丽已,不單單是 Prometheus蚌堵。OpenTSDB 和 InfluxDB 這些時間序列數(shù)據(jù)庫和系統(tǒng)監(jiān)控工具的結合,讓系統(tǒng)監(jiān)控這件事情變得更加的多元沛婴。
接下來吼畏,我們?yōu)榇蠹医榻B國內一家同樣提供該功能的監(jiān)控方案:Cloud Insight。有關其數(shù)據(jù)聚合的功能可以閱讀:數(shù)據(jù)聚合 & 分組:新一代系統(tǒng)監(jiān)控的核心功能嘁灯。
現(xiàn)在我們來對比 Prometheus 和 Cloud Insight 在數(shù)據(jù)聚合泻蚊、分組(切片)上的展現(xiàn)效果和功能。
數(shù)據(jù)聚合
根據(jù)不同的 Container Name 或 Image Name 對內存使用量或 Memeory Cache 進行聚合丑婿。
數(shù)據(jù)分組(切片)
根據(jù)不同的 Container Name 或 Image Name 對內存使用量或 Memeory Cache進行分組(切片)性雄。
Cloud Insight
Cloud Insight 支持多種操作系統(tǒng)没卸、云主機、數(shù)據(jù)庫和中間件的監(jiān)控秒旋,原理是在平臺服務儀表盤和自定義儀表盤中约计,采集并處理 Metric,對數(shù)據(jù)進行聚合與分組等計算迁筛,提供曲線圖煤蚌、柱狀圖等多樣化的展現(xiàn)形式。優(yōu)點是監(jiān)控的指標很全细卧,簡單易用尉桩,也可以期待一下。
Cloud Insight 監(jiān)控 Docker 試驗
我們用 AcmeAir 作為試驗的應用贪庙,AcmeAir 是一款由原 IBM 新技術架構部資深工程師 Andrew Spyker蜘犁,利用 Netflix 開源的 Netflix OSS 打造的開源電子商務應用。
首先插勤,我們要打開 Cloud Insight 監(jiān)控沽瘦,還好 Cloud Insight 安裝簡單,一條命令即可农尖。接著析恋,我們新建一個用于此次監(jiān)控的儀表盤,依次將想要獲取的指標統(tǒng)統(tǒng)添加進去盛卡。
我們添加了以下指標:
- docker.cpu.user
- docker.cpu.sysytem
- docker.containers.running
- jvm.heap_memory
- jvm.non_heap_memory
- jvm.gc.cms.count
- jvm.heap_memory_max
- jvm.gc.parnew.time
應用 Acme 部署在四臺 servers 上助隧,我們開啟四臺 servers, 然后用 JMeter 給應用加壓。
隨著時間 JMeter 不斷給應用加壓滑沧,當 users 人數(shù)達到188時并村,我們再來看一下儀表盤的視圖。
從圖中可以看到滓技,性能數(shù)據(jù)發(fā)生了變化哩牍,根據(jù) JMeter 里的數(shù)據(jù),此時 CPU 占用超過了50%令漂,錯誤率也有所提升膝昆;對比來看,根據(jù) Cloud Insight 里的曲線顯示叠必,藍色的線所代表的 Container CPU 占用率已經超過50%荚孵,逐漸接近75%,系統(tǒng)剩余的 CPU 資源逐漸下降纬朝,該 Container 的系統(tǒng) CPU 資源消耗也突然增大收叶。我們可以通過這些定位到 CPU 占用率過高的 Container ,及時而主動地去了解性能瓶頸共苛,從而優(yōu)化性能判没,合理分配資源蜓萄。Cloud Insight 所抓取的性能指標算是較為全面,部署和展現(xiàn)方式都是相當簡單易懂的哆致。
總結
Docker 兼容相比其他的數(shù)據(jù)庫绕德、系統(tǒng)、中間件監(jiān)控摊阀,要復雜一些。由于需要表征不同 Container 的性能消耗踪蹬,來了解不同應用的運行情況胞此,所以數(shù)據(jù)的聚合、切片(分組)和過濾跃捣,在 Docker 監(jiān)控中成為了必備功能漱牵。
所以我們推薦使用了時間序列數(shù)據(jù)庫,或者類似設計邏輯的監(jiān)控方案疚漆,如:Prometheus 和 Cloud Insight酣胀。
而 Docker 單方面的監(jiān)控,可能不太滿足一些大型公司的需求娶聘,如果一個工具在監(jiān)控 Docker 同時能夠監(jiān)控其他組件闻镶,那就更好了。
國外出現(xiàn)了 Graphite丸升、Grafana 和 Host Graphite铆农,能夠讓用戶將不同數(shù)據(jù)來源都集中在同一個地方進行展現(xiàn);而國內 Cloud Insight 似乎也是這樣的思路狡耻。