在微服务分布式系统中,监控是极其重要的。监控能够对系统的运行状态了如指掌,有问题及时发现。
监控的目的:
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpserver-metrics-deploy
labels:
app: httpserver-metrics
namespace: default
spec:
selector:
matchLabels:
app: httpserver-metrics
replicas: 1
template:
metadata:
labels:
app: httpserver-metrics
#增加注解
annotations:
prometheus.io/port: "80"
prometheus.io/scrape: "true"
spec:
containers:
- name: httpserver
image: httpserver-metrics:v1.0
ports:
- containerPort: 80
pod需要显示的增加annotations:prometheus.io/port和prometheus.io/scrape,这样Prometheus才会收集这个pod的指标。默认情况下,应用往/metrics暴露指标即可,Prometheus会从应用的/metrics收集指标。若应用有特定的指标暴露路径,那么Prometheus的配置文件指定自定义指标路径。
之所以说Prometheus是云原生的监控标准,因为kubernetes的很多组件都原生的暴露Prometheus 格式的 metrics。所以Prometheus很容易就收集到这些指标。
cAdvisor (Container Advisor) 是一个用于监控和收集容器资源使用情况的开源工具。cAdvisor 默认会收集以下几个主要的容器指标:
每个节点的kubelet集成了cAdvisor ,Prometheus 会 pull 这些信息,给每个节点打上标签来区分不同的节点。
例如cAdvisor其中一个监控指标container_cpu_usage_seconds_total(容器在每个CPU内核上的累积占用时间 (单位:秒)),上报了每个pod容器的这个指标。
Node Exporter 是prometheus官方提供的agent,用于收集主机的硬件和操作系统指标。
例如node_cpu_seconds_total,它代表CPU每种模式下花费的时间,是counter型的,会随着时间一直增长。其标签,cpu表示第几个核,instance表node_exporter所在机器,job表示来自prometheus配置的哪个任务,mode表示这是cpu处于哪种模式。
云原生提倡的是动态的系统,也就是说pod ip是会经常发生变化的,那么Prometheus如何获取到这些要收集指标的target,kubernetes体系下的服务注册中心是什么?我们知道,kubernetes的服务注册中心是apiserver,依赖etcd进行存储。
Prometheus配置文件定义了file_sd_configs(file service discovery)
targets是拉取指标的地址,labels表示拉取的指标都要打上这些标签。
为什么需要relabel?
面对以上需求,我们实际上希望Prometheus Server能够按照某些规则(比如标签)从服务发现注册中心返回的Target实例中有选择性的采集某些Exporter实例的监控数据。
Relabel示例:
这也就是为什么pod上要加prometheus.io/scrape注解的原因了。