基于 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
- 编辑 config.yaml
...
targets:
robot1:
url: https://oapi.dingtalk.com/robot/send?access_token=<ACCESS_TOKEN>
secret: <SECRET>
...
注意:需要将 <ACCESS_TOKEN> 和 <SECRET> 替换
- 部署
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
接收警报
上述操作完成后,预期会在机器人所在的群聊收到警报信息。