前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometheus Operator心得

Prometheus Operator心得

作者头像
SRE运维手记
发布2024-08-30 17:13:48
640
发布2024-08-30 17:13:48
举报
文章被收录于专栏:SRE运维手记

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
  1. 然后将原有的scrape configs配置保存到prometheus-additional.yaml文件中,如:
代码语言:javascript
复制
- 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编码和应用更新:
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维手记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Prometheus 监控服务
Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档