kube-prometheus项目中的ServiceMonitor服务发现
通过一个叫ServiceMonitor的资源来自动发现监控目标并动态生成配置,不用再维护配置文件
通过ServiceMonitor监控应用时,如果监控没有找到目标主机的排查步骤,排查步骤大致如下:
- 确认ServiceMonitor是否成功创建。
kubectl get servicemonitors -n monitoring kube-controller-manager kube-scheduler
- 确认Prometheus是否生成了相关配置。
通过web查看,Alerts/Firing告警是否有
Status/Targets是否有相关配置没有UP
- 确认存在ServiceMonitor匹配的Service。
kubectl get servicemonitor -n monitoring kube-controller-manager -o yaml
通过命令查看该 serviceMonitor匹配的标签为 app.kubernetes.io/name: kube-controller-manager
通过标签再对应的命名空间找svc是否存在
$ kubectl get svc -n kube-system -l app.kubernetes.io/name=kube-controller-manager
No resources found in kube-system namespace.
没有找到,就需要手动创建service
- 确认通过Service能够访问程序的Metrics接口。
$ kubectl get svc -n kube-system kube-controller-manager
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-controller-manager ClusterIP 10.99.49.192 <none> 10257/TCP 37s
$ curl -s 10.99.49.192:10257/metrics| tail -1
- 确认Service的端口和Scheme、ServiceMonitor一致。
port: https-metrics
scheme: https
tlsConfig:
insecureSkipVerify: true
如何配置 ServiceMonitor
进行服务发现
kube-prometheus
是一个基于 Prometheus 监控 Kubernetes 集群的项目,内置了用于监控 Kubernetes 服务和组件的最佳实践。ServiceMonitor
是 Prometheus Operator 提供的一个自定义资源(CRD),用于通过服务发现(Service Discovery)来监控 Kubernetes 中的服务。
ServiceMonitor
的作用是让 Prometheus 知道如何发现和抓取目标服务的指标(metrics)。在 kube-prometheus
项目中,ServiceMonitor
定义了 Prometheus 抓取目标的规则,它通过标签选择器来选择特定的服务,以此实现服务发现。
如何配置 ServiceMonitor
进行服务发现
1. 基本配置结构
ServiceMonitor
的配置结构包括:
selector
: 用于选择要监控的服务,依据服务标签进行选择。endpoints
: 定义了要抓取的指标的端点(如path
、port
等),以及抓取频率和超时等。namespaceSelector
: 指定要监控的命名空间,可以是当前命名空间或跨命名空间。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-service-monitor
labels:
release: prometheus
spec:
selector:
matchLabels:
app: example-app # 用标签选择目标服务
namespaceSelector:
matchNames:
- default # 选择监控服务所在的命名空间
endpoints:
- port: metrics # 指定服务的端口
path: /metrics # 指定抓取指标的路径
interval: 30s # 抓取的频率
scrapeTimeout: 10s # 抓取的超时时间
2. 字段说明
-
selector
:ServiceMonitor
会根据selector
来选择符合条件的Service
。例如,matchLabels
可以通过app: example-app
来选择拥有该标签的服务。 -
endpoints
: 定义 Prometheus 需要如何与目标服务通信。你需要指定端口(port
)和暴露的指标路径(path
,通常是/metrics
),并设置抓取间隔(interval
)和超时时间(scrapeTimeout
)。 -
namespaceSelector
: 如果要监控跨命名空间的服务,namespaceSelector
会指定 Prometheus 监控的服务所在的命名空间。你可以通过matchNames
来指定特定的命名空间。
3. 自动服务发现
Prometheus 的服务发现基于 ServiceMonitor
及其 selector
来动态发现服务。例如,当你部署了一个新的服务且打上了特定的标签(如 app: example-app
),ServiceMonitor
就能自动发现并开始抓取该服务的指标数据。
apiVersion: v1
kind: Service
metadata:
name: example-app
labels:
app: example-app # 该标签符合 ServiceMonitor 中的 matchLabels
spec:
ports:
- name: metrics
port: 8080
targetPort: 8080
selector:
app: example-app
4. 跨命名空间服务监控
如果你的 Prometheus 需要跨命名空间进行服务发现和监控,你需要在 ServiceMonitor
中指定 namespaceSelector
:
namespaceSelector:
matchNames:
- my-namespace
这会告诉 Prometheus 去监控 my-namespace
中符合 selector
的服务。
5. 关联 Prometheus 和 ServiceMonitor
在 kube-prometheus
项目中,Prometheus
CRD 通常通过 prometheus.yaml
文件配置,配置文件中需要关联 ServiceMonitorSelector
,让 Prometheus 能够找到并使用这些 ServiceMonitor
。
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceMonitorSelector:
matchLabels:
release: prometheus
这里的 serviceMonitorSelector
将根据 matchLabels
来选择并关联 ServiceMonitor
。这意味着只有带有 release: prometheus
标签的 ServiceMonitor
会被 Prometheus 发现并抓取指标。
小结
通过 ServiceMonitor
,kube-prometheus
可以灵活地在 Kubernetes 集群中进行服务发现,并自动抓取服务的指标数据。在实际使用中,你只需要为你的服务打上合适的标签,并配置 ServiceMonitor
来定义抓取规则即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?