本文主要介紹使用 Prometheus 監控 Kubernetes 的最佳實踐,藉助 Prometheus Operator 和 Helm 快速完成 Kubernetes 集羣的監控。
Prometheus Operator 是 SRE 的一種實踐,一種新的軟件類型,大大簡化了在 Kubernetes 上部署、管理和運行 Prometheus 和 Alertmanager 集羣,同時還保持 Kubernetes 原生配置項,和 Kubernetes 無縫貼合。
什麼是 Prometheus?
Prometheus 是由 SoundCloud 開源的監控告警解決方案,從 2012 年開始編寫代碼,再到 2015 年 github 上開源以來,已經吸引了 9k+ 關注,以及很多大公司的使用;2016 年 Prometheus 成爲繼 k8s 後,第二名 CNCF(Cloud Native Computing Foundation) 成員。
作爲新一代開源解決方案,很多理念與 Google SRE 運維之道不謀而合。比如 Operator 的概念:將複雜運維工作固化到 Operator 軟件實體中。
Prometheus 主要功能
- 多維 數據模型(時序由 metric 名字和 k/v 的 labels 構成)。
- 靈活的查詢語句(PromQL)。
- 無依賴存儲,支持 local 和 remote 不同模型。
- 採用 http 協議,使用 pull 模式,拉取數據,簡單易懂。
- 監控目標,可以採用服務發現或靜態配置的方式。
- 支持多種統計數據模型,圖形化友好。
Prometheus 核心組件
- the main Prometheus server which scrapes and stores time series data
- client libraries for instrumenting application code
- a push gateway for supporting short-lived jobs
- special-purpose exporters for services like HAProxy, StatsD, Graphite, etc.
- an alertmanager to handle alerts
- various support tools
Prometheus 架構
從架構圖也可以看出 Prometheus 的主要模塊包含,Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。
各組件之間的協同邏輯:
- Prometheus server 定期從靜態配置的 targets 或者服務發現的 targets 拉取數據。
- 當新拉取的數據大於配置內存緩存區的時候,Prometheus 會將數據持久化到磁盤(如果使用 remote storage 將持久化到雲端)。
- Prometheus 可以配置 rules,然後定時查詢數據,當條件觸發的時候,會將 alert 推送到配置的 Alertmanager。
- Alertmanager 收到警告的時候,可以根據配置,聚合,去重,降噪,最後發送警告。
- 可以使用 API,Prometheus Console 或者 Grafana 查詢和聚合數據。
什麼是 Operator?
Operator 是 CoreOs 提出的一個概念,也是 SRE 的一種實踐,通過開發軟件的方式將複雜運維工作固化到 Operator 中。
Operator 是一種新的基於 Kubernetes 平臺的軟件類型,主要解決 Kubernetes 中某些複雜應用的運維部書工作,利用 Kubernetes 的 Resources 和 Controllers 兩種資源對象實現 Operator,Resources 描述期望的目標狀態,Controllers 負責達成期望目標的具體實現邏輯。
Prometheus Operator 介紹
Prometheus 是一套開源的系統監控、報警、時間序列數據庫的組合,而 Prometheus Operator 是 CoreOS 開源的一套用於管理在 Kubernetes 集羣上的 Prometheus 控制器,它是爲了簡化在 Kubernetes 上部署、管理和運行 Prometheus 和 Alertmanager 集羣,同時還保持 Kubernetes 原生配置項,和 Kubernetes 無縫貼合。
- Operator: Operator 資源會根據自定義資源(Custom Resource Definition / CRDs)來部署和管理 Prometheus Server,同時監控這些自定義資源事件的變化來做相應的處理,是整個系統的控制中心。
- Prometheus: Prometheus 資源是聲明性地描述 Prometheus 部署的期望狀態。
- Prometheus Server: Operator 根據自定義資源 Prometheus 類型中定義的內容而部署的 Prometheus Server 集羣,這些自定義資源可以看作是用來管理 Prometheus Server 集羣的 StatefulSets 資源。
- ServiceMonitor: ServiceMonitor 也是一個自定義資源,它描述了一組被 Prometheus 監控的 targets 列表。該資源通過 Labels 來選取對應的 Service Endpoint,讓 Prometheus Server 通過選取的 Service 來獲取 Metrics 信息。
- Service: kubernetes 的 service 資源,提供 metrics 接口,供 Prometheus 抓取。
- Alertmanager: Alertmanager 也是一個自定義資源類型,由 Operator 根據資源描述內容來部署 Alertmanager 集羣。
Helm 部署 Prometheus Operator
使用 GitHub 提供的 prometheus-operator Chart 部署,該 Chart 提供了一套完整的 Prometheus 監控棧,不需要其他任何安裝部署操作,一個 Chart 3 分鐘搞定一切工作。
helm install --name kube-prometheus stable/prometheus-operator --namespace monitoring
測試訪問:
Grafana UI
kubectl port-forward <grafna pod> --address 0.0.0.0 -n monitoring 3000:3000
Prometheus UI
kubectl port-forward <prometheus pod> --address 0.0.0.0 -n monitoring 9090:9090
參考文檔
https://coreos.com/blog/the-prometheus-operator.html
https://github.com/coreos/kube-prometheus
https://github.com/coreos/prometheus-operator
https://blog.csdn.net/aixiaoyang168/article/details/81661459
https://blog.51cto.com/3241766/2450776
https://www.chenshaowen.com/blog/quickly-deploy-prometheus-using-helm-and-operator.html