Prometheus+Alertmanager告警及推送

近來項目組任務很少,你們都開始了各類方向的學習積累。node

咱們項目雖然都是用k8s進行部署,可是卻缺少有效、合理的集羣監控手段,恰好藉此機會調研了一下集羣監控方面的知識。git

什麼是Prometheus

Prometheus是一套開源的監控、報警、時間序列數據庫的組合。2016年,Prometheus加入了雲原生計算基金會,成爲Kubernetes以後的第二個託管項目。github

爲何使用Prometheus

Prometheus已經成爲了k8s的一個標準,不少的k8s組件都會提供/metrics這個url供Prometheus採集監控指標。對於一些硬件層面及沒有提供這個url的應用,須要使用一箇中間產品來幫助採集,這個產品就叫exporter。docker

官方收錄了許多exporter,其中包括Kafka exporter、Ceph exporter、Nginx VTS exporter、MySQL server exporter等。咱們也能夠經過官方提供的客戶端庫本身實現一個。
Prometheus擁有靈活強大的查詢語言(PromQL)、很是高效的存儲。數據庫

什麼是Alertmanager

Alertmanager處理由諸如Prometheus服務器之類的客戶端應用程序發送的警報。它負責將重複數據刪除,分組和路由到正確的接收者集成,例如電子郵件,PagerDuty或OpsGenie。它還能夠沉默和禁止警報。json

爲何使用Alertmanager

Alertmanager是Prometheus組織下的產品,與Prometheus結合的更好。Prometheus負責監控並生成告警,Alertmanager能對告警進行分組分類、合併發送等操做,讓告警郵件更加合理。api

使用Kube-prometheus安裝

爲了快速用起來,這裏直接使用開源項目Kube-prometheus進行部署。安全

git clone https://github.com/coreos/kube-prometheus.git 
kubectl apply -f manifests/setup
kubectl apply -f manifests/

該項目將Grafana、Prometheus、Alertmanager、node-exporter都包括了,咱們能夠在他基礎上進行修改。服務器

讓Prometheus生成告警

添加告警規則

編寫yaml

使用spec.groups.rules.alert便可定義告警規則。annotations.message是告警信息,expr是告警監控的表達式,咱們可使用PromQL結合各類exporter提供的方法來制定規則,這裏咱們制定一個始終存在的告警規則來用作演示。併發

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: prometheus-k8s-rules
  namespace: monitoring
spec:
  groups:
    - name: test.rules
      rules:
      - alert: Test
        annotations:
          message: |
            Just test.
        expr: vector(1)
        labels:
          severity: none

apply後便可生效。

編寫jsonnet

Kube-prometheus提供的yaml都是由jsonnet生成的,咱們也可使用它的思想來編寫jsonnet而後轉爲yaml文件。

在目錄jsonnet/kube-prometheus/alerts下按jsonnet語法編寫告警規則。

執行docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci jb update拉取並更新jsonnet環境。

quay.io/coreos/jsonnet-ci鏡像較大,須要較長時間。

在Kube-prometheus項目根目錄下執行docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) quay.io/coreos/jsonnet-ci ./build.sh example.jsonnet將jsonnet項目輸出爲yaml文件。

執行完後,manifests目錄下的文件就都從新生成了,從新apply後便可生效。

查看告警

暴露prometheus的服務接口,便可在網頁訪問。

image.png

能夠在Alerts目錄下看到不少告警規則,其中不少是Kube-prometheus自帶的,咱們剛纔制定的規則也顯示在其中。

咱們能夠用prometheus自帶的圖形化界面查看到告警趨勢。

image.png

能夠看到該告警規則始終保持着一個活動的告警。

讓Alertmanager推送告警

Prometheus生成的告警雜亂無章,Alertmanager能使告警更合理、友好地發送給相關人員。

添加推送規則

推送規則一般包括一些敏感信息,如郵箱帳號密碼等,建議使用Secret存儲這部分信息。Kube-prometheus將推送規則用Secret存儲在alertmanager-secret.yaml文件裏。

生成Secret

新建alertmanager.yaml文件。在global中定義發件人,smtp_smarthost表示使用的發件SMTP服務地址,這裏使用騰訊企業郵箱。在receivers中定義接受方,在route中定義沒有被路由命中的告警的默認推送信息,在route.routes中定義具體的告警路由,能夠覆蓋全局定義。更多詳細配置請參考官方文檔

若是郵箱開啓了安全登陸,smtp_auth_password應填受權碼而不是帳戶密碼
global:
  resolve_timeout: 5m
  smtp_auth_password: {yourpassword}
  smtp_auth_username: {youremail}
  smtp_from: {youremail}
  smtp_require_tls: false
  smtp_smarthost: smtp.exmail.qq.com:465
receivers:
- email_configs:
  - send_resolved: true
    to: {someone's email}
  name: example
route:
  group_by: ['namespace']
  group_interval: 5m
  group_wait: 30s
  receiver: example
  repeat_interval: 12h
  routes:
  - match:
      alertname: Test
    receiver: example

刪除原Secret:kubectl delete -f alertmanager-secret.yaml

生成新Secret:kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring

編寫jsonnet

jsonnet/kube-prometheus/alertmanager中按jsonnet語法編寫推送規則並從新編譯項目並apply便可。

接收告警

若是配置正確,咱們會在group_wait時間後收到第一條郵件推送,若是告警有變更,會間隔group_interval設定的時間向組推送,並每間隔repeat_interval推送一次,直至解決。

image.png

至此,一個最簡單的告警推送就完成了。

總結

此次是爲了快速用起來而使用了Kube-prometheus項目,雖然方便,可是不少東西並不可控,後續也須要學習原生的版本,掌握更多靈活、強大的功能便於生產環境使用。

同時確切的感受到了Prometheus+Alertmanager的強大,若是是使用k8s進行項目部署,很推薦使用這套組合拳,經過各類exporter能監控幾乎全部的微服務組件。

相關文章
相關標籤/搜索