Loading

基于 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

接收警报

上述操作完成后,预期会在机器人所在的群聊收到警报信息。

posted @ 2021-06-09 15:20  roy2220  阅读(1765)  评论(0编辑  收藏  举报