可观测监控 Prometheus 版支持使用CRD ServiceMonitor的方式来满足您自定义服务发现的采集需求。通过使用ServiceMonitor,您可以自行定义Pod发现的Namespace范围以及通过matchLabel
来选择监听的Service。本文将基于SpringBoot框架演示如何通过ServiceMonitor创建服务发现。
Demo
您可以通过下载Demo工程,同步体验通过ServiceMonitor创建服务发现的完整过程。
步骤一:创建基础代码依赖
创建一个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>
在项目的src/resources/applications.properties文件中添加以下配置。
management.endpoints.web.exposure.include=prometheus
启动项目,通过浏览器访问
http://{host}:{port}/actuator/prometheus
。获取到对应的JVM监控,返回示例如下:
步骤二:部署Kubernetes集群
构建一个镜像,并将构建镜像的Dockerfile文件上传至镜像仓库。有关镜像的更多信息,请参见绑定源代码托管平台。
参考以下内容创建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
参考以下内容创建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 #注意:这里port配置的是端口名,并非端口号。
namespaceSelector:
any: true
selector:
matchLabels:
micrometer-prometheus-discovery: 'true'
在这段YAML文件中,各代码段的含义如下:
metadata
下的name
和namespace
将指定ServiceMonitor所需的一些关键元信息。spec
的endpoints
为服务端点,代表Prometheus所需的采集Metrics的地址。endpoints
为一个数组,同时可以创建多个endpoints
。每个endpoints
包含三个字段,每个字段的含义如下:interval
:指定Prometheus对当前endpoints
采集的周期。单位为秒,在本次示例中设定为15s
。path
:指定Prometheus的采集路径。在本次示例中,指定为/actuator/prometheus
。port
:指定采集数据需要通过的端口,设置的端口为步骤二创建Service时端口所设置的name
。在本次示例中,设定为metrics
。重要这里port配置的是端口名,并非端口号。
spec
的namespaceSelector
为需要发现的Service的范围。namespaceSelector
包含两个互斥字段,字段的含义如下:any
:有且仅有一个值true
,当该字段被设置时,将监听所有符合Selector过滤条件的Service的变动。matchNames
:数组值,指定需要监听的namespace
的范围。例如,只想监听default和arms-prom两个命名空间中的Service,那么matchNames
设置如下:namespaceSelector: matchNames: - default - arms-prom
spec
的selector
用于选择Service。在本次示例所使用的Service有micrometer-prometheus-discovery: 'true' Label,所以
selector
设置如下:selector: matchLabels: micrometer-prometheus-discovery: 'true'
阿里云Prometheus可以通过以下两种方式创建ServiceMonitor,请选择其中一种方式创建。
通过控制台创建ServiceMonitor
- 登录Prometheus控制台。
- 在左侧导航栏单击监控列表,进入可观测监控 Prometheus 版的实例列表页面。
- 单击目标Prometheus实例名称。
在左侧导航栏单击服务发现,然后单击配置页签。
在配置页面,单击ServiceMonitor页签,然后单击添加ServiceMonitor。
在弹出的对话框,输入YAML文件内容,然后单击确定。
通过命令创建ServiceMonitor
将写好的YAML文件保存至本地。
执行以下命令使YAML文件生效。
kubectl apply -f {YAML文件所在的路径}
步骤四:验证ServiceMonitor
通过以下操作,验证Prometheus是否成功进行服务发现。
- 在左侧导航栏单击监控列表,进入可观测监控 Prometheus 版的实例列表页面。
- 单击目标Prometheus实例名称。
在左侧导航栏单击服务发现,然后单击Targets页签。
在Targets页签,查看是否存在名称为{namespace}/{serviceMonitorName}/x的Target。
单击{namespace}/{serviceMonitorName}/x所在行展开Target,然后单击Endpoint链接。
验证Metrics是否正常。