• Prometheus Operator 配置PrometheusRule告警规则


    PrometheusRule


    用于配置 Prometheus 的 Rule 规则文件,包括 recording rules 和 alerting,可以自动被 Prometheus 加载。

    配置 PrometheusRule


    现在我们知道怎么自定义一个 ServiceMonitor 对象了,但是如果需要自定义一个报警规则的话呢?我们去查看 Prometheus Dashboard 的 Alert 页面下面就已经有很多报警规则了,这一系列的规则其实都来自于项目 GitHub - kubernetes-monitoring/kubernetes-mixin: A set of Grafana dashboards and Prometheus alerts for Kubernetes.,我们都通过 Prometheus Operator 安装配置上了。

    但是这些报警信息是哪里来的呢?他们应该用怎样的方式通知我们呢?我们知道之前我们使用自定义的方式可以在 Prometheus 的配置文件之中指定 AlertManager 实例和报警的 rules 文件,现在我们通过 Operator 部署的呢?我们可以在 Prometheus Dashboard 的 Config 页面下面查看关于 AlertManager 的配置:

    1. alerting:
    2. alert_relabel_configs:
    3. - separator: ;
    4. regex: prometheus_replica
    5. replacement: ☸ ➜1
    6. action: labeldrop
    7. alertmanagers:
    8. - follow_redirects: true
    9. enable_http2: true
    10. scheme: http
    11. path_prefix: /
    12. timeout: 10s
    13. api_version: v2
    14. relabel_configs:
    15. - source_labels: [__meta_kubernetes_service_name]
    16. separator: ;
    17. regex: alertmanager-main
    18. replacement: ☸ ➜1
    19. action: keep
    20. - source_labels: [__meta_kubernetes_endpoint_port_name]
    21. separator: ;
    22. regex: web
    23. replacement: ☸ ➜1
    24. action: keep
    25. kubernetes_sd_configs:
    26. - role: endpoints
    27. kubeconfig_file: ""
    28. follow_redirects: true
    29. enable_http2: true
    30. namespaces:
    31. own_namespace: false
    32. names:
    33. - monitoring
    34. rule_files:
    35. - /etc/prometheus/rules/prometheus-k8s-rulefiles-0/*.yaml

    上面 alertmanagers 的配置我们可以看到是通过 role 为 endpoints 的 kubernetes 的自动发现机制获取的,匹配的是服务名为 alertmanager-main,端口名为 web 的 Service 服务,我们可以查看下 alertmanager-main 这个 Service:

    1. ☸ ➜ kubectl describe svc alertmanager-main -n monitoring
    2. Name: alertmanager-main
    3. Namespace: monitoring
    4. Labels: app.kubernetes.io/component=alert-router
    5. app.kubernetes.io/instance=main
    6. app.kubernetes.io/name=alertmanager
    7. app.kubernetes.io/part-of=kube-prometheus
    8. app.kubernetes.io/version=0.24.0
    9. Annotations:
    10. Selector: app.kubernetes.io/component=alert-router,app.kubernetes.io/instance=main,app.kubernetes.io/name=alertmanager,app.kubernetes.io/part-of=kube-prometheus
    11. Type: NodePort
    12. IP Family Policy: SingleStack
    13. IP Families: IPv4
    14. IP: 10.109.67.21
    15. IPs: 10.109.67.21
    16. Port: web 9093/TCP
    17. TargetPort: web/TCP
    18. NodePort: web 32033/TCP
    19. Endpoints: 10.244.1.193:9093,10.244.2.208:9093,10.244.2.210:9093
    20. Port: reloader-web 8080/TCP
    21. TargetPort: reloader-web/TCP
    22. NodePort: reloader-web 30181/TCP
    23. Endpoints: 10.244.1.193:8080,10.244.2.208:8080,10.244.2.210:8080
    24. Session Affinity: ClientIP
    25. External Traffic Policy: Cluster
    26. Events:

    可以看到服务名正是 alertmanager-main,Port 定义的名称也是 web,符合上面的规则,所以 Prometheus 和 AlertManager 组件就正确关联上了

    而对应的报警规则文件位于:/etc/prometheus/rules/prometheus-k8s-rulefiles-0/ 目录下面所有的 YAML 文件。我们可以进入 Prometheus 的 Pod 中验证下该目录下面是否有 YAML 文件:

    1. ☸ ➜ kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoringkubectl exec -it prometheus-k8s-0 -n monitoring -- /bin/sh
    2. /prometheus ☸ ➜ ls /etc/prometheus/rules/prometheus-k8s-rulefiles-0/
    3. monitoring-alertmanager-main-rules-79543974-2f8e-4c5f-9d23-2c349c38ff1d.yaml
    4. monitoring-grafana-rules-8fc5e057-099e-4546-b6bd-d8fb1107c24d.yaml
    5. monitoring-kube-prometheus-rules-79b18777-2df4-4e43-84a8-193053400842.yaml
    6. monitoring-kube-state-metrics-rules-8341740e-f2b7-48e9-82c2-bd6b979f1da2.yaml
    7. monitoring-kubernetes-monitoring-rules-4b169784-b211-4449-922f-52fb2efd839c.yaml
    8. monitoring-node-exporter-rules-b5f0f4d3-aa18-4e7d-836f-ef0a8fda7569.yaml
    9. monitoring-prometheus-k8s-prometheus-rules-9560ae4f-764c-4ba4-9a37-2fedb56773c7.yaml
    10. monitoring-prometheus-operator-rules-7d3a1645-efe3-4214-b825-c77c39ceb0d4.yaml
    11. /prometheus ☸ ➜ cat /etc/prometheus/rules/prometheus-k8s-rulefiles-0/monitoring-kube-prometheus-rules-79b18777-2df4-4e43-84a8-193053400842.yaml
    12. groups:
    13. - name: general.rules
    14. rules:
    15. - alert: TargetDown
    16. annotations:
    17. description: '{{ printf "%.4g" ☸ ➜value }}% of the {{ ☸ ➜labels.job }}/{{ ☸ ➜labels.service
    18. }} targets in {{ ☸ ➜labels.namespace }} namespace are down.'
    19. runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/targetdown
    20. summary: One or more targets are unreachable.
    21. expr: 100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job,
    22. namespace, service)) > 10
    23. for: 10m
    24. labels:
    25. severity: warning
    26. ......

    这个 YAML 文件实际上就是我们之前创建的一个 PrometheusRule 文件包含的内容:

    1. ☸ ➜ cat kubePrometheus-prometheusRule.yaml
    2. apiVersion: monitoring.coreos.com/v1
    3. kind: PrometheusRule
    4. metadata:
    5. labels:
    6. app.kubernetes.io/component: exporter
    7. app.kubernetes.io/name: kube-prometheus
    8. app.kubernetes.io/part-of: kube-prometheus
    9. prometheus: k8s
    10. role: alert-rules
    11. name: kube-prometheus-rules
    12. namespace: monitoring
    13. spec:
    14. groups:
    15. - name: general.rules
    16. rules:
    17. - alert: TargetDown
    18. annotations:
    19. description: '{{ printf "%.4g" ☸ ➜value }}% of the {{ ☸ ➜labels.job }}/{{ ☸ ➜labels.service
    20. }} targets in {{ ☸ ➜labels.namespace }} namespace are down.'
    21. runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/targetdown
    22. summary: One or more targets are unreachable.
    23. expr: 100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job,
    24. namespace, service)) > 10
    25. for: 10m
    26. labels:
    27. severity: warning
    28. ......

    我们这里的 PrometheusRule 的 name 为 kube-prometheus-rules,namespace 为 monitoring,我们可以猜想到我们创建一个 PrometheusRule 资源对象后,会自动在上面的 prometheus-k8s-rulefiles-0 目录下面生成一个对应的 --.yaml 文件,所以如果以后我们需要自定义一个报警选项的话,只需要定义一个 PrometheusRule 资源对象即可。

    至于为什么 Prometheus 能够识别这个 PrometheusRule 资源对象呢?这就需要查看我们创建的 prometheus 这个资源对象了,里面有非常重要的一个属性 ruleSelector,用来匹配 rule 规则的过滤器,我们这里没有过滤,所以可以匹配所有的,假设要求匹配具有 prometheus=k8s 和 role=alert-rules 标签的 PrometheusRule 资源对象,则可以添加下面的配置:

    1. ruleSelector:
    2. matchLabels:
    3. prometheus: k8s
    4. role: alert-rules

    所以我们要想自定义一个报警规则,只需要创建一个能够被 prometheus 对象匹配的 PrometheusRule 对象即可,比如现在我们添加一个 etcd 是否可用的报警,我们知道 etcd 整个集群有一半以上的节点可用的话集群就是可用的,所以我们判断如果不可用的 etcd 数量超过了一半那么就触发报警,创建文件 prometheus-etcdRules.yaml

    1. apiVersion: monitoring.coreos.com/v1
    2. kind: PrometheusRule
    3. metadata:
    4. labels:
    5. prometheus: k8s
    6. role: alert-rules
    7. name: etcd-rules
    8. namespace: monitoring
    9. spec:
    10. groups:
    11. - name: etcd
    12. rules:
    13. - alert: EtcdClusterUnavailable
    14. annotations:
    15. summary: etcd cluster small
    16. description: If one more etcd peer goes down the cluster will be unavailable
    17. expr: |
    18. count(up{job="etcd"} == 0) > (count(up{job="etcd"}) / 2 - 1)
    19. for: 3m
    20. labels:
    21. severity: critical

    创建完成后,隔一会儿再去容器中查看下 rules 文件夹:

    1. ☸ ➜ kubectl apply -f https://p8s.io/docs/operator/manifests/prometheus-etcdRules.yaml
    2. prometheusrule.monitoring.coreos.com/etcd-rules created
    3. ☸ ➜ kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoring
    4. Defaulting container name to prometheus.
    5. Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod.
    6. /prometheus ☸ ➜ ls /etc/prometheus/rules/prometheus-k8s-rulefiles-0/
    7. monitoring-etcd-rules.yaml monitoring-prometheus-k8s-rules.yaml

    可以看到我们创建的 rule 文件已经被注入到了对应的 rulefiles 文件夹下面了,证明我们上面的设想是正确的。然后再去 Prometheus Dashboard 的 Alert 页面下面就可以查看到上面我们新建的报警规则了:

  • 相关阅读:
    vector的介绍使用及模拟实现
    神经网络 样本不平衡,神经网络结果不稳定
    C++11标准模板(STL)- 算法(std::partition_copy)
    企业级软件定制开发的特点有哪些?
    JavaScript 69 JavaScript Web API 69.2 JavaScript 验证 API
    BUUCTF:[MRCTF2020]ezmisc
    milvus数据库-管理数据库
    图书管理系统
    程序员越老越容易失业?码农的出路到底在哪里
    mysql索引最左匹配原则的理解?(绝对牛逼)
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/125872588