在 CentOS 上搭建 Kubernetes 监控与告警
一 架构与组件
- 采集与存储:使用 Prometheus 抓取并存储指标;可视化用 Grafana 展示面板与图表。
- 节点与容器指标:Node Exporter 采集节点级系统指标;cAdvisor 已集成在 kubelet 中采集容器资源;kube-state-metrics 提供 Deployment、Pod、Node 等对象的状态指标。
- 告警路由与通知:Alertmanager 负责告警分组、抑制、静默与路由到邮件、Webhook 等接收端。
- 快速落地:推荐使用 kube-prometheus-stack Helm Chart,一次性部署 Prometheus、Alertmanager、Node Exporter、kube-state-metrics 及常用 Grafana 面板。
二 快速部署步骤
- 准备命名空间与 Helm:
- kubectl create ns monitoring
- helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- 安装监控栈(含 Prometheus、Alertmanager、Node Exporter、kube-state-metrics、Grafana 仪表盘):
- helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
- 访问服务(NodePort 或 Ingress 取决于你的安装参数):
- Prometheus:http://:/ 或 http://prometheus-server.monitoring.svc.cluster.local:80
- Alertmanager:http://:/ 或 http://alertmanager-main.monitoring.svc.cluster.local:9093
- Grafana:http://:/ 或 http://grafana.monitoring.svc.cluster.local:3000(默认账号 admin/admin)
- 在 Grafana 添加数据源:选择 Prometheus,URL 填 http://prometheus-server.monitoring.svc.cluster.local:80;导入官方面板(如 Kubernetes Cluster Monitoring / Node Exporter Full)。
三 告警规则示例
- 节点宕机
- 规则:
- groups:
- name: node
rules:
- alert: NodeDown
expr: up{job=“node-exporter”} == 0
for: 1m
labels: severity: critical
annotations:
summary: “Node {{ $labels.instance }} down”
description: “Node {{ $labels.instance }} has been down for more than 1 minute.”
- Pod 重启过多
- 规则:
- groups:
- name: pod
rules:
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total{job=“kube-state-metrics”}[5m]) > 0
for: 5m
labels: severity: warning
annotations:
summary: “Pod {{ $labels.namespace }}/{{ $labels.pod }} is crash looping”
- 部署副本不足
- 规则:
- groups:
- name: deployment
rules:
- alert: DeploymentReplicasMismatch
expr: (deployment_spec_replicas{job=“kube-state-metrics”} - deployment_status_replicas_available{job=“kube-state-metrics”}) > 0
for: 5m
labels: severity: warning
annotations:
summary: “Deployment {{ $labels.namespace }}/{{ $labels.deployment }} replicas not ready”
- 应用 Pod CPU 高占用
- 规则:
- groups:
- name: pod-cpu
rules:
- alert: PodHighCpuUsage
expr: sum(rate(container_cpu_usage_seconds_total{container!=“POD”,namespace=“default”}[5m])) by (pod) / sum(machine_cpu_cores) > 0.9
for: 5m
labels: severity: critical
annotations:
summary: “Pod {{ $labels.namespace }}/{{ $labels.pod }} CPU > 90%”
- 方式一(推荐)使用 PrometheusRule CRD 创建:
- kubectl apply -f pod-cpu-rule.yaml
- 方式二在 kube-prometheus-stack 中自定义规则文件(values.yaml 的 additionalPrometheusRules 段)并升级 release。
四 配置 Alertmanager 通知
- 创建密钥保存配置(示例为 SMTP 邮件):
- cat > alertmanager.yml <<‘EOF’
global:
resolve_timeout: 5m
route:
group_by: [alertname]
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receiver: email-me
receivers:
- name: email-me
email_configs:
- to: you@example.com
from: alertmanager@example.com
smarthost: smtp.example.com:587
auth_username: user
auth_password: pass
require_tls: true
EOF
- kubectl create secret generic alertmanager-main --from-file=alertmanager.yml -n monitoring
- 在 Prometheus CR 中关联 Alertmanager(kube-prometheus-stack 通常已自动配置,如未生效可补充):
- spec:
alerting:
alertmanagers:
- namespace: monitoring
name: alertmanager-main
port: web
- 验证:
- 端口转发查看 Alertmanager:kubectl port-forward -n monitoring svc/alertmanager-main 9093
- 触发告警后在 Alertmanager UI 与邮箱查看告警。
五 验证与常见问题
- 验证抓取与健康:
- Prometheus:访问 /targets,确认 node-exporter、kube-state-metrics、kubelet/cAdvisor、prometheus 等 Job 均为 UP。
- Alertmanager:访问 /alerts 与 /status,确认路由与接收器生效。
- Grafana:导入面板后查看 CPU、内存、Pod 状态、Deployment 副本数 等关键图表。
- 常见问题与排查:
- 抓取失败:检查 ServiceMonitor/Endpoints 标签匹配、Service 端口名、RBAC 权限、网络策略与 kubelet 10250/10255 访问策略。
- 邮件发送失败:核对 SMTP 地址、端口、TLS/SSL、账号密码;必要时改用 Webhook(企业微信、钉钉、Slack)。
- 面板无数据:确认 Prometheus 数据源 URL 正确、时间范围合适、指标名称与 PromQL 一致。
- 节点指标缺失:确认 Node Exporter DaemonSet 已调度到所有节点且 9090/9100 端口未被占用。