是时候扔掉Prometheus了,VictoriaMetrics全家桶入门与K8S部署


架构

部署文件

项目仓库:https://github.com/starsliao/VictoriaMetrics

  • 本次将会部署以下组件:
  • cd monit/master && kubectl apply -f .
 master
 ├── 0.vm-single.yaml
 ├── 1.kube-state-metrics_v2.12.0.yaml
 ├── 1.node-exporter.yaml
 ├── 1.vmagent.yaml
 ├── 2.vmalert.yaml
 ├── 3.alertmanager.yaml
 ├── 4.alert-webhook.yaml
 └── 5.grafana.yaml
  1. vmagent是采集组件,负责采集指标;采集后远程写入VictoriaMetrics时序数据库。
  2. vmalert读取告警规则后,从VM查询数据进行评估,后发送给alertmanager进行告警;记录规则也会远程写入VM。
  3. vmagent + vmalert + VictoriaMetrics 组成了完整的Prometheus功能 + 远程存储。
  4. kube-state-metrics和node-exporter分别是采集K8S和主机指标的导出器。
  5. alert-webhook是Flask写的一个推送消息的组件,可以把alertmanager的告警根据路由规则推送给企微、钉钉、飞书。

    快速安装(服务端)

git clone https://github.com/starsliao/VictoriaMetrics.git
cd VictoriaMetrics
kubectl apply -f .
  • 部署yaml文件后,以上所有组件将安装到K8S的monit命名空间,并接入各个组件、K8S和节点的监控。
  • 你只需要登陆grafana配置数据源并导入看板接口实现K8S与节点的监控。
  • 安装后以上所有组件默认接入到监控与自动发现,并且根据告警规则进行告警推送。
  • 以下是各yaml文件的详细介绍描述,让您不仅仅是安装好VictoriaMetrics全家桶,还能明明白白的了解每个组件的关联、配置与作用。

部署(服务端)详细说明

VictoriaMetrics

  • 时序数据库,存储所有的指标信息;可水平扩容的本地全量持久化存储方案。

  • 对于低于每秒一百万个数据点的摄取率,官方建议使用单节点版本而不是集群版本。单节点版本可根据 CPU、内存和可用存储空间的数量进行扩展。单节点版本比集群版本更容易配置和操作,所以在使用集群版本之前要三思而后行。

  • kubectl apply -f 0.vm-single.yaml

  • YAML文件注意事项:

    1. -retentionPeriod=30d
      • 数据存储时长
    2. -httpAuth.username=ops
      • 数据库账号设置
    3. -httpAuth.password=wEFHr41Pa
      • 数据库密码设置
    4. resources
      • K8S资源限制
    5. storageClassName: local-path
      • PV,PVC配置(当前使用本地主机存储,使用其它类型外部存储的请根据实际情况调整)
      • 根据实际情况修改使用的storageClassName名称
    6. path: /k3s/data/vm-single
      • 本地主机存储的本地路径,需提前创建目录
    7. nodeSelectorTerms
      • 根据实际情况修改本地主机存储的节点名
    8. storage
      • 存储大小

node-exporter

  • 采集Linux组件的指标。
  • vmagent已经配置JOB自动发现资源。 kubectl apply -f 1.node-exporter.yaml

    kube-state-metrics

  • 采集K8S的指标。

  • vmagent已经配置JOB自动发现资源。 kubectl apply -f 1.kube-state-metrics_v2.12.0.yaml

    vmagent

  • 负责对配置或者自动发现的JOB进行pull方式采集,也支持接收push进来的指标。

  • kubectl apply -f 1.vmagent.yaml

  • YAML文件注意事项:

    1. ConfigMap

      • 兼容Prometheus的配置:采集间隔,JOB的配置(已经配置好了监控K8S和Node的支持自动发现的JOB)
      • external_labels是Prometheus的外部系统标签,用于多个Prometheus接入同一个VictoriaMetrics时,区分不同的Prometheus。每个vmagent都必须配置,key是origin_prometheus,value是该vmagent的名称。
    2. remoteWrite.url

      • 远程写url,注意修改了vm存储的账号密码这里要同步修改。
      • 如果服务端的vmagent和VM部署在同一个K8S下,url使用service地址,无需修改。
    3. resources
      • K8S资源限制

        vmalert

  • 读取告警规则,并查询VM时序数据库,触发告警则推送到alertmanager。

  • 查询记录规则,并写入VM时序数据库。
  • kubectl apply -f 2.vmalert.yaml
  • YAML文件注意事项:

    1. ConfigMap
      • 兼容Prometheus的rule配置:各类告警规则,记录规则(已经配置好了监控K8S和Node的告警规则)
      • rule规则中:alert是告警的名称,annotations.at是告警时@的人,annotations.description是告警的内容.
    2. -datasource.url
      • 查询的VM时序数据库地址
    3. -notifier.url
      • 通知的alertmanager地址
    4. -remoteWrite.url
      • 写入的VM时序数据库地址
    5. resources
      • K8S资源限制

alertmanager

  • 接收触发的告警,并根据条件路由到不同的通知服务。
  • kubectl apply -f 3.alertmanager.yaml
  • YAML文件注意事项:
    1. ConfigMap
      • 标准的alertmanager配置,注意webhook地址要配置alert-webhook的url。
      • alert-webhook的url的格式:
      • http://alert-webhook.monit/node/ddkey=钉钉群机器人ID
      • http://alert-webhook.monit/node/wckey=企微群机器人ID
    2. resources
      • K8S资源限制

alert-webhook

  • 通知服务,接收alertmanager推送的告警信息,再推送到企微或者钉钉。
  • 推送的内容为告警规则的:alertnamedescription
  • kubectl apply -f 4.alert-webhook.yaml
  • YAML文件注意事项:
    1. ALERTMANAGER_URL
      • alertmanager的外部访问URL,用于收到告警后可以点击进入告警屏蔽操作页面。
    2. DEFAULT_AT
      • 当告警规则没有配置@的人的时候,使用的默认@的人。

grafana

  • 展示告警数据的看板,请配置VM作为数据源,并导入K8S和Node的看板。
  • kubectl apply -f 5.grafana.yaml
  • 看板:https://grafana.com/orgs/starsliao/dashboards
  • YAML文件注意事项:

    1. GF_SECURITY_ADMIN_USER
      • 登录账号设置
    2. GF_SECURITY_ADMIN_PASSWORD
      • 等了密码设置
    3. resources
      • K8S资源限制
    4. storageClassName: local-path
      • PV,PVC配置(当前使用本地主机存储,使用其它类型外部存储的请根据实际情况调整)
      • 根据实际情况修改使用的storageClassName名称
    5. path: /k3s/data/grafana
      • 本地主机存储的本地路径,需提前创建目录
    6. nodeSelectorTerms
      • 根据实际情况修改本地主机存储的节点名
    7. storage
      • 存储大小

        部署(客户端)

  • K8S部署

    cd monit/client && kubectl apply -f .
    

部署(客户端)详细说明

vmagent

  • 负责对配置或者自动发现的JOB进行pull方式采集,也支持接收push进来的指标。

  • kubectl apply -f 0.vmagent.yaml

  • YAML文件注意事项:
    1. ConfigMap
      • 兼容Prometheus的配置:采集间隔,JOB配置
      • external_labels是Prometheus的外部系统标签,用于多个Prometheus接入同一个VictoriaMetrics时,区分不同的Prometheus。每个vmagent都必须配置,key是origin_prometheus,value是该vmagent的名称。
    2. remoteWrite.url
      • 远程写url,注意修改了VM存储的账号密码这里要同步修改。
      • 这是客户端连接VM的url,注意网络通讯正常。
    3. resources
      • K8S资源限制

node-exporter

  • 采集Linux组件的指标。
  • vmagent已经配置JOB自动发现资源。 kubectl apply -f 1.node-exporter.yaml

    kube-state-metrics

  • 采集K8S的指标。

  • vmagent已经配置JOB自动发现资源。 kubectl apply -f 1.kube-state-metrics_v2.12.0.yaml

    客户端主动push指标到vmagent

  • 针对vmagent无法请求到客户端的情况,客户端可以通过curl获取自身指标,然后推送到vmagent。

    # URI中传入3个标签:job,instance,origin_prometheus
    # 命令写入到crontab,每分钟执行一次。
    curl -s http://localhost:9100/metrics | curl --data-binary @- http://10.0.0.26:8429/api/v1/import/prometheus/metrics/job/node-exporter/instance/10.0.0.26:9100/origin_prometheus/node-push
    # 调试 
    while true; do curl -s http://localhost:9100/metrics | curl --data-binary @- http://10.0.0.26:8429/api/v1/import/prometheus/metrics/job/node-exporter/instance/10.0.0.26:9100/origin_prometheus/node-push; sleep 15; done