創建釘釘機器人
參考:自定義機器人接入 - 釘釘開放平台 (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
接收警報
上述操作完成后,預期會在機器人所在的群聊收到警報信息。

