由於容器化和微服務的大力發展,Kubernetes基本已經統一了容器管理方案,當我們使用Kubernetes來進行容器化管理的時候,全面監控Kubernetes也就成了我們第一個需要探索的問題。我們需要監控kubernetes的ingress、service、deployment、pod......等等服務,以達到隨時掌握Kubernetes集群的內部狀況。
此文章是Prometheus監控系列的第一篇,目的也很明確,旨在於尋找一套能夠勝任kubernetes集群監控的架構。
k8s監控方案調研
1、cAdvisor + InfluxDB + Grafana
2、Heapster + InfluxDB + Grafana
3、Promethus + kube-state-metrics + Grafana
-
Grafana: 開源DashBoard,后端支持多種數據庫,如:Influxdb、Prometheus...,插件也比較多,功能強大。非常適合用於做展示。
-
InfluxDB: 開源時間序列數據庫,性能高效
-
cAdvisor: 來自 Google 的容器監控工具,也是 Kubelet 內置的容器資源收集工具。它會自動收集本機容器 CPU、內存、網絡和文件系統的資源占用情況,並對外提供 cAdvisor 原生的 API。隨 kubelet 啟動 --cadvisor-port = 1
-
Heapster: 由於 cAdvisor 只提供了單機的容器資源占用情況,而 Heapster 則提供了整個集群的資源監控(kubernetes 1.11 之前,hpa都是從heapster獲取數據),並支持持久化數據存儲到 InfluxDB
-
-
Promethues: 提供強大的數據采集、數據存儲、數據展示、告警等,天生完美支持kubernetes,CNCF基金會的第二個成員,第一個是Kubernetes。而且Prometheus里面很多思想都來源於Google內部的監控系統Borgmon,可以說是Google的干兒子。
-
kube-state-metrics在這里作為prometheus的一個exporter來使用,提供deployment、daemonset、cronjob等服務的監控數據,由kubernestes官方提供,與prometheus緊密結合。 更多關於kube-state-metrics的信息:https://github.com/kubernetes/kube-state-metrics
Prometheus優勢
Prometheus和kubernetes相親相愛
Google干兒子,大廠維護,而且最重要的一點是完美支持Kubernetes
規范定義
Prometheus對於應用層的監控,定義了一個良好的規范,只需要應用提供接口獲取日志就可以了
Prometheus可以在各個層面實現監控,如下
-
基礎設施層:監控各個主機服務器資源(包括Kubernetes的Node和非Kubernetes的Node),如CPU,內存,網絡吞吐和帶寬占用,磁盤I/O和磁盤使用等指標。
-
中間件層:監控獨立部署於Kubernetes集群之外的中間件,例如:MySQL、Redis、RabbitMQ、ElasticSearch、Nginx等。
-
Kubernetes集群:監控Kubernetes集群本身的關鍵指標
-
Kubernetes集群上部署的應用:監控部署在Kubernetes集群上的應用
基於以上三點,所以最終選擇使用Prometheus來監控Kubernetes集群。
Kubernetes集群監控架構
在具體討論Prometheus監控架構之前,再來看幾個實際的問題
-
如果有多個Kubernetes集群,怎么做?
-
多個Kubernetes集群的監控數據怎么處理?
-
告警應該怎么集中並去重?
好在這些問題對Prometheus來說都不是難事,最終,我們采取 Prometheus + kube-state-metrics + Alertmanager + Grafana 架構來做Kubernetes集群監控。監控系統具體架構如下
使用這個架構,那上面所提到的三個問題將不再是問題。
詳解
K8s集群:
k8s集群-1/-2/-3為需要被監控的集群,就是業務集群。每個集群內部都部署了一個Prometheus,主要由兩部分組成 prometheus-server + kube-state-metrics。
prometheus-server:使用一個帶RBAC權限的賬號采集集群中現有監控信息(其實是從cadvisor獲取)和節點信息。
kube-state-metrics:這里作為prometheus的exporter使用。因為prometheus不能獲取集群中Deployment, Job, CronJob的監控信息。 部署kube-state-metrics的時候,svc一定要帶一個annotations:prometheus.io/scrape: 'true'(這非常重要)
監控匯總
監控匯總其實就是一個Prometheus-server,用於將各個散落在各地的監控數據匯總起來,統一管理。
核心思想是利用Prometheus的federation機制,從其他集群pull數據。這樣其他集群的prometheus只需要短暫存儲數據,匯總之后再做長期存儲;同時還可以統一做告警判斷和數據展示。
展示面板
展示面板就是一個Grafana,支持使用Prometheus做為數據源進行繪圖展示。
告警處理
告警是利用Prometheus官方提供的Altermanager模塊。Alermanager模塊從Prometheus-Server接收告警信息,然后進行匯總、屏蔽、告警...等等操作。Alertmanager告警途徑支持有email、wechat、webhook、slack等等,非常豐富。但是這里使用的是自身開發的Send_msg模塊。
消息發送
自主開發的消息發送模塊,集成email、微信、釘釘、短信等方式。其實不止告警時會發送消息,還有其他地方也會用到消息發送。