Prometheus Operator心得

文摘   2024-07-15 10:06   中国香港  


点击上方

蓝字·关注我们

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采集监控指标数据
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:  labels:    app.kubernetes.io/component: exporter    app.kubernetes.io/name: pvc-monitor    app.kubernetes.io/part-of: kube-prometheus  name: pvc-monitor  namespace: monitoring-systemspec:  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脚本:
- 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了哈:
kubectl edit prometheuses k8s -n monitoring-system
添加配置,保存后不需要重启
spec:  additionalScrapeConfigs:    key: prometheus-additional.yaml    name: additional-scrape-configs
  1. 然后将原有的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

cat prometheus-additional.yaml | base64 | tr -d '\n' > config_encoded.yaml

4.将config_encoded.yaml的内容粘贴到<新的Base64编码值>位置,保存为secret.yaml

apiVersion: v1data:  prometheus-additional.yaml: <新的Base64编码值>kind: Secretmetadata:  name: additional-scrape-configs  namespace: monitoring-systemtype: Opaque

5.最后应用更新后的secret,也就完成了所有配置

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
欢迎订阅我的公众号「SRE运维手记」,可扫下方二维码,或者微信搜“SRE运维手记”

文章转载自SRE运维手记点击这里阅读原文了解更多



CNCF概况(幻灯片)

扫描二维码联系我们!




CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 

CNCF云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。

CNCF
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。
 最新文章