通過ServiceMonitor創(chuàng)建服務(wù)發(fā)現(xiàn)
可觀測監(jiān)控 Prometheus 版支持使用CRD ServiceMonitor的方式來滿足您自定義服務(wù)發(fā)現(xiàn)的采集需求。通過使用ServiceMonitor,您可以自行定義Pod發(fā)現(xiàn)的Namespace范圍以及通過matchLabel
來選擇監(jiān)聽的Service。本文將基于SpringBoot框架演示如何通過ServiceMonitor創(chuàng)建服務(wù)發(fā)現(xiàn)。
Demo
您可以通過下載Demo工程,同步體驗(yàn)通過ServiceMonitor創(chuàng)建服務(wù)發(fā)現(xiàn)的完整過程。
步驟一:創(chuàng)建基礎(chǔ)代碼依賴
創(chuàng)建一個Maven應(yīng)用,并在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>
在項(xiàng)目的src/resources/applications.properties文件中添加以下配置。
management.endpoints.web.exposure.include=prometheus
啟動項(xiàng)目,通過瀏覽器訪問
http://{host}:{port}/actuator/prometheus
。獲取到對應(yīng)的JVM監(jiān)控,返回示例如下:
步驟二:部署Kubernetes集群
構(gòu)建一個鏡像,并將構(gòu)建鏡像的Dockerfile文件上傳至鏡像倉庫。有關(guān)鏡像的更多信息,請參見綁定源代碼托管平臺。
參考以下內(nèi)容創(chuàng)建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
參考以下內(nèi)容創(chuàng)建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
步驟三:創(chuàng)建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所需的一些關(guān)鍵元信息。spec
的endpoints
為服務(wù)端點(diǎn),代表Prometheus所需的采集Metrics的地址。endpoints
為一個數(shù)組,同時可以創(chuàng)建多個endpoints
。每個endpoints
包含三個字段,每個字段的含義如下:interval
:指定Prometheus對當(dāng)前endpoints
采集的周期。單位為秒,在本次示例中設(shè)定為15s
。path
:指定Prometheus的采集路徑。在本次示例中,指定為/actuator/prometheus
。port
:指定采集數(shù)據(jù)需要通過的端口,設(shè)置的端口為步驟二創(chuàng)建Service時端口所設(shè)置的name
。在本次示例中,設(shè)定為metrics
。重要這里port配置的是端口名,并非端口號。
spec
的namespaceSelector
為需要發(fā)現(xiàn)的Service的范圍。namespaceSelector
包含兩個互斥字段,字段的含義如下:any
:有且僅有一個值true
,當(dāng)該字段被設(shè)置時,將監(jiān)聽所有符合Selector過濾條件的Service的變動。matchNames
:數(shù)組值,指定需要監(jiān)聽的namespace
的范圍。例如,只想監(jiān)聽default和arms-prom兩個命名空間中的Service,那么matchNames
設(shè)置如下:namespaceSelector: matchNames: - default - arms-prom
spec
的selector
用于選擇Service。在本次示例所使用的Service有micrometer-prometheus-discovery: 'true' Label,所以
selector
設(shè)置如下:selector: matchLabels: micrometer-prometheus-discovery: 'true'
阿里云Prometheus可以通過以下兩種方式創(chuàng)建ServiceMonitor,請選擇其中一種方式創(chuàng)建。
通過控制臺創(chuàng)建ServiceMonitor
登錄ARMS控制臺。
在左側(cè)導(dǎo)航欄選擇 ,進(jìn)入可觀測監(jiān)控 Prometheus 版的實(shí)例列表頁面。
單擊目標(biāo)Prometheus實(shí)例名稱。
在左側(cè)導(dǎo)航欄,單擊服務(wù)發(fā)現(xiàn),然后單擊配置頁簽。
在配置頁面,單擊ServiceMonitor頁簽,然后單擊添加ServiceMonitor。
在添加ServiceMonitor對話框,輸入YAML文件內(nèi)容,然后單擊確定。
通過命令創(chuàng)建ServiceMonitor
將寫好的YAML文件保存至本地。
執(zhí)行以下命令使YAML文件生效。
kubectl apply -f {YAML文件所在的路徑}
步驟四:驗(yàn)證ServiceMonitor
通過以下操作,驗(yàn)證Prometheus是否成功進(jìn)行服務(wù)發(fā)現(xiàn)。
登錄ARMS控制臺。
在左側(cè)導(dǎo)航欄選擇 ,進(jìn)入可觀測監(jiān)控 Prometheus 版的實(shí)例列表頁面。
單擊目標(biāo)Prometheus實(shí)例名稱。
在左側(cè)導(dǎo)航欄單擊服務(wù)發(fā)現(xiàn),然后單擊Targets頁簽。
在Targets頁簽,查看是否存在名稱為{namespace}/{serviceMonitorName}/x的Target。
單擊{namespace}/{serviceMonitorName}/x所在行展開Target,然后單擊Endpoint鏈接。
驗(yàn)證Metrics是否正常。