使用指导
使用 Prometheus 实现系统监控和告警:包括依次创建 Prometheus 实例、ServiceMonitor 实例、PodMonitor 实例、PrometheusRule 实例,以及 AlertManager 实例。
前提条件
已部署 Prometheus Operator,具体请参考 安装 Operator 。
操作步骤
-
在左侧导航栏中,单击 应用商店管理 > Operators。
-
在 已部署 Operators 页签中,单击 prometheus-operator。
-
单击实例卡片中的 创建实例。
-
参考说明配置相关参数。
提示:为确保创建成功的实例能够互相访问,建议以下实例均创建在相同的命名空间下,尤其是 Prometheus 实例和 Alertmanager 实例。
-
Prometheus 实例 :用于创建和管理 Prometheus Server;
-
ServiceMonitor 实例 :用于通过监听 Service(内部路由)获取抓取配置,并同步到 Prometheus Sever,完成指标采集;
-
PodMonitor 实例 :用于通过监听 Pod 获取抓取配置,并同步到 Prometheus Sever,完成 Pod 相关指标的采集;
-
PrometheusRule 实例 :用于为 Prometheus 添加 Alerting rules(告警规则)和 Recording rules(记录规则),并加载到 Prometheus Server;
-
AlertManager 实例 :用于创建和管理 AlertManager Server,通过 AlertManager Server 可实现告警的分发处理。
Prometheus Operator 管理资源实例的流程,如下图所示。

Prometheus 实例
参数说明
创建 Prometheus 实例的常用参数说明参见下表。
更多参数说明请参考 Prometheus CRD 。
参数 | 是否必填 | 说明 |
---|---|---|
baseImage | 是 | Prometheus 实例的镜像地址。例如:192.168.16.52:60080/ait/prometheus 。 |
version | 是 | Prometheus 实例的镜像版本。例如:v2.10.0 。 |
tag | 否 | Prometheus 实例的镜像版本。 说明:若输入,该参数的值会覆盖 version 的值。 |
replicas | 是 | Prometheus 实例运行的 Pod 个数。 |
serviceAccountName | 是 | Prometheus 实例的服务账号。 |
ruleSelector | 是 | 标签选择器,用于为 Prometheus 实例匹配 PrometheusRule。值为 Prometheus 待匹配的 PrometheusRule 的标签(label)。 仅当 PrometheusRule 的 label 能够被 Prometheus 的 ruleSelector 匹配到时,PrometheusRule 才能被同步到 Prometheus。 |
serviceMonitorSelector | 是 | 标签选择器,用于为 Prometheus 实例匹配 ServiceMonitor。值为 Prometheus 待匹配的 ServiceMonitor 的标签(label)。 仅当 ServiceMonitor 的 label 能够被 Prometheus 的 serviceMonitorSelector 匹配到时,ServiceMonitor 才能被同步到 Prometheus。 |
storage | 是 | Prometheus 实例的存储类型。支持选择: emptyDir:空卷,挂载到 Pod 中的容器。Pod 删除时该卷也会被删除; volumeClaimTemplate:卷申请模板,当有状态副本集(StatefulSet)使用 VolumeClaimTemplate 创建一个 PersistentVolume 时,会为每个 Pod 分配并创建一个有编号的持久卷声明(PVC)。YAML 示例如下图所示。 ![]() |
YAML 示例:
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
name: alertmanager-main
namespace: monitoring
spec:
baseImage: 192.168.16.52:60080/ait/alertmanager
replicas: 1
securityContext: {}
version: v0.17.0
使用指导
创建 Prometheus 实例后,Operator 会自动在实例所在命名空间中创建一个名称为 prometheus-{Prometheu 实例名称}
的有状态副本集(StatefulSet),当该有状态副本集的状态为 运行中 时,则 Prometheus 运行正常。
在实例所在命名空间中,创建一个 type 为 NodePort
的内部路由(Service)后,即可通过 {实例所在集群的任意节点的 IP}:{nodePort 值}
访问 Prometheus 的 Web 页面。内部路由的 YAML 示例如下:
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus
name: prometheus-web
namespace: monitoring ## Prometheus 实例所在命名空间名称。
spec:
ports:
- name: web
nodePort: 30800
port: 9090
protocol: TCP
targetPort: 9090
selector:
app: prometheus
sessionAffinity: None
type: NodePort
ServiceMonitor 实例
参数说明
创建 ServiceMonitor 实例的常用参数说明参见下表。
更多参数说明请参考 ServiceMonitor CRD 。
参数 | 是否必填 | 说明 |
---|---|---|
namespaceSelector | 是 | 标签选择器,为 ServiceMonitor 实例匹配指定命名空间下的 Endpoint。值为 ServiceMonitor 待匹配的 Endpoint 所在命名空间的标签(label)。 仅当命名空间的 label 能够被 ServiceMonitor 的 namespaceSelector 匹配到时,ServiceMonitor 才能使用该命名空间下的 Endpoint。 |
selector | 是 | 标签选择器,为 ServiceMonitor 实例匹配指定命名空间下的 Endpoint。值为 ServiceMonitor 待匹配的 Endpoint 的标签(label)。 仅当 Endpoint 的 label 能够被 ServiceMonitor 的 selector 匹配到时,ServiceMonitor 才能使用该 Endpoint。 |
jobLabel | 是 | Prometheus 采集到的 metrics(监控指标)的 job label,一般用于标识 metrics 是由谁采集的。 |
endpoints | 是 | 定义了 Prometheus 中一个抓取指标的配置信息。 |
YAML 示例:
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: prometheus
prometheus: kube-prometheus
name: servicemonitor-example
namespace: monitoring
spec:
endpoints:
- honorLabels: true
honorTimestamps: true
interval: 30s
path: /metrics
port: http
jobLabel: prometheus-operator
namespaceSelector:
any: true
sampleLimit: 10000
selector:
matchLabels:
k8s-app: prometheus-operator
使用指导
前提条件:如需通过 ServiceMonitor 获取 prometheus-operator 的指标,需要先在 ServiceMonitor 实例所在命名空间中为 prometheus-operator 创建一个内部路由(Service)。内部路由的 YAML 示例如下:
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: prometheus-operator
name: prometheus-operator
namespace: monitoring ## ServiceMonitor 实例所在命名空间名称
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
k8s-app: prometheus-operator ## Kubernets 服务的名称,此处以 prometheus-operator 为例
sessionAffinity: None
type: ClusterIP
请参考以下操作,验证 SeviceMonitor 实例是否创建成功并已连接到 Prometheus。
-
查看 Prometheus 的 Configuration 文件是否已同步到了 ServiceMonitor 的配置。Configuration 文件中的 job_name 由 ServiceMonitor 的命名空间和名称组成。如下图所示。
-
查看 Prometheus 是否生成对应的 Targets 目标。如下图所示。
-
查看 Prometheus 是否采集到了对应组件的指标。如下图所示。
如果以上操作结果均正常,表明通过 ServiceMonitor 实例成功采集到了对应 Exporter(提供监控数据的程序)数据。
PodMonitor 实例
参数说明
创建 PodMonitor 实例的常用参数说明参见下表。
更多参数说明请参考 PodMonitor CRD 。
参数 | 是否必填 | 说明 |
---|---|---|
namespaceSelector | 是 | 标签选择器,为 PodMonitor 实例匹配指定命名空间下的 Endpoint。值为 PodMonitor 待匹配的 Endpoint 所在命名空间的标签(label)。 仅当命名空间的 label 能够被 PodMonitor 的 namespaceSelector 匹配到时,PodMonitor 才能使用该命名空间下的 Endpoint。 |
selector | 是 | 标签选择器,为 PodMonitor 实例匹配指定命名空间下的 Endpoint。值为 PodMonitor 待匹配的 Endpoint 的标签(label)。 仅当 Endpoint 的 label 能够被 PodMonitor 的 selector 匹配到时,PodMonitor 才能使用该 Endpoint。 |
jobLabel | 是 | Prometheus 采集到的 metrics(监控指标)的 job label,一般用于标识 metrics 是由谁采集的。 |
endpoints | 是 | 定义了 Prometheus 中一个抓取指标的配置信息。 |
YAML 示例:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
labels:
k8s-app: prometheus
prometheus: kube-prometheus
name: podmonitor-example
namespace: monitoring
spec:
jobLabel: prometheus
namespaceSelector:
matchNames:
- monitoring
podMetricsEndpoints:
- interval: 30s
path: /metrics
port: web
sampleLimit: 10000
selector:
matchLabels:
app: prometheus
使用指导
请参考以下操作,验证 PodMonitor 实例是否创建成功并已连接到 Prometheus。
-
查看 Prometheus 的 Configuration 文件是否已同步到了 PodMonitor 的配置。Configuration 文件中的 job_name 由 PodMonitor 的命名空间和名称组成。如下图所示。
-
查看 Prometheus 是否生成对应的 Targets 目标。如下图所示。
-
查看 Prometheus 是否采集到了对应组件的指标。如下图所示。
如果以上操作结果均正常,表明通过 ServiceMonitor 实例成功采集到了对应 Exporter(提供监控数据的程序)数据。
PrometheusRule 实例
参数说明
创建 PrometheusRule 实例的常用参数说明参见下表。
更多参数说明请参考 PrometheusRule CRD 。
参数 | 是否必填 | 说明 |
---|---|---|
groups[].name | 是 | PrometheusRule 的分组名称。 |
groups[].rules[] | 是 | PrometheusRule 分组中的规则定义,支持 alerting rule、 recording rule。 |
YAML 示例:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: kube-prometheus
role: alert-rules
name: prometheus-example-rules
namespace: monitoring
spec:
groups:
- name: ./example.rules
rules:
- alert: TargetUP ## alerting rule
annotations:
aAnnotation: aValue
expr: up == 1
for: 60s
labels:
aLabel: aValue
recording rule 示例:
- expr: avg(node_cpu_utilization)
record: cluster_cpu_utilization
使用指导
请参考以下操作,验证 PrometheusRule 实例是否创建成功并已连接到 Prometheus。
-
查看 Prometheus 的 Rules 文件是否已同步到了 PrometheusRule 的配置。如下图所示。
-
如果告警被触发,在 Prometheus 的 Alerts 页面可查看被触发的告警。如下图所示。
Alertmanager 实例
参数说明
-
创建 AlertManager 实例前,需要在即将创建 AlertManager 实例的命名空间下手动创建一个保密字典(Secret)保存 AlertManager 的配置信息。如果未在 AlertManager 实例中指定该保密字典的名称(configSecret),AlertManager 会默认引用名称为
alertmanager-{AlertManager-Name}
的保密字典。保密字典的 YAML 示例如下:--- apiVersion: v1 data: alertmanager.yaml: Z2xvYmFsOgogIGh0dHBfY29uZmlnOgogICAgdGxzX2NvbmZpZzoKICAgICAgaW5zZWN1cmVfc2tpcF92ZXJpZnk……VzOiBudWxsCg== kind: Secret metadata: labels: alertmanager: kube-prometheus app: alertmanager name: alertmanager-alertmanager-main namespace: monitoring type: Opaque
参数说明:data.alertmanager.yaml 的值为用户自定义的 AlertManager 的配置文件经过 Base64 编码后的内容。
AlertManager 的配置文件( 了解更多 )内容示例(未经 Base64 编码):
global: http_config: tls_config: insecure_skip_verify: true resolve_timeout: 1m receivers: - name: default-receiver webhook_configs: - send_resolved: true url: https://192.168.16.52/v1/alerts/global/router route: group_by: - alertname group_interval: 10s group_wait: 0s receiver: default-receiver repeat_interval: 1h routes: - match: alert_repeat_interval: 5m repeat_interval: 5m - match: alert_repeat_interval: 10m repeat_interval: 10m - match: alert_repeat_interval: 15m repeat_interval: 15m - match: alert_repeat_interval: 30m repeat_interval: 30m - match: alert_repeat_interval: 1h repeat_interval: 1h - match: alert_repeat_interval: 3h repeat_interval: 3h - match: alert_repeat_interval: 6h repeat_interval: 6h - match: alert_repeat_interval: 12h repeat_interval: 12h - match: alert_repeat_interval: 1d repeat_interval: 24h - match: alert_repeat_interval: never repeat_interval: 17280h - match: severity: Low repeat_interval: 5m - match: severity: Medium repeat_interval: 5m - match: severity: High repeat_interval: 5m - match: severity: Critical repeat_interval: 5m
-
创建 Alertmanager 实例的常用参数说明参见下表。
更多参数说明请参考 Alertmanager CRD 。
参数 是否必填 说明 baseImage 是 Alertmanager 实例的镜像地址。例如: 192.168.16.52:60080/ait/alertmanager
。version 是 Alertmanager 实例的镜像版本。例如: v0.17.0
。tag 否 Alertmanager 实例的镜像版本。
说明:若输入,该参数的值会覆盖 version 的值。configSecret 否 Alertmanager 实例引用的保密字典,作为 Alertmanager 的配置文件使用,内容可包含用户的自定义配置信息。 replicas 是 Alertmanager 实例运行的 Pod 个数。 retention 是 AlertManager 实例的数据保留时间,默认为 120h
;格式如:`[0-9]+(msstorage 是 AlertManager 实例的存储类型。支持选择:
emptyDir:空卷,挂载到 Pod 中的容器。Pod 删除时该卷也会被删除;
volumeClaimTemplate:卷申请模板,当有状态副本集(StatefulSet)使用 VolumeClaimTemplate 创建一个 PersistentVolume 时,会为每个 Pod 分配并创建一个有编号的 PVC。YAML 示例如下图所示。YAML 示例:
apiVersion: monitoring.coreos.com/v1 kind: Alertmanager metadata: name: alertmanager-main namespace: monitoring spec: baseImage: 192.168.16.52:60080/ait/alertmanager replicas: 1 securityContext: {} version: v0.17.0
使用指导
创建 AlertManager 实例后,Operator 会自动在实例所在命名空间中创建一个名称为 alertmanager-{alertmanager 实例名称}
的有状态副本集(StatefulSet),当该有状态副本集的状态为 运行中 时,则 Alertmanager 运行正常。
在实例所在命名空间中,创建一个 type 为 NodePort
的内部路由(Service)后,即可通过 {实例所在集群的任意节点的 IP}:{nodePort 值}
访问 Alertmanager 的 Web 页面。内部路由 YAML 示例如下:
apiVersion: v1
kind: Service
metadata:
name: alertmanager-web
namespace: monitoring
spec:
ports:
- name: web
nodePort: 30801
port: 9093
protocol: TCP
targetPort: 9093
selector:
app: alertmanager
sessionAffinity: None
type: NodePort
当 Prometheus 有告警被触发时,会发送告警至 AlertManager,在 AlertManager 中可查看告警信息,如下图所示。
