Loading
Loading...

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 服务发现机制,并且配置标签,这样服务发现只会发现带有指定 annotations 的 Service 资源。

Prometheus 配置文件内容如下:

scrape_configs:
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
regex: "true"
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
regex: (https?)
target_label: __scheme__
- action: replace
source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
regex: ([^:]+)(?::\d+)?;(\d+)
target_label: __address__
replacement: $1:$2
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
regex: (.+)
target_label: __metrics_path__
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- action: replace
source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
- action: replace
source_labels: [__address__]
target_label: instance
regex: (.+):(.+)

下面对上面配置逐一添加注释解释配置作用,如下:

scrape_configs:
- job_name: 'kubernetes-service-endpoints'
## 使用endpoints服务发现
kubernetes_sd_configs:
- role: endpoints
## 标签重定义配置
relabel_configs:
## 是否采集Service对应的Pod中的指标,设置 prometheus.io/scrape="true即采集,空或者false则不采集"
- action: keep
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
regex: "true"
## 指定scheme为 http或者https
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
regex: (https?)
target_label: __scheme__
## 根据prometheus.io/port标签配置的端口号进行指标采集"
- action: replace
source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
regex: ([^:]+)(?::\d+)?;(\d+)
target_label: __address__
replacement: $1:$2
## 根据prometheus.io/path标签配置路径进行指标采集"
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
regex: (.+)
target_label: __metrics_path__
## 获取service资源中的label指标对
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
## 获取namespace
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
## 获取service名称
- action: replace
source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
## 配置instance标签
- action: replace
source_labels: [__address__]
target_label: instance
regex: (.+):(.+)

三、将 Prometheus 配置存入 ConfigMap 资源中

由于之前是基于 Kubernetes 部署的 Prometheus,且将其配置参数写到 Kubernetes 的 ConfigMap 资源中,然后通过挂载 ConfigMap 到 Pod 内部,这样修改 ConfigMap 就可以修改 Prometheus 配置。

所以这里将上面 Prometheus 中的配置存入到 Kubernetes 中的 ConfigMap 资源文件 prometheus-config.yaml 中,资源内容如下:

kind: ConfigMap
apiVersion: v1
metadata:
name: prometheus-config
namespace: kube-system
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
scrape_configs:
############################### kubernetes-service-endpoints #########################################
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
regex: "true"
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
regex: (https?)
target_label: __scheme__
- action: replace
source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
regex: ([^:]+)(?::\d+)?;(\d+)
target_label: __address__
replacement: $1:$2
- action: replace
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
regex: (.+)
target_label: __metrics_path__
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- action: replace
source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
- action: replace
source_labels: [__address__]
target_label: instance
regex: (.+):(.+)

执行下面命令,更新 ConfigMap 资源中的配置参数:

  • -f: 指定要部署的资源文件。
  • -n: 指定 Namespace 名称。
Terminal window
$ kubectl apply -f prometheus-config.yaml -n kube-system

执行下面命令,使 Prometheus 重新加载 ConfigMap 中的参数配置:

这里本人的 Prometheus 地址是 http://192.168.2.32:30900

Terminal window
$ 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,执行命令如下:

Terminal window
$ 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

apiVersion: v1
kind: Service
metadata:
## ==== 添加以下注解 ====
annotations:
prometheus.io/scrape: "true"
prometheus.io/scheme: "http"
prometheus.io/port: "9153"
prometheus.io/path: "/metrics"
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: KubeDNS
name: kube-dns
namespace: kube-system
spec:
clusterIP: 10.96.0.10
clusterIPs:
- 10.96.0.10
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
- name: metrics
port: 9153
protocol: TCP
targetPort: 9153
selector:
k8s-app: kube-dns
type: ClusterIP

4.2 观察 Prometheus 中是采集应用指标数据

打开 Prometheus 的 UI 界面,查看 target 一栏中是否存在 CoreDNS 相关指标数据是否已经被 Prometheus 采集,界面内容如下图所示。

Prometheus 中 target 界面

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

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

本文作者:超级小豆丁 @ 小豆丁技术栈

本文链接:http://www.mydlq.club/article/116/

本文标题:Prometheus 监听指定标签 Kubernetes 服务

本文版权:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!