阿里云Prometheus支持使用CRD ServiceMonitor的方式来满足您自定义服务发现的采集需求。通过使用ServiceMonitor,您可以自行定义Pod发现的Namespace范围以及通过matchLabel来选择监听的Service。本文将基于SpringBoot框架演示如何通过ServiceMonitor创建服务发现。

Demo

您可以通过下载Demo工程,同步体验通过ServiceMonitor创建服务发现的完整过程。

步骤一:创建基础代码依赖

  1. 创建一个Maven应用,并在pom.xml文件中添加以下依赖。
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-registry-prometheus</artifactId>
                <version>1.6.6</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  2. 在项目的src/resources/applications.properties文件中添加以下配置。
    management.endpoints.web.exposure.include=prometheus
  3. 启动项目,通过浏览器访问http://{host}:{port}/actuator/prometheus
    获取到对应的JVM监控,返回示例如下:ServiceMonitor返回示例

步骤二:部署Kubernetes集群

  1. 构建一个镜像,并将构建镜像的Dockerfile文件上传至镜像仓库。
  2. 参考以下内容创建Deployment。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: micrometer-prometheus
      namespace: default
      labels:
        app: demo-prometheus
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: demo-prometheus
      template:
        metadata:
          labels:
            app: demo-prometheus
        spec:
          containers:
            - name: micrometer-prometheus
              image: manjusakalza/micrometer-prometheus:latest
              ports:
                - containerPort: 8080
  3. 参考以下内容创建Service。
    apiVersion: v1
    kind: Service
    metadata:
      name: prometheus-metrics-demo
      namespace: default
      labels:
        micrometer-prometheus-discovery: 'true'
    spec:
      selector:
        app: demo-prometheus
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080
          name: metrics

步骤三:创建ServiceMonitor

ServiceMonitor的YAML文件示例如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: micrometer-demo
  namespace: default
spec:
  endpoints:
    - interval: 15s
      path: /actuator/prometheus
      port: metrics
  namespaceSelector:
    any: true
  selector:
    matchLabels:
      micrometer-prometheus-discovery: 'true'
      app: tomcat

在这段YAML文件中,各代码段的含义如下:

  • metadata下的namenamespace将指定ServiceMonitor所需的一些关键元信息。
  • specendpoints为服务端点,代表Prometheus所需的采集Metrics的地址。endpoints为一个数组,同时可以创建多个endpoints。每个endpoints包含三个字段,每个字段的含义如下:
    • interval:指定Prometheus对当前endpoints采集的周期。单位为秒,在本次示例中设定为15s
    • path:指定Prometheus的采集路径。在本次示例中,指定为/actuator/prometheus
    • port:指定采集数据需要通过的端口,设置的端口为步骤二创建Service时端口所设置的name。在本次示例中,设定为metrics
  • specnamespaceSelector为需要发现的Service的范围。namespaceSelector包含两个互斥字段,字段的含义如下:
    • any:有且仅有一个值true,当该字段被设置时,将监听所有符合Selector过滤条件的Service的变动。
    • matchNames:数组值,指定需要监听的namespace的范围。例如,只想监听default和arms-prom两个命名空间中的Service,那么matchNames设置如下:
      namespaceSelector:
        matchNames:
        - default
        - arms-prom
  • specselector用于选择Service。更多信息,请参见labelselector-v1-meta

    在本次示例所使用的Service有micrometer-prometheus-discovery: 'true' Label,所以selector设置如下:

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

阿里云Prometheus可以通过以下两种方式创建ServiceMonitor,请选择其中一种方式创建。

通过控制台创建ServiceMonitor

  1. 登录Prometheus控制台
  2. 在顶部菜单栏,选择地域。
  3. Prometheus监控页面,单击目标Kubernetes集群名称。
  4. 在左侧导航栏,单击设置
  5. 在右侧页面,单击服务发现页签。
  6. 服务发现页签,单击ServiceMonitor页签,然后单击添加ServiceMonitor
  7. 添加ServiceMonitor对话框,输入YAML文件内容,然后单击确定

通过命令创建ServiceMonitor

  1. 将写好的YAML文件保存至本地。
  2. 执行以下命令使YAML文件生效。
    kubectl apply -f {YAML文件所在的路径}

步骤四:验证ServiceMonitor

通过以下操作,验证Prometheus是否成功进行服务发现。

  1. 登录Prometheus控制台
  2. 在顶部菜单栏,选择地域。
  3. Prometheus监控页面,单击目标Kubernetes集群名称。
  4. 在左侧导航栏,单击设置
  5. 在右侧页面,单击Targets(beta)页签。
    Targets(beta)页签,查看是否存在名称为{namespace}/{serviceMonitorName}/x的Target。ServiceMonitor在Target页签显示
  6. 单击{namespace}/{serviceMonitorName}/x所在行展开Target,然后单击Endpoint链接。
    验证Metrics是否正常。ServiceMonitor的Target的endpoint