Prometheus - nicoleShuaihui/k8s GitHub Wiki

Prometheus

1. 原理

prometheus是当今云原生监控的事实标准。Prometheus监控的对象是Metrics(指标)。个人认为,与Zabbix等相比,Prometheus更适合当今盛行的微服务架构:

  • Restful API方式拉取metrics。被监控的服务只需提供metrics API,处理非常的灵活。
  • 支持服务发现。支持Kubernetes、consul等服务发现方式,Prometheus可对各个微服务实例分别进行metrics采集。

![prometheus architecture](images/prometheus architecture.png)

Prometheus相关说明:

  • AlertManager,负责Prometheus与告警API的对接。AlertManager原生支持一些告警客户端(如slack、邮件等),同时提供Web hook方式,供程序员进行扩展。我司就是通过Web hook方式进行集成,具体可参考Prometheus AlertManager Webhook API 说明
  • PromQL。PromQL是Prometheus查询语句,只提供数据查询功能。告警规则、数据展示的配置都要用到PromQL。
  • PushGateway。除了常规的拉取式metrics采集外,PushGateway提供了推送式的metrics采集。

2. Metrics Exporter/API

Prometheus将以HTTP API方式导出(export)metrics的组件称为Exporter。社区提供大量现成的第三方Exporter。我司Kubernetes应用监控使用了如下两个Exporter:

我们可开发自己的Metrics API,只需HTTP API的响应符合Prometheus Metrics要求即可。更便捷的方式是,使用现成的SDK。例如,prometheus的golang sdk

3. Prometheus告警配置

我司prometheus告警规则以ConfigMap方式配置:

# kubectl edit cm prometheus-rule-config  -n monitor-ali-sg-ym

在rule.yml下添加如下规则:

apiVersion: v1
data:
  rule.yml: |
    ---
    groups:
    - name: pg-allen-ali
      rules:
      - alert: PodRestart
        expr: changes(kube_pod_container_status_restarts_total{namespace="pg-allen-ali"}[8m])
          > 0
        labels:
          receiver_group: [receivers email/phone]
          service: '{{ $labels.pod }}'
          severity: WARN
        annotations:
          container: '{{ $labels.container }}'
          ns: '{{ $labels.namespace }}'
          pod: '{{ $labels.pod }}'
          summary: Pod Restart
        for: 1m
      - alert: PodWaiting
        expr: kube_pod_container_status_waiting_reason{namespace="pg-allen-ali"} == 1
        labels:
          receiver_group: [receivers email/phone]
          service: '{{ $labels.pod }}'
          severity: ERROR
        annotations:
          container: '{{ $labels.container }}'
          ns: '{{ $labels.namespace }}'
          pod: '{{ $labels.pod }}'
          summary: Pod Waiting
        for: 10m
      - alert: DeploymentUnavailable
        expr: kube_deployment_status_replicas_unavailable{namespace="pg-allen-ali"} >
          0
        labels:
          receiver_group: [receivers email/phone]
          service: '{{ $labels.deployment }}'
          severity: FATAL
        annotations:
          deploy: '{{ $labels.deployment }}'
          ns: '{{ $labels.namespace }}'
          summary: Deployment Unavailable
        for: 10m
... ...

修改完prometheus rule后,reload:

curl -X POST http://[prometheus service ip]:9090/-/reload

4. 通过Prometheus-operator快速完成部署配置

prometheus-operator关注的是,如何快速部署和配置一套prometheus监控告警。

使用prometheus-operator完整的完成监控告警,至少需配置如下3个核心资源:

  • Prometheus,关于Prometheus的配置。
  • ServiceMonitor,定义Prometheus监控service,包含服务发现和metrics采集所需信息。
  • PrometheusRule,告警相关信息。

创建一个Prometheus资源:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  generation: 1
  labels:
    namespace: pg-allen-ali   ### 【修改为自己的namespace】
  name: prometheus
spec:
  alerting:            ### 配置告警所用的alertManager
    alertmanagers:
    - name: alertmanager
      namespace: kube-system
      port: http
  enableAdminAPI: false
  nodeSelector: {}
  retention: 60d
  ruleSelector:
    matchLabels:
      namespace: pg-allen-ali         ### 【修改为自己的namespace】
  serviceAccountName: prometheus
  serviceMonitorSelector:   ### 匹配的serviceMonitor
    matchLabels:
      namespace: pg-allen-ali
  storage:
    volumeClaimTemplate:     ### 配置存储数据所用Volume
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: prometheus-db
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
        storageClassName: alicloud-nas

创建一个ServiceMonitor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    namespace: pg-allen-ali   ### 【修改为自己的namespace】
  name: super-backend
spec:
  endpoints:
  - interval: 30s
    path: /metrics
    port: pg-allen-ali-super-backend-0      ### 【修改为自己的service的port名字】
    scheme: ""
    scrapeTimeout: 3s
    targetPort: ""
  selector:              ### 匹配service所用selector
    matchLabels:
      app: super-backend

创建一个PrometheusRule

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    namespace: pg-allen-ali      ### 【修改为自己的namespace】
  name: prometheusrule
spec:
  groups:
  - name: pg-allen-ali         ### 【修改为自己的namespace名】
    rules:
    - alert: go-threads
      annotations:
        summary: go_threads>2
      expr: go_threads>2
      labels:
        receiver_group: [email protected]        ### 【修改为自己的公司邮箱】
        service: pg-allen-ali      ### 【修改为自己的namespace】
        severity: ERROR

创建资源完毕后,可查看资源状态:

# kubectl get prometheus -n pg-allen-ali 
NAME         AGE
prometheus   27m
# kubectl get servicemonitor -n pg-allen-ali 
NAME            AGE
super-backend   27m
# kubectl get prometheusrule -n pg-allen-ali 
NAME             AGE
prometheusrule   27m

查看prometheus-operator控制的其他资源:

# kubectl get po -n pg-allen-ali  | grep prometheus
prometheus-prometheus-0          3/3     Running   1          30m
# kubectl get statefulset -n pg-allen-ali 
NAME                    READY   AGE
prometheus-prometheus   1/1     30m

等待一会(15分钟?),看看告警是否被触发?