介绍

在Kubernetes中,Prometheus Operator可以通过两种方式自动发现监控目标:PodMonitor和ServiceMonitor。PodMonitor用于监控由单个Pod定义的服务,而ServiceMonitor用于监控Kubernetes Service中的所有Pod。

要使用PodMonitor和ServiceMonitor,需要在Kubernetes中定义它们,然后Prometheus Operator将从这些定义中自动发现和创建监控目标。

在Kubernetes中,Prometheus Operator可以通过两种方式自动发现监控目标:PodMonitor和ServiceMonitor。PodMonitor用于监控由单个Pod定义的服务,而ServiceMonitor用于监控Kubernetes Service中的所有Pod。

要使用PodMonitor和ServiceMonitor,需要在Kubernetes中定义它们,然后Prometheus Operator将从这些定义中自动发现和创建监控目标。

以下是如何使用PodMonitor和ServiceMonitor的步骤:

Prometheus Operator CRD IDEA智能提示

要在IntelliJ IDEA中导入Prometheus Operator CRD文件或URL并获得智能提示,您可以按照以下步骤操作:

  1. 在您的项目中创建一个文件夹用于存放Prometheus Operator CRD文件。
  2. 在该文件夹中创建一个新文件,并将其命名为“prometheus-operator-crd.yaml”。
  3. 打开您的Web浏览器,并导航到您的Prometheus Operator安装位置中的“/manifests”目录。例如,在Minikube上,您可以使用以下命令打开该目录:
1
minikube ssh "ls /etc/kubernetes/manifests"
  1. 在该目录中,找到与Prometheus Operator版本对应的CRD文件,并将其下载到您的计算机中。例如,在Minikube上,您可以使用以下命令将CRD文件从容器中复制到本地:
1
2
3
kubectl get crd prometheuses.monitoring.coreos.com -o yaml > ~/prometheus-operator-crd.yaml
kubectl get crd podmonitors.monitoring.coreos.com -o yaml > ~/podmonitors-operator-crd.yaml
kubectl get crd servicemonitors.monitoring.coreos.com -o yaml > ~/servicemonitors-operator-crd.yaml
  1. 将下载的CRD文件复制到刚刚创建的“prometheus-operator-crd.yaml”文件中。
  2. 打开IntelliJ IDEA,并导航到您的项目中的“prometheus-operator-crd.yaml”文件。
  3. 在该文件中,你应该能够看到智能提示和代码补全。

需要注意的是,如果您无法从Prometheus Operator安装位置中获取CRD文件,则可以在Prometheus Operator GitHub仓库中找到所有的CRD文件,并将其下载到本地。将下载的文件复制到您的项目中,并按照上述步骤进行操作。

创建PodMonitor

  1. 定义PodMonitor的YAML文件,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
labels:
app: server-name
name: server-name
namespace: default
spec:
podMetricsEndpoints:
# path针对不同语言/框架实现可能有所不同,例如springboot的actuator默认是:/actuator/prometheus;nodejs-prom-client则默认是:/metrics
- path: /metrics
# 端口port字段【不可以写port num】,需要指定为pod定义中spec.containers[i].ports[i].name,或services定义中spec.ports[i].name字段的值。
port: web
scheme: http
interval: 10s
honorLabels: true
namespaceSelector:
matchNames:
- default
selector:
matchLabels:
app: server-name
---
apiVersion: v1
kind: Pod
metadata:
name: server-name
namespace: default
labels:
# 注意这里,podMonitor的matchLabels对应的是这里
app: server-name
spec:
containers:
- name: server-name
image: xxx
imagePullPolicy: IfNotPresent
restartPolicy: Always

其中,selector定义了要监控哪些Pod,podMetricsEndpoints定义了如何连接到Pod的metrics端点。这里,我们使用了一个名为my-app的标签来选择要监控的Pod,同时指定了metrics端点的名称和路径。

  1. 使用kubectl命令将PodMonitor文件部署到Kubernetes中:
1
kubectl apply -f my-pod-monitor.yaml

此时,Prometheus Operator会根据定义的PodMonitor自动创建相应的监控目标。

创建ServiceMonitor

相对pod monitor来说,service monitor作用范围更大

  1. 定义ServiceMonitor的YAML文件,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: server-name
name: server-name
namespace: default
spec:
endpoints:
# path针对不同语言/框架实现可能有所不同,例如springboot的actuator默认是:/actuator/prometheus;nodejs-prom-client则默认是:/metrics
- path: /metrics
# 端口port字段【不可以写port num】,需要指定为pod定义中spec.containers[i].ports[i].name,或services定义中spec.ports[i].name字段的值。
port: web
scheme: http
interval: 10s
honorLabels: true
namespaceSelector:
matchNames:
- default
selector:
matchLabels:
# service当中必须要声明此label
app: server-name
---
apiVersion: v1
kind: Service
metadata:
name: server-name
namespace: default
labels:
# 注意这里,serviceMonitor的matchLabels对应的是这里
app: server-name
spec:
selector:
app: server-name
type: ClusterIP
ports:
- port: 32201
targetPort: 32201
protocol: TCP
name: web

其中,selector定义了要监控哪些Service,endpoints定义了如何连接到Service的metrics端点。这里,我们使用了一个名为my-app的标签来选择要监控的Service,同时指定了metrics端点的名称和路径。

  1. 使用kubectl命令将ServiceMonitor文件部署到Kubernetes中:
1
kubectl apply -f my-service-monitor.yaml

此时,Prometheus Operator会根据定义的ServiceMonitor自动创建相应的监控目标。

需要注意的是,PodMonitor和ServiceMonitor只是Prometheus Operator的一部分,如果Prometheus Operator没有正确配置,它们将无法正常工作。在使用PodMonitor和ServiceMonitor之前,请确保已正确安装和配置Prometheus Operator。

检查Prometheus Targets指标

它应该会展示如下指标信息

问题排查/文档参考

检查Prometheus - Target是否被发现

若Target未被发现【此时可能ServiceDiscovery中有】:

  • 确认Label Selector是否能选择到期望的Pod或者Service

执行以下命令,观察返回结果,若无返回结果,则需要调整Label Selector或Namespace Selector,即可筛选出期望的Pod或者Service。

1
2
3
4
# 如果namespace selector中any设置为true
kubectl get pod/service -l label_key=label_value -A
# 如果指定了namespace, 则使用指定的namespace。
kubectl get pod/service -l label_key=label_value -n xx_namespace_xx
  • 检查端口设置

端口port字段,需要指定为pod定义中spec.containers[i].ports[i].name,或services定义中spec.ports[i].name字段的值。

若Target已经被发现,但显示为红色

表示Prometheus抓取失败,这种情况通常是由于Target自身问题导致,此时提示的异常原因进行排查。

若Target已经被发现,且State列显示为UP,但期望的指标依然未被采集到

可以访问对应Target的Endpoint超链接,系统会直接从Target拉取原始数据,然后需要确认原始数据中是否存在期望的指标。

参见:

问题排查:https://prometheus-operator.dev/docs/operator/troubleshooting/#troubleshooting-servicemonitor-changes

文档参考:https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md