Prometheus监听指定标签k8s服务
系统环境
- 操作系统: CentOS 7.6
- Docker 版本: 19.03.5
- Prometheus 版本: 2.36.0
- Kubernetes 版本: 1.20.0
Prometheus如何自动采集k8s服务
在 Kubernetes中存在静态配置和动态配置两种:
- 静态配置方式
静态配置方式就是将要采集的 目标地址、目标端口、目标接口 添加到 Prometheus 配置文件中
- 动态配置方式
动态配置方式就是使用服务发现机制,动态发现指定的服务,Prometheus中支持Eureka、Consul、DNS、Kubernetes等动态服务发现,可以在连接这些组件后,根据指定条件获取到要采集的目的地址、端口、接口等信息,然后添加到 Prometheus Target 目标中
这里要实现Prometheus自动采集k8s服务指标数据,就需要使用上面提及的“动态配置方式”,使用k8s服务发现机制,再结合指定注释,标记哪些服务需要被Prometheus采集数据,就能实现Prometheus自动采集Kubernetes服务指标数据的目的
Prometheus添加k8s服务发现配置
编辑Prometheus配置文件,在里面添配置参数,使用Kubernetes endpoints服务发现机制,并且配置标签,这样服务发现只会发现带有指定annotations的Service资源,配置文件内容如下:
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
之前已经使用k8s部署prometheus,且将其配置参数写到ConfigMap资源中,然后通过挂载ConfigMap到Pod内部,这样修改 ConfigMap 就可以修改 Prometheus 配置,所以这里将上面Prometheus中的配置存入到k8s中的ConfigMap资源文件prometheus-config.yaml中
[root@k8s01 prometheus]# cat prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
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: (.+):(.+)
[root@k8s01 prometheus]# kubectl apply -f prometheus-config.yaml
configmap/prometheus-config configured
Prometheus重新加载ConfigMap中的参数配置:
[root@k8s01 prometheus]# curl -XPOST http://10.x.x.x:30089/-/reload
配置Prometheus自动采集CoreDNS服务指标
CoreDNS Service资源添加指定标签
编辑 Service 资源 kube-dns,在 annotations 中添加 prometheus.io/scrape、prometheus.io/scheme、prometheus.io/port、prometheus.io/path 四个注解,表示该 Service 关联的 Pod 需要被 Prometheus 采集,其中指标暴露的端口是 9153,获取指标数据的路径是 /metrics
[root@k8s01 ~]# kubectl edit -n kube-system svc kube-dns
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
...
查看Prometheus中是否采集指标数据
查看Prometheus的UI界面,查看 target 一栏中是否存在CoreDNS相关指标数据是否已经被Prometheus采集
看到 Service中annotations设置了prometheus.io/scrape:"true"的服务,已经被 Prometheus自动添加到采集目标中