基於 Prometheus Operator 實現釘釘機器人報警


創建釘釘機器人

參考:自定義機器人接入 - 釘釘開放平台 (dingtalk.com)

要點:

  • 安全設置選擇"加簽",記住密鑰,作為后面使用的 <SECRET>
  • 記住 Webhook 地址,url 中的 access_token 參數作為作為后面使用的 <ACCESS_TOKEN>
  • 把釘釘機器人加入到群聊

部署 kube-prometheus-stack

使用 helm 安裝,用 ingress 把 prometheus、alertmanager、grafana 的 web 管理頁暴露出來,方便操作,生產環境不要這樣做

# 添加 repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 安裝 chart
helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  -n kube-prometheus-stack --create-namespace \
  --set prometheus-node-exporter.hostRootFsMount=false \
  --set prometheus.ingress.enabled=true \
  --set prometheus.ingress.hosts='{prometheus.k8s.local}' \
  --set prometheus.ingress.paths='{/}' \
  --set prometheus.ingress.pathType=Prefix \
  --set alertmanager.ingress.enabled=true \
  --set alertmanager.ingress.hosts='{alertmanager.k8s.local}' \
  --set alertmanager.ingress.paths='{/}' \
  --set alertmanager.ingress.pathType=Prefix \
  --set grafana.ingress.enabled=true \
  --set grafana.ingress.hosts='{grafana.k8s.local}' \
  --set grafana.ingress.paths='{/}' \
  --set grafana.ingress.pathType=Prefix

注:grafana 默認登陸用戶為 admin,默認登陸密碼 prom-operator

詳情參考:https://github.com/helm/charts/blob/master/stable/prometheus/README.md

部署 prometheus-webhook-dingtalk

alert manager 支持 webhook 的方式發送警報,釘釘機器人也支持 web api 推送消息,但是這兩者定義的接口不兼容,需要一個轉換層,prometheus-webhook-dingtalk 就充當這樣的角色。

git clone --depth=1 https://github.com/timonwong/prometheus-webhook-dingtalk.git

cd ./prometheus-webhook-dingtalk/contrib/k8s

# 修改 namespace 為 kube-prometheus-stack (不必須,但是更合理)
sed -E -i 's/^(namespace:)(.+)$/\1 kube-prometheus-stack/' kustomization.yaml
  1. 編輯 config.yaml
...

targets:
  robot1:
    url: https://oapi.dingtalk.com/robot/send?access_token=<ACCESS_TOKEN>
    secret: <SECRET>

...

注意:需要將 <ACCESS_TOKEN> 和 <SECRET> 替換

  1. 部署
kubectl apply -k .

創建 AlertmanagerConfig 資源

在沒有使用 prometheus-operator 的情況下,我們需要手動配置 alertmanager.yaml 來路由&發送從 prometheus 接收的警報。

使用 prometheus-operator 之后,事情變得簡單一些。只需要創建 AlertmanagerConfig 資源,prometheus-operator 會自動 merge 所有的 AlertmanagerConfig 資源生成/更新 alertmanager.yaml,並通知 alertmanager 重載配置。

默認情況下,prometheus-operator 會關注所有 namespace 下的所有 AlertmanagerConfig:

kubectl get -n kube-prometheus-stack alertmanagers/kube-prometheus-stack-alertmanager -o yaml
# spec.alertmanagerConfigNamespaceSelector: {},表示不作篩選
# spec.alertmanagerConfigSelector: {},表示不作篩選

創建一個簡單警報路由規則,如果警報匹配 label hello=world,則其將轉發到前面部署的 prometheus-webhook-dingtalk:

cat > alertmanager-config.yaml <<EOF
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
  name: dingtalk
spec:
  route:
    receiver: dingtalk
    matchers:
    - name: hello
      value: world
  receivers:
  - name: dingtalk
    webhookConfigs:
    - url: http://alertmanager-webhook-dingtalk/dingtalk/robot1/send
EOF

# 在 kube-prometheus-stack 命名空間創建
kubectl apply -n kube-prometheus-stack -f alertmanager-config.yaml

創建資源后,打開 http://alertmanager.k8s.local/#/status 頁面,確認底部的 Config 已經包含 dingtalk 相關的配置信息(可能需要稍等一會)。

AlertmanagerConfig 資源詳情參考:https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#alertmanagerconfig

創建 PrometheusRule 資源

類似 AlertmanagerConfig,我們可以通過創建 PrometheusRule 資源來創建警報規則(rule),prometheus-operator 會自動把所有 rule 配置 merge 到 prometheus.yml

默認情況下,prometheus-operator 會關注所有 namespace 下匹配 label app=kube-prometheus-stack release=kube-prometheus-stack 的 PrometheusRule :

kubectl get -n kube-prometheus-stack prometheuses/kube-prometheus-stack-prometheus -o yaml
# spec.ruleNamespaceSelector: {},表示不作篩選
# spec.ruleSelector:
#   matchLabels:
#     app: kube-prometheus-stack
#     release: kube-prometheus-stack

創建一個能立即觸發報警的規則 vector(1):

cat > prometheus-rule.yaml <<EOF
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: example
  labels:
    app: kube-prometheus-stack
    release: kube-prometheus-stack
spec:
  groups:
  - name: example
    rules:
    - alert: ExampleAlert
      expr: vector(1)
      labels:
        hello: world
        namespace: kube-prometheus-stack
EOF

# 在 default 命名空間創建
kubectl apply -n default -f prometheus-rule.yaml

注意:labels 的 hello: world 和和前面創建 AlertmanagerConfig 的 matchers 配置匹配,為什么需要 namespace: kube-prometheus-stack?prometheus-operator 會在 AlertmanagerConfig 的 matchers 強制加上這個標簽,issue 討論:Make AlertManagerConfig namespace label matching optional / configurable · Issue #3737 · prometheus-operator/prometheus-operator (github.com)

創建資源后,打開 http://prometheus.k8s.local/rules 頁面,搜索 ExampleAlert 確認能找到新添加的 rule(可能需要稍等一會)。

PrometheusRule 資源詳情參考:https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#prometheusrule

接收警報

上述操作完成后,預期會在機器人所在的群聊收到警報信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM