更改 kube-prometheus-stack 规则

警告

本文的方法还在学习和探索中,目前我暂时采用手工修订方法,实际上还不符合社区 kube-prometheus-stack 修订规范。正确的修订方法应该参考 kube-prometheus-stack hacks 使用社区提供的工具进行修订,而不是直接修改Kubernetes已经安装的对象。

备注

通过 helmpull 下载 kube-prometheus-stack 定制Helm charts ,可以看到社区推荐 kube-prometheus-stack hacks 修订方法

使用Helm 3在Kubernetes集群部署Prometheus和Grafana 之后,我们可以通过以下命令观察到 kube-prometheus-stack 部署了哪些对象:

获取 kube-prometheus-stack 安装的对象
helm --namespace prometheus get manifest kube-prometheus-stack-1681228346 | kubectl get -f -

kube-prometheus-stack 告警配置 添加了自定义规则,那么,对于 kube-prometheus-stack 提供的默认规则,我们有办法修订么?

根据 helm get maifest 输出可以看到规则对象是:

prometheusrule.monitoring.coreos.com/kube-prometheus-stack-1681-alertmanager.rules
...

检查这个规则对象,可以直接编辑 prometheusrule 修订,不过这不是标准方法(后续补充),只能临时修订

修订默认15分钟 pending 告警

在生产环境,有些告警不需要默认15分钟直接通知,因为生产中有一些自动化工具会定时清理掉 Error 状态的 pods ,所以修订 KubePodNotReady 告警通知周期(也就是允许 pending 一段状态才会发送告警)

helm pullkube-prometheus-stack 搜索 KubePodNotReady 关键字,可以看到 templates/prometheus/rules-1.14/kubernetes-apps.yaml 配置了这个告警规则:

KubePodNotReady 告警规则
{{- if not (.Values.defaultRules.disabled.KubePodNotReady | default false) }}
    - alert: KubePodNotReady
      annotations:
{{- if .Values.defaultRules.additionalRuleAnnotations }}
{{ toYaml .Values.defaultRules.additionalRuleAnnotations | indent 8 }}
{{- end }}
{{- if .Values.defaultRules.additionalRuleGroupAnnotations.kubernetesApps }}
{{ toYaml .Values.defaultRules.additionalRuleGroupAnnotations.kubernetesApps | indent 8 }}
{{- end }}
        description: Pod {{`{{`}} $labels.namespace {{`}}`}}/{{`{{`}} $labels.pod {{`}}`}} has been in a non-ready state for longer than 15 minutes.
        runbook_url: {{ .Values.defaultRules.runbookUrl }}/kubernetes/kubepodnotready
        summary: Pod has been in a non-ready state for more than 15 minutes.
      expr: |-
        sum by (namespace, pod, cluster) (
          max by(namespace, pod, cluster) (
            kube_pod_status_phase{job="kube-state-metrics", namespace=~"{{ $targetNamespace }}", phase=~"Pending|Unknown|Failed"}
          ) * on(namespace, pod, cluster) group_left(owner_kind) topk by(namespace, pod, cluster) (
            1, max by(namespace, pod, owner_kind, cluster) (kube_pod_owner{owner_kind!="Job"})
          )
        ) > 0
      for: 15m
      labels:
        severity: warning
      {{- if or .Values.defaultRules.additionalRuleLabels .Values.defaultRules.additionalRuleGroupLabels.kubernetesApps }}
        {{- with .Values.defaultRules.additionalRuleLabels }}
          {{- toYaml . | nindent 8 }}
        {{- end }}
        {{- with .Values.defaultRules.additionalRuleGroupLabels.kubernetesApps }}
          {{- toYaml . | nindent 8 }}
        {{- end }}
      {{- end }}
{{- end }}
  • 检查系统规则:

    kubectl -n prometheus get prometheusrule
    

对应 KubePodNotReadyprometheusrulekube-prometheus-stack-1681-kubernetes-apps

  • 编辑:

    kubectl -n prometheus edit prometheusrule kube-prometheus-stack-1681-kubernetes-apps
    

当前内容就是前面 helm pull 下来 kube-prometheus-stack 的默认 kubernetes-apps.yaml 的15分钟配置,修改对应时间(例如我修改成 185m 也就是 3h5m )并保存。

备注

后续我实践 helm定制 kube-prometheus-stack 时会按照标准方式修订默认规则,待实践

参考