Prometheus 监听指定标签 Kubernetes 服务

Prometheus 监听指定标签 Kubernetes 服务

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • 操作系统: CentOS 7.9
  • Docker 版本: 20.10.8
  • Prometheus 版本: 2.29.1
  • Kubernetes 版本: 1.20.2

系列文章目录


一、Prometheus 如何自动采集 Kubernetes 服务

Kubernetes 中存在静态配置和动态配置两种:

  • 静态配置方式: 静态配置方式就是将要采集的 目标地址、目标端口、目标接口 添加到 Prometheus 配置文件中。
  • 动态配置方式: 动态配置方式就是使用服务发现机制,动态发现指定的服务。Prometheus 中支持 Eureka、Consul、DNS、Kubernetes 等动态服务发现,可以在连接这些组件后,根据指定条件获取到要采集的目的地址、端口、接口等信息,然后添加到 Prometheus Target 目标中。

这里要实现 Prometheus 自动采集 Kubernetes 服务指标数据,就需要使用上面提及的“动态配置方式”,使用 Kubernetes 服务发现机制,再结合指定注释,标记哪些服务需要被 Prometheus 采集数据,就能实现 Prometheus 自动采集 Kubernetes 服务指标数据的目的。

Prometheus基于K8S服务发现到有指定标签的service关联的应用采集指标

二、Prometheus 添加 Kubernetes 服务发现配置

首先创建 Prometheus 配置文件,在里面添配置参数,使用 Kubernetes endpoints 服务发现机制,并且配置标签,这样服务发现只会发现带有指定 annotationsService 资源。

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 指标数据,方便我们对其进行采集。

我们可以在 CoredDNSService 资源上,添加上面我们 Prometheus 配置中设置的注解,这样 Prometheus 就能够自动从其注解中配置的地址获取暴露的指标接口,从其采集相应的数据。

4.1 设置 CoreDNS 的 Service 资源添加指定标签

编辑 Service 资源 kube-dns,执行命令如下:

1$ kubectl edit service kube-dns -n kube-system

annotations 中添加 prometheus.io/scrapeprometheus.io/schemeprometheus.io/portprometheus.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 采集,界面内容如下图所示。

Prometheus 中 target 界面

可以看到 Service 中 annotations 设置了 prometheus.io/scrape: "true" 的服务,已经被 Prometheus 自动添加到采集目标中。

---END---

如果本文对你有帮助,可以关注我的公众号"小豆丁技术栈"了解最新动态,顺便也请帮忙 github 点颗星哦~感谢~


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。