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 主要特性如下:
它使用如下的 Kubernetes CRD 资源对 Prometheus进行配置:
总而言之,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/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脚本:
- 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
- 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: v1
data:
prometheus-additional.yaml: <新的Base64编码值>
kind: Secret
metadata:
name: additional-scrape-configs
namespace: monitoring-system
type: Opaque
5.最后应用更新后的secret,也就完成了所有配置
kubectl apply -f secret.yaml
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