Prometheus 监听指定标签 Kubernetes 服务
文章目录
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。
系统环境:
- 操作系统: CentOS 7.9
- Docker 版本: 20.10.8
- Prometheus 版本: 2.29.1
- Kubernetes 版本: 1.20.2
系列文章目录
- 01. Kubernetes 部署监控工具 Prometheus
- 02. Kubernetes 部署图表工具 Grafana
- 03. Prometheus 结合 Node Exporter 监控 Kubernetes 集群节点
- 04. Prometheus 结合 StateMetrics+cAdvisor 监控 Kubernetes 集群服务
- 05. Prometheus 监听指定标签 Kubernetes 服务
- 06. Prometheus 监控 Kubernetes ETCD 集群
- 07. Prometheus Exporter 黑盒监控 Kubernetes 服务
- 08. Kubernetes 部署告警工具 AlertManager
- 09. AlertManager 配置邮箱告警
- 其它章节整理中...
一、Prometheus 如何自动采集 Kubernetes 服务
在 Kubernetes 中存在静态配置和动态配置两种:
- 静态配置方式: 静态配置方式就是将要采集的 目标地址、目标端口、目标接口 添加到 Prometheus 配置文件中。
- 动态配置方式: 动态配置方式就是使用服务发现机制,动态发现指定的服务。Prometheus 中支持 Eureka、Consul、DNS、Kubernetes 等动态服务发现,可以在连接这些组件后,根据指定条件获取到要采集的目的地址、端口、接口等信息,然后添加到 Prometheus Target 目标中。
这里要实现 Prometheus 自动采集 Kubernetes 服务指标数据,就需要使用上面提及的“动态配置方式”,使用 Kubernetes 服务发现机制,再结合指定注释,标记哪些服务需要被 Prometheus 采集数据,就能实现 Prometheus 自动采集 Kubernetes 服务指标数据的目的。
二、Prometheus 添加 Kubernetes 服务发现配置
首先创建 Prometheus 配置文件,在里面添配置参数,使用 Kubernetes endpoints 服务发现机制,并且配置标签,这样服务发现只会发现带有指定 annotations
的 Service
资源。
Prometheus 配置文件内容如下:
1scrape_configs:
2- job_name: 'kubernetes-service-endpoints'
3 kubernetes_sd_configs:
4 - role: endpoints
5 relabel_configs:
6 - action: keep
7 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
8 regex: "true"
9 - action: replace
10 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
11 regex: (https?)
12 target_label: __scheme__
13 - action: replace
14 source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
15 regex: ([^:]+)(?::\d+)?;(\d+)
16 target_label: __address__
17 replacement: $1:$2
18 - action: replace
19 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
20 regex: (.+)
21 target_label: __metrics_path__
22 - action: labelmap
23 regex: __meta_kubernetes_service_label_(.+)
24 - action: replace
25 source_labels: [__meta_kubernetes_namespace]
26 target_label: kubernetes_namespace
27 - action: replace
28 source_labels: [__meta_kubernetes_service_name]
29 target_label: kubernetes_name
30 - action: replace
31 source_labels: [__address__]
32 target_label: instance
33 regex: (.+):(.+)
下面对上面配置逐一添加注释解释配置作用,如下:
1scrape_configs:
2- job_name: 'kubernetes-service-endpoints'
3 ## 使用endpoints服务发现
4 kubernetes_sd_configs:
5 - role: endpoints
6 ## 标签重定义配置
7 relabel_configs:
8 ## 是否采集Service对应的Pod中的指标,设置 prometheus.io/scrape="true即采集,空或者false则不采集"
9 - action: keep
10 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
11 regex: "true"
12 ## 指定scheme为 http或者https
13 - action: replace
14 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
15 regex: (https?)
16 target_label: __scheme__
17 ## 根据prometheus.io/port标签配置的端口号进行指标采集"
18 - action: replace
19 source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
20 regex: ([^:]+)(?::\d+)?;(\d+)
21 target_label: __address__
22 replacement: $1:$2
23 ## 根据prometheus.io/path标签配置路径进行指标采集"
24 - action: replace
25 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
26 regex: (.+)
27 target_label: __metrics_path__
28 ## 获取service资源中的label指标对
29 - action: labelmap
30 regex: __meta_kubernetes_service_label_(.+)
31 ## 获取namespace
32 - action: replace
33 source_labels: [__meta_kubernetes_namespace]
34 target_label: kubernetes_namespace
35 ## 获取service名称
36 - action: replace
37 source_labels: [__meta_kubernetes_service_name]
38 target_label: kubernetes_name
39 ## 配置instance标签
40 - action: replace
41 source_labels: [__address__]
42 target_label: instance
43 regex: (.+):(.+)
三、将 Prometheus 配置存入 ConfigMap 资源中
由于之前是基于 Kubernetes 部署的 Prometheus,且将其配置参数写到 Kubernetes 的 ConfigMap 资源中,然后通过挂载 ConfigMap 到 Pod 内部,这样修改 ConfigMap 就可以修改 Prometheus 配置。
所以这里将上面 Prometheus 中的配置存入到 Kubernetes 中的 ConfigMap 资源文件 prometheus-config.yaml
中,资源内容如下:
1kind: ConfigMap
2apiVersion: v1
3metadata:
4 name: prometheus-config
5 namespace: kube-system
6data:
7 prometheus.yml: |
8 global:
9 scrape_interval: 15s
10 evaluation_interval: 15s
11 external_labels:
12 cluster: "kubernetes"
13 scrape_configs:
14 ############################### kubernetes-service-endpoints #########################################
15 - job_name: 'kubernetes-service-endpoints'
16 kubernetes_sd_configs:
17 - role: endpoints
18 relabel_configs:
19 - action: keep
20 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
21 regex: "true"
22 - action: replace
23 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
24 regex: (https?)
25 target_label: __scheme__
26 - action: replace
27 source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
28 regex: ([^:]+)(?::\d+)?;(\d+)
29 target_label: __address__
30 replacement: $1:$2
31 - action: replace
32 source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
33 regex: (.+)
34 target_label: __metrics_path__
35 - action: labelmap
36 regex: __meta_kubernetes_service_label_(.+)
37 - action: replace
38 source_labels: [__meta_kubernetes_namespace]
39 target_label: kubernetes_namespace
40 - action: replace
41 source_labels: [__meta_kubernetes_service_name]
42 target_label: kubernetes_name
43 - action: replace
44 source_labels: [__address__]
45 target_label: instance
46 regex: (.+):(.+)
执行下面命令,更新 ConfigMap 资源中的配置参数:
- -f: 指定要部署的资源文件。
- -n: 指定 Namespace 名称。
1$ kubectl apply -f prometheus-config.yaml -n kube-system
执行下面命令,使 Prometheus 重新加载 ConfigMap 中的参数配置:
这里本人的 Prometheus 地址是 http://192.168.2.32:30900
1$ curl -XPOST http://192.168.2.32:30900/-/reload
四、配置 Prometheus 自动采集 CoreDNS 服务指标
接下来准备测试一下配置是否生效,这里我们使用 Kubernetes 的 DNS 组件进行测试,因为 CoreDNS 默认是提供 Prometheus Metrics 指标数据,方便我们对其进行采集。
我们可以在 CoredDNS 的 Service 资源上,添加上面我们 Prometheus 配置中设置的注解,这样 Prometheus 就能够自动从其注解中配置的地址获取暴露的指标接口,从其采集相应的数据。
4.1 设置 CoreDNS 的 Service 资源添加指定标签
编辑 Service 资源 kube-dns,执行命令如下:
1$ kubectl edit service kube-dns -n kube-system
在 annotations 中添加 prometheus.io/scrape
、prometheus.io/scheme
、prometheus.io/port
、prometheus.io/path
四个注解,表示该 Service 关联的 Pod 需要被 Prometheus 采集,其中指标暴露的端口是 9153
,获取指标数据的路径是 /metrics
1apiVersion: v1
2kind: Service
3metadata:
4 ## ==== 添加以下注解 ====
5 annotations:
6 prometheus.io/scrape: "true"
7 prometheus.io/scheme: "http"
8 prometheus.io/port: "9153"
9 prometheus.io/path: "/metrics"
10 labels:
11 k8s-app: kube-dns
12 kubernetes.io/cluster-service: "true"
13 kubernetes.io/name: KubeDNS
14 name: kube-dns
15 namespace: kube-system
16spec:
17 clusterIP: 10.96.0.10
18 clusterIPs:
19 - 10.96.0.10
20 ports:
21 - name: dns
22 port: 53
23 protocol: UDP
24 targetPort: 53
25 - name: dns-tcp
26 port: 53
27 protocol: TCP
28 targetPort: 53
29 - name: metrics
30 port: 9153
31 protocol: TCP
32 targetPort: 9153
33 selector:
34 k8s-app: kube-dns
35 type: ClusterIP
4.2 观察 Prometheus 中是采集应用指标数据
打开 Prometheus 的 UI 界面,查看 target 一栏中是否存在 CoreDNS
相关指标数据是否已经被 Prometheus 采集,界面内容如下图所示。
可以看到 Service 中 annotations 设置了 prometheus.io/scrape: "true"
的服务,已经被 Prometheus 自动添加到采集目标中。
---END---
如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。