添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

高可用prometheus:常见问题

监控系统的历史悠久,是一个很成熟的方向,而Prometheus作为新生代的开源监控系统,慢慢成为了云原生体系的事实标准,也证明了其设计很受欢迎。本文主要分享在prometheus实践中遇到的一些问题和思考

几点原则

  • 监控是基础设施,目的是为了解决问题,不要只朝着大而全去做,尤其是不必要的指标采集,浪费人力和存储资源(To B商业产品例外)

  • 需要处理的告警才发出来,发出来的告警必须得到处理

  • 简单的架构就是最好的架构,业务系统都挂了,监控也不能挂,Google SRE里面也说避免使用magic系统,例如机器学习报警阈值、自动修复之类。这一点见仁见智吧,感觉很多公司都在搞智能AI运维

prometheus 的局限

  • prometheus是基于metric的监控,不适用于日志(logs)、事件(event)、调用链(tracing)

  • prometheus默认是pull模型,合理规划你的网络,尽量不用pushgateway转发

  • 对于集群化、水平扩展,官方和社区都没有银弹,合理选择 federate、cortex、thanos

  • 监控系统一般 可用性>一致性,这个后面说 thanos 的时候会提到

合理选择黄金指标

我们应该关注哪些指标?Google在“SRE Handbook”中提出了“四个黄金信号”:延迟、流量、错误数、饱和度。实际操作中可以使用USE或RED 方法作为指导,USE用于资源,RED用于服务

  • USE 方法:Utilization、Saturation、Errors

  • RED 方法:Rate、Errors、Duration

对USE和RED的阐述可以参考 容器监控实践—K8S常用指标分析 这篇文章

采集组件all in one

prometheus 体系中 exporter 都是独立的,每个组件各司其职,如机器资源用 node-exporter,gpu 有NVIDIA exporter等等,但是 exporter 越多,运维压力越大,尤其是对 agent做资源控制、版本升级。我们尝试对一些exporter进行组合,方案有二:

  1. 通过主进程拉起n个exporter 进程,仍然可以跟着社区版本更新

  2. 用telegraf来支持各种类型的 input,n 合 1

另外,node-exporter 不支持进程监控,可以加一个process-exporter,也可以用上边提到的telegraf。

k8s 1.16中cadvisor的指标兼容问题

在 k8s 1.16版本,cadvisor的指标去掉了pod_name 和 container_name的label,替换为了pod 和 container。如果你之前用这两个 label 做查询或者 grafana 绘图,得更改下 sql 了。因为我们一直支持多个 k8s 版本,就通过 relabel配置继续保留了原来的**_name

metric_relabel_configs:
- source_labels: [container]
  regex: (.+)
  target_label: container_name
  replacement: $1
  action: replace
- source_labels: [pod]
  regex: (.+)
  target_label: pod_name
  replacement: $1
  action: replace

注意要用metric_relabel_configs,不是relabel_configs,采集后做的replace。

prometheus集群内与集群外部署

prometheus 如果部署在k8s集群内采集是很方便的,用官方给的yaml就可以,但我们因为权限和网络需要部署在集群外,二进制运行,专门划了几台高配服务器运行监控组件。

以 pod 方式运行在集群内是不需要证书的(in-cluster 模式),但集群外需要声明 token之类的证书,并替换 address 。例如:

kubernetes_sd_configs:
- api_server: https://xx:6443
  role: node
  bearer_token_file: token/xx.token
  tls_config:
    insecure_skip_verify: true
relabel_configs:
- separator: ;
  regex: __meta_kubernetes_node_label_(.+)
  replacement: $1
  action: labelmap
- separator: ;
  regex: (.*)
  target_label: __address__
  replacement: xx:6443
  action: replace
- source_labels: [__meta_kubernetes_node_name]
  separator: ;
  regex: (.+)
  target_label: __metrics_path__
  replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
  action: replace

上面是通过默认配置中通过apiserver proxy 到 let,如果网络能通,其实也可以直接把kubelet的10255作为 target,规模大的时候还减轻了 apiserver 的压力,不过这种方式就要写服务发现来更新 node列表了。

gpu 指标的获取

nvidia-smi可以查看机器上的gpu资源,而cadvisor 其实暴露了metric来表示 容器使用 gpu 情况,

container_accelerator_duty_cycle
container_accelerator_memory_total_bytes
container_accelerator_memory_used_bytes

如果要更详细的gpu 数据,可以安装 dcgm exporter ,不过k8s 1.13 才能支持

更改 prometheus的显示时区

prometheus为避免时区混乱,在所有组件中专门使用Unix time和UTC进行显示。不支持在配置文件中设置时区,也不能读取本机/etc/timezone时区。

其实这个限制是不影响使用的:

  • 如果做可视化,grafana是可以做时区转换的

  • 如果是调接口,拿到了数据中的时间戳,你想怎么处理都可以

  • 如果因为prometheus 自带的 ui不是本地时间,看着不舒服, 2.16 版本 的新版 webui已经引入了local timezone 的选项。区别见下图

  • 如果你仍然想改prometheus 代码来适应自己的时区,可以参考 这篇文章