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 配置文件内容如下:
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: ConfigMapapiVersion: v1metadata: name: prometheus-config namespace: kube-systemdata: 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 名称。
$ kubectl apply -f prometheus-config.yaml -n kube-system执行下面命令,使 Prometheus 重新加载 ConfigMap 中的参数配置:
这里本人的 Prometheus 地址是 http://192.168.2.32:30900
$ 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,执行命令如下:
$ 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: v1kind: Servicemetadata: ## ==== 添加以下注解 ==== 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-systemspec: 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: ClusterIP4.2 观察 Prometheus 中是采集应用指标数据
打开 Prometheus 的 UI 界面,查看 target 一栏中是否存在 CoreDNS 相关指标数据是否已经被 Prometheus 采集,界面内容如下图所示。

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