prometheus监控k8s中微服务JVM与服务的自动发现

需求:业务方需要看到每个服务实例的JVM资源使用情况

难点:

  1. 每个服务实例在k8s中都是一个pod且分布在不同的namespace中数量成百上千
  2. prometheus监控需要服务提供metrics接口
  3. prometheus需要在配置文件中添加每个实例的metrics地址,因为pod的ip一直在变,所以配置文件写死了无法完成,需要配置自动发现

解决方案:

  1. 搭建集成了Micrometer功能的Spring BootJVM监控,并配置Grafana监控大盘
  2. 配置prometheus自动发现

一、集成actuator与micrometer

prometheus监控k8s中微服务JVM与服务的自动发现_第1张图片 通过micrometer桥接prometheus

 

pom文件中引入如下的插件:

        
		
			org.springframework.boot
			spring-boot-starter-actuator
		

		
		
			io.micrometer
			micrometer-registry-prometheus
			1.6.0
		

		
		
			io.micrometer
			micrometer-core
			1.6.0
		
		
		
			io.github.mweirauch
			micrometer-jvm-extras
			0.2.0
		

因为spring actuator因为安全原因默认只开启health和info接口,所以我们需要修改下application.yml,将prometheus接口放开

# metircs
management:
  endpoints:
    web:
      exposure:
        include: prometheus, health
  metrics:
    export:
      simple:
        enabled: false
    tags:
      application: ${spring.application.name}

修改完毕后,编译启动对应服务。

访问http://服务地址:端口/actuator/prometheus可以看到如下metrics

prometheus监控k8s中微服务JVM与服务的自动发现_第2张图片

二、配置prometheus自动发现

步骤一我们配置了单个实例的metrics接口,在实际生产环境中每个服务都有对应的service而且下面会有很多pod,我们这里通过prometheus的自动发现来将所有实例metrics信息收集起来

  1. 修改服务部署的yaml,在service的metadata中加入如下的annotations为自动发现做准备
  annotations:
    prometheus.io/port: "8082" #端口配自己服务的端口
    prometheus.io/spring: "true"
    prometheus.io/path: "actuator/prometheus"

   2.在prometheus配置文件中添加spring项目metrics

k8s中的prometheus可以使用k8s的机制进行自动发现,配置如下:

      - job_name: 'spring metrics'

        kubernetes_sd_configs:
        - role: endpoints

        relabel_configs:
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_spring]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
          action: replace
          target_label: __address__
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
        - action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: spring_namespace
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: spring_name

这里面的label与我们步骤1中配置的annotation对应

配置完,重新加载配置文件后,在prometheus控制台可以看到加载进来的target

prometheus监控k8s中微服务JVM与服务的自动发现_第3张图片

3.grafana配置展示大屏

对应的dashboard已经上传到grafana,import编号为13657的即可。

效果如下

prometheus监控k8s中微服务JVM与服务的自动发现_第4张图片

你可能感兴趣的:(kubernetes)