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 来定义抓取规则即可。
浙公网安备 33010602011771号