转载:https://developer.aliyun.com/article/1139137
1、概念区分
Prometheus-Operator vs Prometheus vs Kube-Pormetheus
这属于3个不同的开源项目
- Prometheus:用于日常监控,收集服务器、容器集群等监控指标,可以作为grafana展示平台的数据源。
- Prometheus Operator:用于管理Prometheus,Operator本身不做监控,可以看成是Prometheus的自动化运维工具,类似一个配置翻译器,将配置翻译成Prometheus的标准配置文件prometheus.yml。
- Kube-Prometheus:是当前主流的Kubernetes集群监控的主流项目,采用Prometheus做集群监控,使用Prometheus-Operator做监控的运维管理。
2、Prometheus和Prometheus-Operator架构对比
2.1、Prometheus架构:
- Prometheus主要由以下部分组成:
- Prometheus Server:用于抓取和存储时间序列化数据
- Exporters:主动拉取数据的插件
- Pushgateway:被动拉取数据的插件
- Altermanager:告警发送模块
- Prometheus web UI:界面化,也包含结合Grafana进行数据展示或告警发送
2.2、Prometheus-Operator架构:
Operator是核心部分,作为一个控制器,负责部署和管理Prometheus Server。 Operator是Kubernetes的一种自定义资源控制器,就如同Kubernetes中的deployment contorller、ingress controller等控制器对deployment和ingress资源进行管理,同理Prometheus-Operator控制器会管理控制Prometheus相关资源。 Prometheus-Operator根据相关的CRD(servicemonitor)配置及时更新Prometheus server的监控对象(targets),简化运维人员对server端的部署与维护。
如创建Prometheus、ServiceMonitor、AlertManager及PrometheusRule这4个CRD资源对象,然后监控并维持这4个CRD资源对象的状态。
- Prometheus资源对象是作为Prometheus Server存在的。
- ServiceMonitor资源对象是专门提供metrics数据接口的exporter的抽象。
- Alertmanager资源对象是对应AlertManager组件的抽象
- PrometheusRule资源对象是被Prometheus实例使用的告警规则文件的抽象。
通过以上的4个资源对象,就可以直接对Kubernetes集群直接操作了,上图的Service和ServiceMonitor都是Kubernetes的资源。一个ServiceMonitor可以通过labelSelector匹配一类Service,Prometheus也可以通过labelSelector匹配多个ServiceMonitor,而且Prometheus和AlertManager都是自动感知监控告警配置的变化,需要人为的进行reload操作。Prometheus Operator才是Kubernetes集群监控的终极武器。 图片来自https://v1-0.choerodon.io/zh/blog/prometheus-operator-introduce
3、Prometheus-Operator CRD资源
Prometheus-Operator 是重点,以deployment的形式存在,其中包含了所有CRD的schema定义、模型,以及各CRD的处理逻辑。它负责部署并管理相关CRD资源,定期循环watch apiserver, 将相关的CRD更新/配置更新及时应用到运行中的prometheus系统中。 这些CRD都是一些方便使用人员配置的项目,以k8s用户熟悉的方式(label、selectors)定义prometheus的scrap job, 支持多种label比较方式: In, NotIn, Exists, DoesNotExists 。 k8s用户更新CRD后,最终会被operator翻译成prometheus标准的配置文件,prometheus.yml完成自动更新和生效,无需重启prometheus实例。 每一个CRD的标准格式不赘述,在配置环节会有具体示例。以下CRD可以通过kubectl get xx 获取具体信息。
CRD 名称 | 作用 |
---|---|
Prometheus | 最核心的一个CRD, 控制prometheus server的statefulset状态。该CRD用于部署、管理prometheus stateful实例,以及配置该prometheus实例与ServiceMonitor(通过serviceMonitorNamespaceSelector标签)、Altermanager(通过alertmanagers标签)、PromtheusRule(通过ruleSelector标签)之间的关联。 一个Prometheus crd 资源创建后,promtheus-operator会自动创建一个prometheus stateful实例。 |
ServiceMonitor | 纯配置,Operator告诉prometheus server , 要监控的 targets是基于k8s service动态发现。 Operator基于servicemonitor的配置生成promtheus的标准配置文件promtheus.yml。注意的是,ServiceMonitor中的endpoint被转换为prometheus.yml中的kubernetes_sd_configs标签,即服务发现仍然是通过prometheus的原生能力完成的,ServiceMonitor或prometheus-operator并不具备服务发现能力,仅仅是配置转换与应用能力。 |
PodMonitor | 纯配置,类似于ServiceMonitor,只不过要监控的 targets是基于k8s pod label 动态发现,是针对pod级别的scrap job。 |
Alertmanager | 用于部署和管理promtheus的Altermanager实例.一个Altermanager资源定义会对应于一个stateful实例,prometheus-opertaor会根据Alertmanager中指定replicas、image、RBAC等信息将promtheus的altermanager pod部署,prometheus实例会自动与该Alertmanager相关联,共同完成监控->告警的链路。 |
PrometheusRule | 用于生成promtheus的告警规则文件.纯配置项。promtheus-operator会将该资源转换为prometheus的rule文件,挂在于prometheus实例的文件系统中: |
alertmanagerconfigs | Alertmanager配置, 默认无配置。 |
probes | 默认无配置。 |
thanosrulers | 控制Thanos deployment, 默认无配置。 |
4、Prometheus-Operator 配置更新流程
Prometheus Server 可以通过静态配置static_configs管理监控目标,也可以配合使用 Service/Pod Discovery 的方式(sd_config)动态管理监控目标,并从这些监控目标中获取数据。 Prometheus-operator 通过定期循环watch apiserver,获取到CRD资源(比如servicemonitor)的创建或者更新,将配置更新及时应用到运行中的prometheus pod中转换成标准promethesu配置文件供prom server使用。
Operator CRD配置之间的匹配关系 使用CRD做prometheus配置,“匹配”是一个很重要的细节,详细匹配关系如图,任何地方匹配失败会导致转化成的标配prometheus文件无法识别到targets。
配置间的匹配总结就是: ServiceMonitor注意事项: • ServiceMonitor的label 需要跟prometheus中定义的serviceMonitorSelector一致 • ServiceMonitor的endpoints中port时对应k8s service资源中的portname, 不是port number. • ServiceMonitor的selector.matchLabels需要匹配k8s service中的label • ServiceMonitor资源创建在prometheus的namespace下,使用namespaceSelector匹配要监控的k8s svc的ns. • servicemonitor若匹配多个svc,会发生数据重复 PodMonitor注意事项: • PodMonitor的label 需要跟prometheus中定义的podMonitorSelector一致 • PodMonitor的spec.podMetricsEndpoints.port 需要写pod中定义的port name,不能写port number。 • PodMonitor的selector.matchLabels需要匹配k8s pod 中的label • PodMonitor资源创建在prometheus的namespace下,使用namespaceSelector匹配要监控的k8s pod的ns.