From ec366e17252395f739935190131eeafc545cd47d Mon Sep 17 00:00:00 2001 From: panxiao81 Date: Fri, 25 Sep 2026 17:45:36 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E9=9B=86=E7=BE=A4=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=B8=BB=E6=9C=BA=E4=B8=8E=E9=80=9A=E7=9F=A5=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E5=9F=BA=E7=A1=80=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kube-state-metrics-helmrelease.yaml | 60 ++++++++ .../observability/metrics/kustomization.yaml | 4 + .../metrics/rules/host-health.yaml | 66 +++++++++ .../metrics/rules/kubernetes-health.yaml | 121 ++++++++++++++++ .../metrics/rules/monitoring-delivery.yaml | 58 ++++++++ .../metrics/tests/check-rules.sh | 20 +++ .../metrics/tests/foundation.test.yaml | 137 ++++++++++++++++++ .../observability/metrics/vmalertmanager.yaml | 6 + .../observability/operator/helmrelease.yaml | 2 + 9 files changed, 474 insertions(+) create mode 100644 platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml create mode 100644 platform/observability/metrics/rules/host-health.yaml create mode 100644 platform/observability/metrics/rules/kubernetes-health.yaml create mode 100644 platform/observability/metrics/rules/monitoring-delivery.yaml create mode 100644 platform/observability/metrics/tests/check-rules.sh create mode 100644 platform/observability/metrics/tests/foundation.test.yaml diff --git a/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml b/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml new file mode 100644 index 0000000..ccab68e --- /dev/null +++ b/platform/observability/metrics/exporters/kube-state-metrics-helmrelease.yaml @@ -0,0 +1,60 @@ +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: kube-state-metrics + namespace: monitoring +spec: + interval: 30m + timeout: 5m + dependsOn: + - name: vm-operator + - name: prometheus-operator-crds + chart: + spec: + chart: kube-state-metrics + version: 8.5.0 + sourceRef: + kind: HelmRepository + name: prometheus-community + namespace: monitoring + interval: 1h + driftDetection: + mode: enabled + install: + remediation: + retries: 3 + upgrade: + remediation: + retries: 3 + values: + fullnameOverride: kube-state-metrics + collectors: + - cronjobs + - daemonsets + - deployments + - jobs + - namespaces + - nodes + - persistentvolumeclaims + - persistentvolumes + - pods + - statefulsets + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 384Mi + prometheus: + monitor: + enabled: true + jobLabel: app.kubernetes.io/name + http: + interval: 30s + honorLabels: true + metrics: + interval: 30s + honorLabels: true + selfMonitor: + enabled: true diff --git a/platform/observability/metrics/kustomization.yaml b/platform/observability/metrics/kustomization.yaml index 1008738..af1c18e 100644 --- a/platform/observability/metrics/kustomization.yaml +++ b/platform/observability/metrics/kustomization.yaml @@ -17,3 +17,7 @@ resources: - scrapes/kubelet.yaml - exporters/node-exporter.yaml - exporters/process-exporter.yaml + - exporters/kube-state-metrics-helmrelease.yaml + - rules/kubernetes-health.yaml + - rules/host-health.yaml + - rules/monitoring-delivery.yaml diff --git a/platform/observability/metrics/rules/host-health.yaml b/platform/observability/metrics/rules/host-health.yaml new file mode 100644 index 0000000..457574e --- /dev/null +++ b/platform/observability/metrics/rules/host-health.yaml @@ -0,0 +1,66 @@ +apiVersion: operator.victoriametrics.com/v1beta1 +kind: VMRule +metadata: + name: host-health + namespace: monitoring + labels: + app.kubernetes.io/part-of: victoria-metrics +spec: + groups: + - name: host-health + interval: 30s + rules: + - alert: HostMemoryLow + expr: (node_memory_MemAvailable_bytes{job="node-exporter"} / node_memory_MemTotal_bytes{job="node-exporter"}) + < 0.10 + for: 10m + labels: + severity: warning + annotations: + summary: 主机 {{ $labels.instance }} 可用内存不足 10% + description: 检查主机内存、Swap、进程 PSS;仅使用 node-exporter job,避免重复采集统计。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: HostFilesystemSpaceLow + expr: (node_filesystem_avail_bytes{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + / node_filesystem_size_bytes{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + < 0.10) and on(instance,device,mountpoint) (node_filesystem_readonly{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + == 0) + for: 15m + labels: + severity: warning + annotations: + summary: 主机 {{ $labels.instance }} {{ $labels.mountpoint }} 可用空间不足 10% + description: 检查文件系统和 ZFS dataset 容量,清理前确认数据归属。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: HostFilesystemInodesLow + expr: (node_filesystem_files_free{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + / node_filesystem_files{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + < 0.10) and on(instance,device,mountpoint) (node_filesystem_files{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + > 0) and on(instance,device,mountpoint) (node_filesystem_readonly{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + == 0) + for: 15m + labels: + severity: warning + annotations: + summary: 主机 {{ $labels.instance }} {{ $labels.mountpoint }} inode 不足 10% + description: 检查小文件数量,确认 filesystem 是否耗尽 inode。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: HostFilesystemReadOnly + expr: node_filesystem_readonly{job="node-exporter",fstype!~"tmpfs|devtmpfs|overlay|squashfs|nsfs|fuse.*",mountpoint!~"/run(/.*)?|/var/lib/kubelet/.*|/var/lib/docker/.*"} + == 1 + for: 5m + labels: + severity: critical + annotations: + summary: 主机 {{ $labels.instance }} {{ $labels.mountpoint }} 变为只读 + description: 排查磁盘和文件系统错误;不要直接强制重新挂载。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: HostZpoolUnhealthy + expr: node_zfs_zpool_state{job="node-exporter",state!="online"} == 1 + for: 5m + labels: + severity: critical + annotations: + summary: 主机 {{ $labels.instance }} ZFS 池 {{ $labels.zpool }} 状态 {{ $labels.state }} + description: 检查 zpool status、磁盘和冗余;零值状态不触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md diff --git a/platform/observability/metrics/rules/kubernetes-health.yaml b/platform/observability/metrics/rules/kubernetes-health.yaml new file mode 100644 index 0000000..f6b6625 --- /dev/null +++ b/platform/observability/metrics/rules/kubernetes-health.yaml @@ -0,0 +1,121 @@ +apiVersion: operator.victoriametrics.com/v1beta1 +kind: VMRule +metadata: + name: kubernetes-health + namespace: monitoring + labels: + app.kubernetes.io/part-of: victoria-metrics +spec: + groups: + - name: kubernetes-health + interval: 30s + rules: + - alert: KubeNodeNotReady + expr: max by (node) (kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"}) + == 0 + for: 5m + labels: + severity: critical + annotations: + summary: 节点 {{ $labels.node }} 未就绪 + description: 检查节点、kubelet 和网络;维护时按 node 精确静默。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubeNodePressure + expr: max by (node, condition) (kube_node_status_condition{job="kube-state-metrics",condition=~"MemoryPressure|DiskPressure|PIDPressure",status="true"}) + == 1 + for: 5m + labels: + severity: warning + annotations: + summary: 节点 {{ $labels.node }} 出现 {{ $labels.condition }} + description: 检查内存、磁盘/inode 或 PID 资源压力。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubePodCrashLooping + expr: max by (namespace,pod,container) (kube_pod_container_status_waiting_reason{job="kube-state-metrics",reason="CrashLoopBackOff"}) + == 1 + for: 10m + labels: + severity: warning + annotations: + summary: 容器 {{ $labels.namespace }}/{{ $labels.pod }}/{{ $labels.container }} 持续崩溃 + description: 检查容器退出原因和日志;持续 10 分钟后通知,避免短暂重启噪声。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubePodFrequentRestarts + expr: sum by (namespace,pod,container) (increase(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[15m])) + > 3 + for: 5m + labels: + severity: warning + annotations: + summary: 容器 {{ $labels.namespace }}/{{ $labels.pod }}/{{ $labels.container }} 频繁重启 + description: 15 分钟内重启超过 3 次,检查退出原因和资源限制。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubePodOOMKilled + expr: (max by (namespace,pod,container) (kube_pod_container_status_last_terminated_reason{job="kube-state-metrics",reason="OOMKilled"}) + == 1) and on(namespace,pod,container) (sum by (namespace,pod,container) (increase(kube_pod_container_status_restarts_total{job="kube-state-metrics"}[10m])) + > 0) + for: 1m + labels: + severity: warning + annotations: + summary: 容器 {{ $labels.namespace }}/{{ $labels.pod }}/{{ $labels.container }} 发生 OOM 重启 + description: 仅在近期有重启且最近终止原因为 OOMKilled 时触发,检查内存峰值和限制。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubePodPending + expr: max by (namespace,pod) (kube_pod_status_phase{job="kube-state-metrics",phase="Pending"}) == 1 + for: 15m + labels: + severity: warning + annotations: + summary: Pod {{ $labels.namespace }}/{{ $labels.pod }} 长时间 Pending + description: 检查调度事件、资源、卷和镜像拉取。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubeDeploymentUnavailable + expr: (max by(namespace,deployment) (kube_deployment_spec_replicas{job="kube-state-metrics"}) - max by(namespace,deployment) + (kube_deployment_status_replicas_available{job="kube-state-metrics"})) > 0 + for: 10m + labels: + severity: warning + annotations: + summary: Deployment {{ $labels.namespace }}/{{ $labels.deployment }} 副本不足 + description: 可用副本持续 10 分钟低于声明值;缩容至零不会触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubeStatefulSetUnavailable + expr: (max by(namespace,statefulset) (kube_statefulset_replicas{job="kube-state-metrics"}) - max by(namespace,statefulset) + (kube_statefulset_status_replicas_ready{job="kube-state-metrics"})) > 0 + for: 10m + labels: + severity: warning + annotations: + summary: StatefulSet {{ $labels.namespace }}/{{ $labels.statefulset }} 副本不足 + description: 检查 Pod 就绪、存储和依赖;已知维护按工作负载精确静默。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubeDaemonSetUnavailable + expr: (max by(namespace,daemonset) (kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics"}) + - max by(namespace,daemonset) (kube_daemonset_status_number_ready{job="kube-state-metrics"})) > 0 + for: 10m + labels: + severity: warning + annotations: + summary: DaemonSet {{ $labels.namespace }}/{{ $labels.daemonset }} 副本不足 + description: 检查节点和 Pod 就绪;不按整个 namespace 屏蔽。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubePVCPending + expr: max by(namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_status_phase{job="kube-state-metrics",phase="Pending"}) + == 1 + for: 15m + labels: + severity: warning + annotations: + summary: PVC {{ $labels.namespace }}/{{ $labels.persistentvolumeclaim }} 长时间 Pending + description: 检查 StorageClass、调度拓扑、容量与 provisioner。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: KubeJobFailed + expr: max by(namespace,job_name) (kube_job_failed{job="kube-state-metrics",condition="true"}) == 1 + for: 5m + labels: + severity: warning + annotations: + summary: Job {{ $labels.namespace }}/{{ $labels.job_name }} 已失败 + description: 检查失败 Job 的 Pod 和任务日志;成功重试中的失败 Pod 计数不作为失败 Job。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md diff --git a/platform/observability/metrics/rules/monitoring-delivery.yaml b/platform/observability/metrics/rules/monitoring-delivery.yaml new file mode 100644 index 0000000..f31319d --- /dev/null +++ b/platform/observability/metrics/rules/monitoring-delivery.yaml @@ -0,0 +1,58 @@ +apiVersion: operator.victoriametrics.com/v1beta1 +kind: VMRule +metadata: + name: monitoring-delivery + namespace: monitoring + labels: + app.kubernetes.io/part-of: victoria-metrics +spec: + groups: + - name: monitoring-delivery + interval: 30s + rules: + - alert: KubeStateMetricsUnavailable + expr: up{job="kube-state-metrics"} == 0 or absent(up{job="kube-state-metrics"}) + for: 5m + labels: + severity: critical + annotations: + summary: kube-state-metrics 采集不可用 + description: 检查 HelmRelease、ServiceMonitor 转换、targets 与 exporter;目标消失也会触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: NodeExporterUnavailable + expr: up{job="node-exporter"} == 0 or absent(up{job="node-exporter"}) + for: 5m + labels: + severity: critical + annotations: + summary: node-exporter 采集不可用 + description: 检查节点与 exporter,主机健康规则依赖此采集。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: NatsMetricsUnavailable + expr: up{job="nats/nats"} == 0 or absent(up{job="nats/nats"}) + for: 5m + labels: + severity: warning + annotations: + summary: NATS 指标采集不可用 + description: 依次检查 PodMonitor、转换后的 VMPodScrape、:7777 exporter 及 targets。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: AlertmanagerTelegramDeliveryFailed + expr: sum by(job,instance,integration) (increase(alertmanager_notifications_failed_total{job="vmalertmanager-main",integration="telegram"}[5m])) + > 0 + for: 1m + labels: + severity: critical + annotations: + summary: Alertmanager 向 Telegram 发送失败 + description: 检查网络、bot token 和频道权限。若 Telegram 完全不可达,本告警也无法经同一渠道送达;需在 Alertmanager/Grafana 排查,集群外心跳另行建设。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md + - alert: AlertmanagerConfigurationReloadFailed + expr: alertmanager_config_last_reload_successful{job="vmalertmanager-main"} == 0 + for: 5m + labels: + severity: critical + annotations: + summary: Alertmanager 配置加载失败 + description: 检查 operator 和 Alertmanager 日志、配置格式及 Secret 引用。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md diff --git a/platform/observability/metrics/tests/check-rules.sh b/platform/observability/metrics/tests/check-rules.sh new file mode 100644 index 0000000..b36be38 --- /dev/null +++ b/platform/observability/metrics/tests/check-rules.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# 依赖 Python 3 + PyYAML,以及 PATH 中的 promtool(验证版本 3.5.0)。 +set -euo pipefail +test_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +check_dir="$(mktemp -d)" +trap 'rm -rf "$check_dir"' EXIT +python3 - "$test_dir/../rules" "$check_dir/rules.yaml" <<'PY' +import pathlib +import sys +import yaml + +groups = [] +for name in ("kubernetes-health", "host-health", "monitoring-delivery"): + path = pathlib.Path(sys.argv[1]) / f"{name}.yaml" + groups.extend(yaml.safe_load(path.read_text())["spec"]["groups"]) +pathlib.Path(sys.argv[2]).write_text(yaml.safe_dump({"groups": groups}, allow_unicode=True)) +PY +cp "$test_dir/foundation.test.yaml" "$check_dir/foundation.test.yaml" +promtool check rules "$check_dir/rules.yaml" +promtool test rules "$check_dir/foundation.test.yaml" diff --git a/platform/observability/metrics/tests/foundation.test.yaml b/platform/observability/metrics/tests/foundation.test.yaml new file mode 100644 index 0000000..fa1e225 --- /dev/null +++ b/platform/observability/metrics/tests/foundation.test.yaml @@ -0,0 +1,137 @@ +rule_files: +- rules.yaml +evaluation_interval: 1m +tests: +- name: 健康 ZFS 的零值故障状态不报警 + interval: 1m + input_series: + - series: node_zfs_zpool_state{job="node-exporter",instance="laptop",zpool="data",state="degraded"} + values: '0x20' + - series: node_zfs_zpool_state{job="node-exporter",instance="laptop",zpool="data",state="online"} + values: 1x20 + alert_rule_test: + - eval_time: 10m + alertname: HostZpoolUnhealthy + exp_alerts: &id001 [] +- name: ZFS 降级持续五分钟触发 + interval: 1m + input_series: + - series: node_zfs_zpool_state{job="node-exporter",instance="laptop",zpool="data",state="degraded"} + values: 1x20 + alert_rule_test: + - eval_time: 4m + alertname: HostZpoolUnhealthy + exp_alerts: *id001 + - eval_time: 6m + alertname: HostZpoolUnhealthy + exp_alerts: + - exp_labels: + job: node-exporter + instance: laptop + zpool: data + state: degraded + severity: critical + exp_annotations: + summary: 主机 laptop ZFS 池 data 状态 degraded + description: 检查 zpool status、磁盘和冗余;零值状态不触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md +- name: 忽略旧 docker-hosts 重复主机指标 + interval: 1m + input_series: + - series: node_memory_MemAvailable_bytes{job="node-exporter",instance="laptop"} + values: 50x20 + - series: node_memory_MemTotal_bytes{job="node-exporter",instance="laptop"} + values: 100x20 + - series: node_memory_MemAvailable_bytes{job="docker-hosts",instance="laptop"} + values: 1x20 + - series: node_memory_MemTotal_bytes{job="docker-hosts",instance="laptop"} + values: 100x20 + alert_rule_test: + - eval_time: 15m + alertname: HostMemoryLow + exp_alerts: *id001 +- name: 临时文件系统耗尽不触发持久磁盘告警 + interval: 1m + input_series: + - series: node_filesystem_avail_bytes{job="node-exporter",instance="laptop",device="tmpfs",mountpoint="/run",fstype="tmpfs"} + values: 1x20 + - series: node_filesystem_size_bytes{job="node-exporter",instance="laptop",device="tmpfs",mountpoint="/run",fstype="tmpfs"} + values: 100x20 + - series: node_filesystem_readonly{job="node-exporter",instance="laptop",device="tmpfs",mountpoint="/run",fstype="tmpfs"} + values: '0x20' + alert_rule_test: + - eval_time: 20m + alertname: HostFilesystemSpaceLow + exp_alerts: *id001 +- name: Deployment 允许短暂滚动且缩零不报错 + interval: 1m + input_series: + - series: kube_deployment_spec_replicas{job="kube-state-metrics",namespace="app",deployment="web"} + values: 2x20 + - series: kube_deployment_status_replicas_available{job="kube-state-metrics",namespace="app",deployment="web"} + values: 1x20 + - series: kube_deployment_spec_replicas{job="kube-state-metrics",namespace="app",deployment="scaled-down"} + values: '0x20' + - series: kube_deployment_status_replicas_available{job="kube-state-metrics",namespace="app",deployment="scaled-down"} + values: '0x20' + alert_rule_test: + - eval_time: 5m + alertname: KubeDeploymentUnavailable + exp_alerts: *id001 + - eval_time: 11m + alertname: KubeDeploymentUnavailable + exp_alerts: + - exp_labels: + namespace: app + deployment: web + severity: warning + exp_annotations: + summary: Deployment app/web 副本不足 + description: 可用副本持续 10 分钟低于声明值;缩容至零不会触发。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md +- name: NATS 发现集合完全消失也报警 + interval: 1m + input_series: [] + alert_rule_test: + - eval_time: 6m + alertname: NatsMetricsUnavailable + exp_alerts: + - exp_labels: + job: nats/nats + severity: warning + exp_annotations: + summary: NATS 指标采集不可用 + description: 依次检查 PodMonitor、转换后的 VMPodScrape、:7777 exporter 及 targets。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md +- name: 历史 OOM 没有新重启不反复报警 + interval: 1m + input_series: + - series: kube_pod_container_status_last_terminated_reason{job="kube-state-metrics",namespace="app",pod="web",container="web",reason="OOMKilled"} + values: 1x20 + - series: kube_pod_container_status_restarts_total{job="kube-state-metrics",namespace="app",pod="web",container="web"} + values: 5x20 + alert_rule_test: + - eval_time: 10m + alertname: KubePodOOMKilled + exp_alerts: *id001 +- name: Telegram 失败跨 reason 汇总为一条 + interval: 1m + input_series: + - series: alertmanager_notifications_failed_total{job="vmalertmanager-main",instance="am",integration="telegram",reason="clientError"} + values: 0+1x20 + - series: alertmanager_notifications_failed_total{job="vmalertmanager-main",instance="am",integration="telegram",reason="serverError"} + values: 0+1x20 + alert_rule_test: + - eval_time: 6m + alertname: AlertmanagerTelegramDeliveryFailed + exp_alerts: + - exp_labels: + job: vmalertmanager-main + instance: am + integration: telegram + severity: critical + exp_annotations: + summary: Alertmanager 向 Telegram 发送失败 + description: 检查网络、bot token 和频道权限。若 Telegram 完全不可达,本告警也无法经同一渠道送达;需在 Alertmanager/Grafana + 排查,集群外心跳另行建设。 + runbook_url: https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/guides/monitoring-foundation.md diff --git a/platform/observability/metrics/vmalertmanager.yaml b/platform/observability/metrics/vmalertmanager.yaml index 9c7d041..4e7377d 100644 --- a/platform/observability/metrics/vmalertmanager.yaml +++ b/platform/observability/metrics/vmalertmanager.yaml @@ -24,6 +24,12 @@ spec: - receiver: telegram matchers: - severity="warning" + inhibit_rules: + - source_matchers: + - alertname="KubePodCrashLooping" + target_matchers: + - alertname="KubePodFrequentRestarts" + equal: [namespace, pod, container] receivers: - name: blackhole - name: telegram diff --git a/platform/observability/operator/helmrelease.yaml b/platform/observability/operator/helmrelease.yaml index fd23a3d..3798fe8 100644 --- a/platform/observability/operator/helmrelease.yaml +++ b/platform/observability/operator/helmrelease.yaml @@ -4,6 +4,8 @@ metadata: name: vm-operator namespace: monitoring spec: + dependsOn: + - name: prometheus-operator-crds chart: spec: chart: victoria-metrics-operator -- 2.54.0