Prometheus Operator心得,解析与Prometheus的差异,通过实际案例分享配置技巧,相信你看完会有收获。
01、背 景
随着云原生的崛起,Kubernetes的资源监控变得尤为重要, Prometheus因其强大的功能和丰富的生态系统,成为了Kubernetes监控的事实标准。然而,Prometheus的配置和管理在复杂的Kubernetes环境中可能面临一些挑战,例如手动配置监控目标和报警规则等。为了解决这些问题,Prometheus Operator应运而生。
02、Prometheus Operator介绍
Prometheus Operator为监控Kubernetes Service、Deployment和Prometheus实例的管理提供了简单的定义,简化在Kubernetes上部署、管理和运行Prometheus和Alertmanager集群。
Prometheus Operator 主要特性如下:
- 简化部署和管理:通过自定义资源定义(CRD),Prometheus Operator可以自动处理Prometheus及其相关组件的部署和配置更新。只需更新相应的CRD,Prometheus Operator会自动应用这些更改。
- 自动服务发现:利用ServiceMonitor和PodMonitor,Prometheus Operator能够自动发现并监控Kubernetes集群中的服务和Pod,无需手动配置监控目标。
- 高可用性配置:支持高可用性模式的Prometheus和Alertmanager集群,通过指定多个副本,确保监控系统的高可用性和可靠性。
- 与Kubernetes无缝集成:深度集成Kubernetes,利用ConfigMap、Secret、PersistentVolume等Kubernetes原生功能,提供与Kubernetes无缝集成的监控解决方案。
它使用如下的 Kubernetes CRD 资源对 Prometheus进行配置:
- Prometheus:配置和管理 Prometheus 实例
- Alertmanager:配置和管理 Alertmanager 实例,用于处理告警
- ThanosRuler:配置和管理 Thanos Ruler 实例,用于规则评估和告警
- ServiceMonitor:定义要由 Prometheus 监控的服务及其端点
- PodMonitor:定义要由 Prometheus 监控的 Pod 及其端点
- Probe:定义主动探测配置,类似于 HTTP 检查
- PrometheusRule:定义 Prometheus 规则,包括告警规则和记录规则
- AlertmanagerConfig:定义 Alertmanager 的额外配置,例如路由和接收器
总而言之,Prometheus Operator更加贴合Kubernetes,它使得Prometheus的配置和维护更加便捷,接下来将介绍ServiceMonitor和Prometheus CRD的配置,了解与Prometheus的配置差异。
03、ServiceMonitor的配置
在前面提到ServiceMonitor用于服务发现,我理解的工作原理是,ServiceMonitor借助标签选择器(selector)和命名空间选择器(namespaceSelector)去发现服务,然后通过定义的端点(endpoint)和路径(path)来收集监控指标数据,下面是一个配置示例:
ServiceMonitor会去kube-system命名空间下找到带有app: pvc-monitor标签的服务,然后从定义的端点 路径/metrics采集监控指标数据
代码语言:javascript复制apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: pvc-monitor
app.kubernetes.io/part-of: kube-prometheus
name: pvc-monitor
namespace: monitoring-system
spec:
endpoints:
- interval: 1m
path: /metrics
relabelings:
- action: replace
sourceLabels:
- pvc
targetLabel: persistentvolumeclaim
- action: labeldrop
regex: (service|endpoint)
port: http
scheme: http
jobLabel: app.kubernetes.io/name
namespaceSelector:
matchNames:
- kube-system
selector:
matchLabels:
app: pvc-monitor
在实际应用场景中,为了简化工作,我们也会把集群外的资源通过ServiceMonitor进行发现和监控,就拿主机监控来说,我们会在k8s集群中创建一个自定义service,命名为custom-node-exporter,然后在服务器初始化的流程中将其注册到custom-node-exporter的endpoints中,如下是一串实现注册的ansible-playbook脚本:
代码语言:javascript复制- name: Register node-exporter endpoint with Kubernetes service
delegate_to: "{{ k8s_server_ip }}"
vars:
namespace: "{{ k8s_namespace }}"
service_name: "{{ k8s_service_name }}"
port: "{{ node_exporter_port }}"
current_host_ip: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
command: >
kubectl patch endpoints {{ service_name }} -n {{ namespace }}
--type='json'
-p='[{"op": "add", "path": "/subsets/0/addresses/-", "value": {"ip": "{{ current_host_ip }}"}}]'
when:
- ansible_default_ipv4.address != "{{ k8s_server_ip }}"
- not ip_exists
04、Prometheus CRD的配置
在Prometheus Operator中,Prometheus服务的实例和配置是通过Prometheus CRD进行管理的,举个栗子,假设我们从Prometheus迁移到Prometheus Operator后,有部分exporter在k8s集群外,我们需要保留原有的scrape configs配置,那么可以通过修改Prometheus CRD进行实现,具体如下:
1. 编辑Prometheus CRD,不能直接修改prometheus.yml了哈:
代码语言:javascript复制kubectl edit prometheuses k8s -n monitoring-system
添加配置,保存后不需要重启
代码语言:javascript复制spec:
additionalScrapeConfigs:
key: prometheus-additional.yaml
name: additional-scrape-configs
- 然后将原有的scrape configs配置保存到prometheus-additional.yaml文件中,如:
- job_name: 'kafka-exporter'
static_configs:
- targets: ['xxxx:9308']
relabel_configs:
- source_labels: [job]
action: replace
target_label: prometheus_replica
regex: (.*)
replacement: $1:1
3.接着将prometheus-additional.yaml的内容进行base64编码,保存为config_encoded.yaml
代码语言:javascript复制cat prometheus-additional.yaml | base64 | tr -d 'n' > config_encoded.yaml
4.将config_encoded.yaml的内容粘贴到<新的Base64编码值>位置,保存为secret.yaml
代码语言:javascript复制apiVersion: v1
data:
prometheus-additional.yaml: <新的Base64编码值>
kind: Secret
metadata:
name: additional-scrape-configs
namespace: monitoring-system
type: Opaque
5.最后应用更新后的secret,也就完成了所有配置
代码语言:javascript复制kubectl apply -f secret.yaml
- 后续配置变更,则将第2步调整为如下指令,先将当前的prometheus-additional.yaml配置导出,修改后再进行base64编码和应用更新:
kubectl get secret additional-scrape-configs -n monitoring-system -o jsonpath="{.data.prometheus-additional.yaml}" | base64 --decode > prometheus-additional.yaml
05、结 语
总而言之,Prometheus Operator 很强大,通过与 Kubernetes 的深度集成,实现了对 Prometheus 及其相关组件的自动化管理,简化了监控系统的部署和维护过程,是 Kubernetes 环境中监控系统的理想选择。
参考文档
https://cloud.tencent.com/developer/article/2282565