Skip to content

Prometheus Agent 调研文档以及部署

EZ4BRUCE edited this page Dec 1, 2022 · 3 revisions

简介

Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具

image

Prometheus Agent Mode 是 Prometheus v2.32.0-beta.0 开始启用的新特性,Agent 模式允许 Prometheus 作为采集 Agent 采集指标记录,启用该模式会关闭查询、告警、本地存储等功能,与此同时我们还需要为 Agent 配置 Remote Write 接收其采集的输出,Prometheus 本身就可以提供此功能,也可以接入第三方的实现了该接口的服务(比如Thanos)

image

Agent Mode 是2021年11月发布的新特性,目前官网还没有具体的文档,仅有一篇官方博客可以参考

部署说明

如果要在独立的 Prometheus 上配置 Agent 模式其实很简单,只需要定义一下 yaml 并apply即可,需要注意的是要提供 remote-write 的 url

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  labels:
    app.kubernetes.io/name: prometheus
    prometheus: agent
  name: agent
  namespace: openshift-monitoring
spec:
  image: quay.io/prometheus/prometheus:v2.32.0-beta.0
  containers:
  - name: prometheus
    args:
    - '--config.file=/etc/prometheus/config_out/prometheus.env.yaml'
    - '--storage.agent.path=/prometheus'
    - '--enable-feature=agent'
    - '--web.enable-lifecycle'
  - url: http://prometheus-receiver:9090/api/v1/write
    remoteTimeout: "5s"
  replicas: 1

但是很遗憾,目前目前没法通过 prometheus-operator 来部署 Prometheus Agent ,原因是官方 prometheus-operator 尚未支持该特性,虽然贡献者称后续会开发(请见 issue

尽管目前有一些比较 hack 的方法勉强使用(官方不推荐)但是又由于 helm 在加载配置的一些原因(请见 issue),没法将这个比较 hack 的方法应用到使用 helm 部署 Prometheus ,所以目前除非修改 prometheus-operator 源码重新编译,没有别的解决方法使用 Prometheus Agent,只能等prometheus-operator 更新,在github社区还是有挺多针对 Agent Mode 的 issue,官方也宣称会更新该特性

hack方法需要拉取 Kube-Prometheus 的代码并定制化后重新编译,不太适合线上部署,具体的文档如下:

另辟蹊径

在等待 prometheus-operator 更新的时候也还是有后备的过渡方案,其实 Agent Mode 的本质是关闭本地磁盘存储,关闭查询、告警等其他功能,只将采集到的东西发往配置好的 remote write endpoint,而普通模式的 Prometheus 也是支持的,所以我们可以在配置里手动把 alertmanagerpushgateway等其他部件关闭,并设定本地磁盘存储策略,缩短其保留时间(也就是过期时间),近似的让他成为一个“agent”

prometheus:
  prometheusSpec:
    # 配置remote write
    remoteWrite:
    # 注意这里要加上 http:// 否则会报错
    - url: http://10.96.143.139:9090/prom-write        
    serviceMonitorSelectorNilUsesHelmValues: false
    # 本地存储保留时间
    retention: 30m
    # 本地保留最大大小
    retentionSize: 4GB

这么做的话,会保留规则计算的模块,但如果我们不配置告警规则的话,这方面的占用应该不会很高

完整的配置见附录,关于 Prometheus 官方的字段名称映射可以查看此文档

部署流程

# 创建命名空间
kubectl create namespace agent
# helm一键发布(注意要带上命名空间)
helm install -f agent.yaml -n agent prometheus-opearter-stack ./ 
# 卸载发布也要带上命名空间
helm uninstall prometheus-opearter-stack -n agent
# 更新发布(如果变更了配置时)
helm upgrade prometheus-opearter-stack ./ -f agent.yaml -n agent

可以通过以下命令来查看日志以定位部署失败的原因:

kubectl logs -f prometheus-prometheus-opearter-stack-prometheus-0 -c prometheus -n agent --previous

附录

agent.yaml

pushgateway:
  enabled: false

grafana:
  enabled: false

defaultRules:
  create: false

alertmanager:
  enabled: false

prometheusOperator:
  kubeletService:
    enabled: false

prometheus:
  prometheusSpec:
    remoteWrite:
    - url: http://10.96.143.139:9090/prom-write    
    # 当前不支持,会报错,后续官方支持了以后会用到
    # enableFeatures: ["agent"]
    # AdditionalArgs: 
    # - name: '--storage.agent.path'
    #   value: /prometheus
    # - name: '--enable-feature'
    #   value: agent
    # - name: '--web.enable-lifecycle'
    #   value:
    # - name: '--config.file'
    #   value: /etc/prometheus/config_out/prometheus.env.yaml
    # - name: '--storage.tsdb.retention.time'
    #   value:
    # - name: '--storage.tsdb.path' 
    #   value:
    # - name: '--storage.tsdb.wal-compression'
    #   value:
  
    serviceMonitorSelectorNilUsesHelmValues: false
    # 本地存储保留时间
    retention: 30m
    # 本地保留最大大小
    retentionSize: 4GB

prometheus-node-exporter:
  # enabled: false
  

kube-state-metrics:
  # enabled: false
  # image:
  #   repository: sea.hub:5000/kube-state-metrics/kube-state-metrics
  # prometheus:
  #   monitor:
  #     enabled: false

kubelet:
  ## Enable scraping /metrics/cadvisor from kubelet's service
  ##
  enabled: false
  cAdvisor: false

kubeApiServer:
  enabled: false

coreDns:
  enabled: false

kubeControllerManager:
  enabled: false

kubeEtcd:
  enabled: false

kubeProxy:
  enabled: false

kubeScheduler:
  enabled: false