系统环境

  • 操作系统: 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服务指标数据的目的
prom-zdbq-1

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采集
prom-zdbq-2
看到 Service中annotations设置了prometheus.io/scrape:"true"的服务,已经被 Prometheus自动添加到采集目标中

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
监控服务 Prometheus Kubernetes Kubernetes 监控服务 Prometheus
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝