将以上内容保存为example-rule.yaml文件,并且通过kubectl命令创建相应的资源:

    1. prometheusrule "prometheus-example-rules" created

    告警规则创建成功后,通过在Prometheus中使用ruleSelector通过选择需要关联的PrometheusRule即可:

    1. apiVersion: monitoring.coreos.com/v1
    2. kind: Prometheus
    3. metadata:
    4. name: inst
    5. namespace: monitoring
    6. spec:
    7. serviceAccountName: prometheus
    8. serviceMonitorSelector:
    9. matchLabels:
    10. team: frontend
    11. ruleSelector:
    12. matchLabels:
    13. role: alert-rules
    14. prometheus: example
    15. resources:
    16. requests:
    17. memory: 400Mi

    Prometheus重新加载配置后,从UI中我们可以查看到通过PrometheusRule自动创建的告警规则配置:

    如果查看Alerts页面,我们会看到告警已经处于触发状态。

    使用Operator管理Alertmanager实例

    为了通过Prometheus Operator管理Alertmanager实例,用户可以通过自定义资源Alertmanager进行定义,如下所示,通过replicas可以控制Alertmanager的实例数:

    1. apiVersion: monitoring.coreos.com/v1
    2. kind: Alertmanager
    3. name: inst
    4. spec:
    5. replicas: 3

    当replicas大于1时,Prometheus Operator会自动通过集群的方式创建Alertmanager。将以上内容保存为文件alertmanager-inst.yaml,并通过以下命令创建:

    查看Pod的情况如下所示,我们会发现Alertmanager的Pod实例一直处于ContainerCreating的状态中:

    1. $ kubectl -n monitoring get pods
    2. NAME READY STATUS RESTARTS AGE
    3. alertmanager-inst-0 0/2 ContainerCreating 0 32s

    通过kubectl describe命令查看该Alertmanager的Pod实例状态,可以看到类似于以下内容的告警信息:

    1. MountVolume.SetUp failed for volume "config-volume" : secrets "alertmanager-inst" not found

    这是由于Prometheus Operator通过Statefulset的方式创建的Alertmanager实例,在默认情况下,会通过alertmanager-{ALERTMANAGER_NAME}的命名规则去查找Secret配置并以文件挂载的方式,将Secret的内容作为配置文件挂载到Alertmanager实例当中。因此,这里还需要为Alertmanager创建相应的配置内容,如下所示,是Alertmanager的配置文件:

    1. global:
    2. resolve_timeout: 5m
    3. route:
    4. group_by: ['job']
    5. group_wait: 30s
    6. group_interval: 5m
    7. repeat_interval: 12h
    8. receiver: 'webhook'
    9. receivers:
    10. - name: 'webhook'
    11. webhook_configs:
    12. - url: 'http://alertmanagerwh:30500/'

    在Secret创建成功后,查看当前Alertmanager Pod实例状态。如下所示:

    1. $ kubectl -n monitoring get pods
    2. NAME READY STATUS RESTARTS AGE
    3. alertmanager-inst-0 2/2 Running 0 5m
    4. alertmanager-inst-2 2/2 Running 0 37s

    使用port-forward将Alertmanager映射到本地:

    1. $ kubectl -n monitoring port-forward statefulsets/alertmanager-inst 9093:9093

    访问http://localhost:9093/#/status,并查看当前集群状态:

    Alertmanager集群状态

    接下来,我们只需要修改我们的Prometheus资源定义,通过alerting指定使用的Alertmanager资源即可:

    1. apiVersion: monitoring.coreos.com/v1
    2. kind: Prometheus
    3. metadata:
    4. name: inst
    5. namespace: monitoring
    6. spec:
    7. serviceAccountName: prometheus
    8. serviceMonitorSelector:
    9. matchLabels:
    10. team: frontend
    11. ruleSelector:
    12. matchLabels:
    13. role: alert-rules
    14. prometheus: example
    15. alerting:
    16. alertmanagers:
    17. - name: alertmanager-example
    18. namespace: monitoring
    19. port: web
    20. resources:

    通过服务发现规则将Prometheus与Alertmanager进行了自动关联。