从原始 Prometheus 规则文件创建一个 prometheus-operator `PrometheusRule` (CRD)?
Create a prometheus-operator `PrometheusRule` (CRD) from a raw Prometheus rule file?
像这样的 Prometheus 规则文件:
groups:
- name: ./example.rules
rules:
- alert: ExampleAlert
expr: vector(1)
Kubernetes prometheus-operator 需要一层额外的 yaml 配置数据,如下所示:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
creationTimestamp: null
labels:
prometheus: example
role: alert-rules
name: prometheus-example-rules
spec:
groups:
- name: ./example.rules
rules:
- alert: ExampleAlert
expr: vector(1)
对于使用前者原始 Prometheus 规则格式的文件,我可以使用 Prometheus promtool
到 运行 单元测试。 (见下文 link 3)
对于使用后者的扩展 PrometheusRule 格式的文件,我可以使用 kubectl apply -f prometheus_rule_file.yaml
将规则加载到我的 prometheus-operator 安装中。
我想以其中一种文件格式编写和维护规则,并能够将相同的规则文件与 promtool 的单元测试系统一起使用,并将相同的规则加载到 prometheus-operator 安装中。我没有看到一个简单的方法来做到这一点。
有没有一种方法可以使用原始 Prometheus 规则格式并将其加载到 prometheus-operator PrometheusRule 中,而无需维护单独的冗余 yaml 文件,也无需编写自定义工具来转换它?
我使用 helm 的方法是创建一个单独的图表并将规则文件与图表文件一起放置。这意味着您需要独立部署它们,也许这就是您的意图。
步骤
- 创建一个 helm 图表:
helm create prometheus-rules
- 创建
rules
目录并将 prometheus 规则文件放入该目录。
- 删除
templates/
目录下所有不需要的yaml文件
- 新建模板文件
templates/prometheus-rules.yaml
- 在下面插入示例:
apiVersion: v1
kind: List
items:
{{- $root := .Files }}
{{- range $path, $bytes := $root.Glob "rules/**.yaml" }}
- apiVersion: "monitoring.coreos.com/v1"
kind: PrometheusRule
metadata:
name: prometheus-rules-{{ $path | base }}
labels:
app: prometheus-operator
spec:
groups:
{{ $root.Get $path | indent 8 }}
{{- end}}
注意:一件棘手的事情是在安装 prometheus-operator 图表时注意 prometheus.prometheusSpec.ruleSelectorNilUsesHelmValues
值。它只会加载与在 prometheus-operator 期间安装的标签相同的规则。您可以通过在安装 prometheus-operator 时将其设置为 false 来解决这个问题。有关详细信息,请参阅 ruleSelector logic。
像这样的 Prometheus 规则文件:
groups:
- name: ./example.rules
rules:
- alert: ExampleAlert
expr: vector(1)
Kubernetes prometheus-operator 需要一层额外的 yaml 配置数据,如下所示:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
creationTimestamp: null
labels:
prometheus: example
role: alert-rules
name: prometheus-example-rules
spec:
groups:
- name: ./example.rules
rules:
- alert: ExampleAlert
expr: vector(1)
对于使用前者原始 Prometheus 规则格式的文件,我可以使用 Prometheus promtool
到 运行 单元测试。 (见下文 link 3)
对于使用后者的扩展 PrometheusRule 格式的文件,我可以使用 kubectl apply -f prometheus_rule_file.yaml
将规则加载到我的 prometheus-operator 安装中。
我想以其中一种文件格式编写和维护规则,并能够将相同的规则文件与 promtool 的单元测试系统一起使用,并将相同的规则加载到 prometheus-operator 安装中。我没有看到一个简单的方法来做到这一点。
有没有一种方法可以使用原始 Prometheus 规则格式并将其加载到 prometheus-operator PrometheusRule 中,而无需维护单独的冗余 yaml 文件,也无需编写自定义工具来转换它?
我使用 helm 的方法是创建一个单独的图表并将规则文件与图表文件一起放置。这意味着您需要独立部署它们,也许这就是您的意图。
步骤
- 创建一个 helm 图表:
helm create prometheus-rules
- 创建
rules
目录并将 prometheus 规则文件放入该目录。 - 删除
templates/
目录下所有不需要的yaml文件 - 新建模板文件
templates/prometheus-rules.yaml
- 在下面插入示例:
apiVersion: v1
kind: List
items:
{{- $root := .Files }}
{{- range $path, $bytes := $root.Glob "rules/**.yaml" }}
- apiVersion: "monitoring.coreos.com/v1"
kind: PrometheusRule
metadata:
name: prometheus-rules-{{ $path | base }}
labels:
app: prometheus-operator
spec:
groups:
{{ $root.Get $path | indent 8 }}
{{- end}}
注意:一件棘手的事情是在安装 prometheus-operator 图表时注意 prometheus.prometheusSpec.ruleSelectorNilUsesHelmValues
值。它只会加载与在 prometheus-operator 期间安装的标签相同的规则。您可以通过在安装 prometheus-operator 时将其设置为 false 来解决这个问题。有关详细信息,请参阅 ruleSelector logic。