kube-prometheus项目中的ServiceMonitor服务发现

通过一个叫ServiceMonitor的资源来自动发现监控目标并动态生成配置,不用再维护配置文件

通过ServiceMonitor监控应用时,如果监控没有找到目标主机的排查步骤,排查步骤大致如下:

  1. 确认ServiceMonitor是否成功创建。
	kubectl get servicemonitors -n monitoring kube-controller-manager kube-scheduler
  1. 确认Prometheus是否生成了相关配置。
	通过web查看,Alerts/Firing告警是否有
				Status/Targets是否有相关配置没有UP
  1. 确认存在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
  1. 确认通过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
  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: 定义了要抓取的指标的端点(如 pathport 等),以及抓取频率和超时等。
  • 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 发现并抓取指标。

小结

通过 ServiceMonitorkube-prometheus 可以灵活地在 Kubernetes 集群中进行服务发现,并自动抓取服务的指标数据。在实际使用中,你只需要为你的服务打上合适的标签,并配置 ServiceMonitor 来定义抓取规则即可。

posted @   jasmine456  阅读(401)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示