在之前使用Prometheus Operator时,都是直接将默认的描述文件yaml运行起来,对k8s以及在k8s中运行的资源进行监控。但是最近在发现有很多的Prometheus 的CRD资源定义的属性不太了解,导致很多功能的使用走了弯路。
同时,最近需要对Prometheus做优化(资源占用等方面),在对Prometheus Operator中所定义的CRD缺少系统的完整的了解,让优化工作也举步维艰。现在不得不对Prometheus Operator中所定义的CRD来一次系统的学习,来解决工作中的难点了。我们这节将带来Prometheus CRD属性的讲解。
所有的CRD定义在setup目录下

0alertmanagerConfigCustomResourceDefinition.yaml
alertmanger的服务的定义
0alertmanagerCustomResourceDefinition.yaml
alertmanger的配置文件的定义
0prometheusCustomResourceDefinition.yaml
Prometheus服务的定义
0prometheusruleCustomResourceDefinition.yaml
Prometheus告警规则的定义 prometheus与alertmanger不同,没有prometheus 配置文件的定义,是因为Prometheus的配置文件由Prometheus Operator根据通过ServiceMonitor和PodMonitor等定义生成的,而无需配置文件的定义。
0podmonitorCustomResourceDefinition.yaml
PodMonitor的定义,Prometheus根据PodMonitor将需要监控的pod集成至Prometheus的targets
0servicemonitorCustomResourceDefinition.yaml
ServiceMonitor的定义,Prometheus根据ServiceMonitor将需要监控的service集成至Prometheus的targets
0probeCustomResourceDefinition.yaml
探针CRD,该资源的对象也会集成至Prometheus的targets
0thanosrulerCustomResourceDefinition.yaml
thanos的ruler组件定义,目前还不清楚引入thanos的ruler作用,会在后续的文章中讲解
我们将对Prometheus CRD的spec.properties中的重要属性定义进行了解。全面知道Prometheus CRD提供了哪些能力。
additionalAlertManagerConfigs
在prometheus中有一部分是对prometheus对接的alertmanger的配置项:

在上面我们知道没有prometheus 配置文件的CRD定义,如果我们需要对alertmanager_config做额外的配置时就需要用到该属性,该属性定义的secret的内容将会追加至该配置下。
有关alertmanager_config的配置可以参考prometheus的文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alertmanager_config
additionalAlertRelabelConfigs
在配置alertmanger_config时,可以指定relabel_config,将会将label的值替换成目标值。

如果需要额外的relabel_config,可以通过该属性指定的secret内容追加至relabel_config下。
additionalArgs
指定Prometheus 服务的启动参数,使用该属性需要注意,确定当前版本是否支持定义的启动参数或者启动参数设置是否正确,不然将会在prometheus启动时报错退出,造成Pod重启。
additionalScrapeConfigs
我们知道prometheus的targets列表由podMonitor、serviceMonitor、Probe定义的对象组成,但是同时也可以通过该属性指定的secret内容集成至prometheus的targets列表中,该配置对于prometheus 监控集群外部的exporter有着很大的用处。affinity
指定运行Prometheus Pod的亲和性,指定pod运行到期望的Node上。
alerting
定义prometheus对接的alertmanger地址详细信息,例如在prometheus的默认定义中包含以下内容,说明对接monitoring命名空间下alertmanger-main service的web端口。

allowOverlappingBlocks
允许从多个副本prometheus查询结果并合并,这个还是prometheus的试验中,不推荐使用。
apiserverConfig
配置Prometheus指定访问apiserver的host和鉴权方法,如果不配置该项,默认为将Prometheus部署在集群内部,且通过Pod内 var/run/secrets/kubernetes.io/serviceaccount/ 访问apiserver。
arbitraryFSAccessThroughSMs
指定prometheus是否可以访问容器内文件系统的任意文件。
baseImage
指定运行的镜像,已经被image属性取代。
configMaps
与Prometheus运行在同一命名空间内的configmap列表,指定了的configmap将会挂载至prometheus 容器的 etc/prometheus/configmaps 目录
containers
指定或修改与Prometheus 运行在同一个pod内通过Prometheus启动的容器。默认与prometheus运行在同一个pod内的容器如下:

若需要更改代理的模式,可以指定proxy,包括不限于修改启动参数等配置。若需要在该pod内指定thanos 的sidecar将prometheus采集的指标远程存储至对象存储,也可以在这里指定thanos sidecar容器。
disableCompaction
禁用prometheus压缩,prometheus每两个小时将在内存里的指标数据压缩并写入磁盘,开启这项将不会使数据落盘,适用于只需要短时间监控数据展示的模式。
enableAdminAPI
启用admin API,将支持通过api对prometheus集成的targets进行管理,也可以删除数据,关闭prometheus操作,如果没有特殊场景使用,不建议打开,如果打开能够在接口前面加一层代理做接口鉴权,保证数据安全性。
enableFeatures
允许访问prometheus已经禁用的功能。有些功能在prometheus内部由于版本升级被取代或者还处于试验功能,默认是不可访问的,如果需要访问,可以通过该参数访问。
例如 --enable-feature=expand-external-labels 允许将环境变量加在指标的label中。
--enable-feature=remote-write-receiver开启receiver模式,在后续的prometheus版本默认是打开的。
--enable-feature=exemplar-storage 指标中的示例label的key,例如自增的ID,或者链路跟踪的traceID等。
--enable-feature=memory-snapshot-on-shutdown定期内存快照,存储在磁盘避免由于重启带来的数据丢失
--enable-feature=agent 以agent模式允许prometheus,最有用的用途就是prometheus开启remotewrite时,无需做告警规则的评估等功能,可以开启agent模式
enableRemoteWriteReceiver
开启prometheus支持remote write协议写入指标。
enforcedBodySizeLimit
设置抓取对象指标存储的内存空间大小,目前是试验功能,该参数在prometheus2.28以上支持。
enforcedLabelLimit
限制抓取指标的label个数,如果超过限制,按照抓取失败处理,目前为试验功能在prometheus2.27.0以上支持
enforcedLabelNameLengthLimit
限制label的key长度,超过长度认为抓取失败,目前为试验功能在prometheus2.27.0以上支持
enforcedLabelValueLengthLimit
限制label的value长度,超过长度认为抓取失败,目前为试验功能在prometheus2.27.0以上支持
enforcedNamespaceLabel
支持将抓取对象的命名空间增加至指标和告警的label中,其中label的key为该参数指定的名称
enforcedSampleLimit
限制采集指标样本的数量
enforcedTargetLimit
限制抓取的target目标个数
evaluationInterval
prometheus配置文件中的evaluation_interval配置,多长时间对告警规则进行一次评估
excludedFromEnforcement
需要排除被prometheus引用的资源(prometheusrules、servicemonitors、podmonitors、probes),仅当enforcedNamespaceLabel设置为true生效
exemplars
在内存中保留的样本最大存储空间为多少。【可以验证下通过设置该值减少内存的占用】
externalLabels
需要增加至每个序列后额外的label。prometheus配置文件的external_labels配置项。
hostAliases
设置ip的别名,
ignoreNamespaceSelectors
将会忽略该配置下的命名空间内的podMonitor、serviceMonitor等资源
image、tag
指定运行的镜像、版本
imagePullSecrets
拉取镜像的授权配置参数对应的secret
initContainers
pod的初始化容器,目前默认的为init-config-reloader,做配置同步。
logFormat、logLevel
日志格式、日志级别
minReadySeconds
pod启动后最少多长时间为ready状态
nodeSelector
pod调度的node选择
overrideHonorLabels
当设置为true,prometheus会将抓取到的指标中的label冲突的项重命名为exporterd_
podMetadata
设置pod的label
podMonitorNamespaceSelector、podMonitorSelector
选择podMonitor的条件
portName
端口名称,默认为web
priorityClassName
pod的优先级,在k8s资源不足时,发生驱逐的优先级
probeNamespaceSelector、probeSelector
选择Probe的条件
prometheusExternalLabelName
prometheus实例的名称,默认为prometheus,如果设置为空,将不会添加external label 至指标。
prometheusRulesExcludedFromEnforce
不被集成至prometheusRule的CRD对象名称列表
query
启动prometheus指定的query参数
queryLogFile
指定query查询的日志路径
remoteRead、remoteWrite
远程读取、远程写入的url地址
replicaExternalLabelName
标记prometheus 副本的label名称,该label将不会添加至序列中作为标识
replicas
运行prometheus的副本数
resources
资源使用的声明
retention、retentionSize
prometheus从内存中持久化指标数据至磁盘的时间、空间
externalURL、routePrefix
访问prometheus的URL和访问接口的前缀设置
ruleNamespaceSelector、ruleSelector
选择rule CRD对象的条件 rules
告警规则相关配置,最小持续时间、最大持续时间、发送重复告警的最小时间
scrapeInterval、scrapeTimeout
抓取指标的周期时间、超时时间
secrets
指定需要挂载至prometheus容器该目录下(/etc/prometheus/secrets/)的所有secret
securityContext
配置容器运行的安全策略,是否root启动等
serviceAccountName
运行prometheus pod的serviceAccount名称,默认设置的为prometheus-k8s
serviceMonitorNamespaceSelector、serviceMonitorSelector
选择serviceMontor的条件
serviceMonitorSelector
运行prometheus容器的SHA值,默认为version的值
storage
prometheus 数据持久化设置
thanos
thanos环境运行的参数,该功能还只是试验阶段
tolerations、topologySpreadConstraints
pod的容忍度、调度的策略
version
prometheus 版本
volumeMounts、volumes
pod的挂载相关
walCompression
使用Snappy启用预写日志压缩
web
启动prometheus服务相关的web配置,是否https、证书等配置。
PrometheusRules的定义就很简单一个rule属性,其结构与prometheus 的rule定义一致,可以通过对应PrometheusRules配置告警规则。
这一节我们对kube-prometheus中对Prometheus CRD定义的属性进行了全面的了解,在后续的工作中如果对Prometheus Operator有特殊的使用场景,可以深入以上某些属性进行理解,满足生成实践。
往期回顾:
Prometheus Operator(四)- kube-Prometheus入门
Prometheus Operator(三)- Blackbox(黑盒)监控
Prometheus Operator(二)- 一文理清CRD
Prometheus Operator系列(一)- 一文搞懂ServiceMonitor




