在 Kubernetes 中实现微服务应用监控

张坚,科大讯飞开发工程师,云原生爱好者。

本篇文章我们基于 Prometheus 和 Grafana 实现微服务应用监控。

在 Kubernetes 中实现微服务应用监控-1

KubeSphere 平台本身提供了监控功能,包括节点状态、集群资源使用率、Etcd、API Server 等监控,不过缺少了应用级别的监控。

引入依赖包

在应用中引入监控所需要的 jar 包,包含 Prometheus 和 Actuator。

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

    io.micrometer  
    micrometer-registry-prometheus  

引入这 2 个包以后就通过 Prometheus 抓取到应用的监控信息。

修改应用配置,暴露监控端口

management:
  endpoints:  
    web:  
      exposure:  
        include: "*"  
      base-path: /
  metrics:  
    tags:  
      application: ${spring.application.name}
  • management.server.port:启用独立的端口来提供监控,未配置的情况下共用应用端口;
  • management.metrics.tags.xxx:在统计信息中添加自定义的标签;
  • management.endpoints.web.exposure.include:用于包含我们要公开的端点列表 , 我们这里设置为* 代表所有。
  • management.endpoints.web.base-path:用于设置 Promethues 的监控路径,默认是通过 /actuator/prometheus 访问,这样配置以后只需要通过 /prometheus 访问

配置完成后重启服务,通过浏览器访问 localhost:8080/prometheus 即可抓取到 Prometheus 的监控数据,效果如下:

在 Kubernetes 中实现微服务应用监控-2

修改 Service 配置

kind: Service
apiVersion: v1
metadata:
  name: spring-cloud-provider-service
  namespace: cloud-demo
  labels:
    app: spring-cloud-provider-service
    micrometer-prometheus-discovery: 'true'
spec:
  ports:
    - name: metrics
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: spring-cloud-provider

修改后端服务端的 Service:

  • 添加了 micrometer-prometheus-discovery: 'true' 这个标签,方便后面 ServiceMonitor 自动抓取
  • 修改 Service 端口映射的名称未 metrics

创建 ServiceMonitor

安装 KubeSphere 平台时已经安装好了 promethus-operator, ServiceMonitor 是 prometheus-operator 后创建的一种自定义资源,Prometheus 可以通过 ServiceMonitor 自动识别带有某些 label 的 service ,并从这些 Service 获取数据。

现在需要让 Promethus 可以抓取到我们暴露的应用监控,所以需要创建一个如下的 ServiceMonitor。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: micrometer-demo
  namespace: cloud-demo
spec:
  endpoints:
    - interval: 30s
      path: /prometheus
      port: metrics
  namespaceSelector:
    matchNames:
    - cloud-demo
    1. any: true
  selector:
    matchLabels:
      micrometer-prometheus-discovery: 'true'

这段 YAML 文件的意思是抓取 namespace 为 cloud-demo,并设置了 micrometer-prometheus-discovery: 'true' 的 labels 的所有 Service,抓取的端口为 metrics,抓取路径为 /prometheus

详细说明一下各字段的意义:

  • metadata 下的 namenamespace 将指定 Service Monitor 所需的一些关键元信息。

  • specendpoints 为服务端点,代表 Prometheus 所需的采集 Metrics 的地址。endpoints 为一个数组,同时可以创建多个 endpoints。每个 endpoints 包含三个字段,每个字段的含义如下:

    • interval:指定 Prometheus 对当前 endpoints 采集的周期。单位为秒,在本次示例中设定为 30s
    • path:指定 Prometheus 的采集路径。设置为 /prometheus,这个跟应用中暴露的监听端口保持一致。
    • port:指定采集数据需要通过的端口,设置为 /metrics 设置的端口为 步骤三 创建 Service 时端口所设置的 name
  • specnamespaceSelector 为需要发现的 Service 的范围。namespaceSelector 包含两个互斥字段,字段的含义如下:

    • any:有且仅有一个值 true,当该字段被设置时,将监听所有符合 Selector 过滤条件的 Service 的变动。
    • matchNames:数组值,指定需要监听的 namespace 的范围。例如,只想监听 defaultcloud-demo 两个命名空间中的 Service,那么 matchNames 设置如下:
    namespaceSelector:
      matchNames:
      - default
      - cloud-demo
    
  • specselector 用于选择 Service。 在本次示例所使用的 Service 有 micrometer-prometheus-discovery: 'true' Label,所以 selector 设置如下:

    selector:
      matchLabels:
        micrometer-prometheus-discovery: 'true'