更改 kube-prometheus-stack
规则
警告
本文的方法还在学习和探索中,目前我暂时采用手工修订方法,实际上还不符合社区 kube-prometheus-stack
修订规范。正确的修订方法应该参考 kube-prometheus-stack hacks 使用社区提供的工具进行修订,而不是直接修改Kubernetes已经安装的对象。
备注
通过 helm 的 pull
下载 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 pull
的 kube-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
对应 KubePodNotReady
的 prometheusrule
是 kube-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 时会按照标准方式修订默认规则,待实践