使用Prometheus建設Kubernetes的監控告警系統
說明
最近參與了監控系統的建設,主要是用Prometheus監控Kubernetes叢集自身以及託管在Kubernetes中的業務容器的狀態。目標是主動探測及時發現系統異常,避免當用戶開始抱怨、造成實際損失的時候,才發現問題。
這裡簡單總結一下,做個收尾,先貼張圖:
Kubernetes1.8提供了 ofollow,noindex" target="_blank">Metrics API ,待研究 @ 2018-09-19 18:15:07。
背景
公司成立時間較短,在過去幾年飛速擴張、業務團隊快速擴充、打法各異,有的監控做的比較完善,有的經驗不足,監控覆蓋不完善,存在一些處於“裸奔”狀態的服務。歷史上發生過幾次故障,都是等到使用者投訴過來後才知曉,才開始定位、解決,給公司造成了實質性的損失。
最近所處行業“風聲鶴唳”,穩定壓倒一切。公司技術團隊Leaders意識到需要把“公司級”監控平臺 用起來
,要求只有一個:及時發現問題。
公司已經有一套自己開發的監控系統,通過在Java應用中埋藏Agent採集呼叫資訊與請求響應資訊。因為植入了Agent,監控的粒度很細。但是,實際的情況是業務方會“忘記”配置告警規則,或者配置的告警規則觸發的告警太多,而導致告警完全被忽視。
另外,原先的監控告警系統側重的是“應用效能分析”,反而缺少了對另一大類非常基礎、非常重要目標的監控:機器狀態、網路狀態、域名和埠狀態等。
做法
我們將原先監控系統中缺失的一大類監控項統稱為“基礎設施”,對應的告警稱為“基礎告警”。主要有:
機器的CPU狀態、記憶體使用率、剩餘磁碟空間 機器IP地址的聯通情況、服務埠的開放情況 業務域名的聯通情況 ...
因為業務系統大多都託管在了Kubernetes叢集中,因此還有:
容器CPU狀態 容器記憶體使用率 容器inode使用量 容器執行狀態(是否ready) 容器啟動次數 ...
Kubernetes的node和託管其中的容器的資訊,用Prometheus的服務發現功能直接探測。
沒有託管在Kubernetes上的資源,例如一些中介軟體、資料庫,以及業務方自己的物理機、自己搭建的系統等,儘量對接。 暫時無法對接的,在原先的告警監控系統上開發“自定義監控項”功能,推動業務方進行手動錄入。
Prometheus的服務發現: 新型監控告警工具prometheus(普羅米修斯)入門使用
設計
用到了Prometheus的 prometheus
、 alert-manger
和 *_exporter
元件, confd
,和一個外部的consul叢集。
自定義監控項記錄在consul中,prometheus可以通過服務發現配置找到自定義監控項。 但自定義監控項的告警規則不能通過服務發現獲取。這裡引入了 confd
,將consul中的告警規則變化同步到promethes的配置檔案中,並通知prometheus重新載入。
prometheus、alert-manager、confd,加上一個自己開發的告警通知元件(為alert-manager提供webhook)構成一個了monitor-server。
這樣的monitor-server有兩臺,各自獨立工作,兩個monitor-server上的alert-manager配置成了叢集模式,防止告警重複發出。
prometheus發出的告警傳送到alertmanager,alertmanager再呼叫自己開發告警通知元件的webhook將告警送出。 兩個alert-manager通過gossip協議互相通知自己的告警傳送記錄,從而形成一份相同的的告警記錄。 alert-manager收到告警要向外傳送的時候,會檢查這個告警記錄是否已經存在,是否達到了再次通知的標準。
自己開發的告警通知元件中會呼叫公司的其它系統,找到監控項的所屬人和聯絡方式,用郵件、微信和電話等方式送達。
整個設計的關鍵點是:只要我們從公司層面認為狀態異常,就想法設法通知到對應人員,對全公司的業務系統進行兜底監控。
使用者的業務觸及到公司的告警標準,無論他自己是否設定了監控,都會收到公司傳送的告警,並且在告警解除前會以每小時一次的頻率持續傳送。
Kubernetes叢集node的指標採集
node的狀態指標通過Promethes的 node_expoer 採集,使用daemonset的方式,在每個node上部署一個執行在host模式的node_exporter。
node_exporter的預設埠是9100,指標獲取介面是 :9100/metrics
,指標名字首是 node_
。
- job_name: 'prod-kubernetes-node-exporter' scheme: http tls_config: ca_file: /etc/kubernetes/ssl/prodssl/ca.crt cert_file: /etc/kubernetes/ssl/prodssl/cs_client.crt key_file: /etc/kubernetes/ssl/prodssl/cs_client.key server_name: kubernetes.default.svc.cluster.local insecure_skip_verify: true #bearer_token_file: /etc/kubernetes/ssl/token.csv kubernetes_sd_configs: - role: node api_server: https://10.19.16.152:6443 tls_config: ca_file: /etc/kubernetes/ssl/prodssl/ca.crt cert_file: /etc/kubernetes/ssl/prodssl/cs_client.crt key_file: /etc/kubernetes/ssl/prodssl/cs_client.key #insecure_skip_verify: true #server_name: kubernetes.default.svc.cluster.local relabel_configs: - source_labels: [job] regex: '(.*)' replacement: prod-kubernetes target_label: cluster - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:9100' target_label: __address__ - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /metrics - action: labelmap regex: __meta_kubernetes_node_label_(.+)
Kubernetes中的容器指標採集
使用kubelet的 :10255/metrics/cadvisor
介面。 從 :10255/metrics/cadvisor
可以獲得node上容器的詳細狀態,指標名字首是 container_
。
- job_name: 'prod-kubernetes-cadvisor' scheme: http tls_config: ca_file: /etc/kubernetes/ssl/prodssl/ca.crt cert_file: /etc/kubernetes/ssl/prodssl/cs_client.crt key_file: /etc/kubernetes/ssl/prodssl/cs_client.key server_name: kubernetes.default.svc.cluster.local insecure_skip_verify: true #bearer_token_file: /etc/kubernetes/ssl/token.csv kubernetes_sd_configs: - role: node api_server: https://10.19.16.152:6443 tls_config: ca_file: /etc/kubernetes/ssl/prodssl/ca.crt cert_file: /etc/kubernetes/ssl/prodssl/cs_client.crt key_file: /etc/kubernetes/ssl/prodssl/cs_client.key #insecure_skip_verify: true #server_name: kubernetes.default.svc.cluster.local relabel_configs: - source_labels: [job] regex: '(.*)' replacement: prod-kubernetes target_label: cluster - source_labels: [__address__] regex: '(.*):10250' replacement: '${1}:10255' target_label: __address__ - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /metrics/cadvisor - action: labelmap regex: __meta_kubernetes_node_label_(.+)
Kubernetes狀態指標採集
Kubernetes狀態指標指的是Kubernetes中的Pod、Service、ConfigMap、Ingress等資源情況。
用 kube-state-metrics 採集,指標名字首是 kube_型別
。
自定義監控實現方法
就是把使用者配置的目標和規則寫入consul,目標通過prometheus的服務發現獲得,規則用confd獲得。
見: 通過consul、confd,動態為prometheus新增監控目標和告警規則
IP、域名、服務埠等監控
使用Prometheus的 blackbox_exporter 探測目標IP、域名,以及服務埠。
告警規則
告警規則比較多,不一一列舉了,寫告警規則關鍵是要對prometheus的查詢語句比較熟悉。
主要熟悉 Prometheus: Operators 、 Prometheus: Functions 。
可以參考: 通過Prometheus查詢計算Kubernetes叢集中的容器CPU、記憶體使用率等指標 。