Prometheus Operator心得

2024-08-30 17:13:48 浏览数 (3)

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

0 人点赞