主题
第六部分 可观测性体系
可观测性是运维工作的眼睛。本部分讲解如何基于 Prometheus、Grafana、Alertmanager、Loki/ELK 构建完整的监控、日志和告警体系。
第 21 章 可观测性三大支柱
21.1 可观测性概述
可观测性(Observability)是指通过系统的外部输出推断其内部状态的能力。三大支柱:
| 支柱 | 说明 | 工具 |
|---|---|---|
| Metrics(指标) | 可聚合的数值数据,如 CPU、内存、请求量 | Prometheus、VictoriaMetrics |
| Logs(日志) | 离散的事件记录 | Loki、ELK、Fluentd |
| Traces(链路) | 请求在分布式系统中的完整路径 | Jaeger、Zipkin、SkyWalking |
21.2 黄金指标
Google SRE 推荐的四个黄金指标:
| 指标 | 说明 |
|---|---|
| Latency(延迟) | 服务处理请求所需时间 |
| Traffic(流量) | 系统承载的请求量 |
| Errors(错误) | 请求失败率 |
| Saturation(饱和度) | 系统资源利用率 |
21.3 RED 方法
针对微服务的监控方法:
- Rate:请求速率
- Errors:错误率
- Duration:请求持续时间
21.4 USE 方法
针对资源的监控方法:
- Utilization:利用率
- Saturation:饱和度
- Errors:错误率
21.5 本章练习
- 解释 Metrics、Logs、Traces 的区别和联系。
- 列举四个黄金指标。
- 解释 RED 方法和 USE 方法分别适用于什么场景。
第 22 章 Prometheus 与 Grafana
22.1 Prometheus 架构
┌──────────────┐
│ Prometheus │
│ Server │
│ │
│ TSDB + HTTP │
└──────┬───────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────┴───┐ ┌────┴───┐ ┌────┴───┐
│Exporters│ │Pushgateway│ │Service │
│ │ │ │ │Discovery│
└────────┘ └───────────┘ └────────┘22.2 部署 Prometheus
使用 Helm 部署:
bash
# 添加仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 安装 kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace22.3 PromQL 基础
promql
# CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
# 磁盘使用率
100 * (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes)
# Pod CPU 使用
rate(container_cpu_usage_seconds_total[5m])
# HTTP 请求速率
rate(http_requests_total[5m])
# HTTP 错误率
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])22.4 Grafana 仪表盘
Grafana 是可视化平台,可以将 Prometheus 数据展示为图表。
常用 Dashboard:
- Node Exporter Full(节点监控)
- Kubernetes Cluster(集群监控)
- Kubernetes Pod(Pod 监控)
22.5 ServiceMonitor
ServiceMonitor 让 Prometheus 自动发现 K8s 中的监控目标。
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app
labels:
release: prometheus
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: metrics
path: /metrics
interval: 15s22.6 本章实验
实验 22-1:部署 kube-prometheus-stack
bash
# 1. 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 2. 添加仓库并安装
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
# 3. 查看 Pod
kubectl get pods -n monitoring
# 4. 访问 Grafana
kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
# 默认账号 admin / xxx22.7 本章练习
- 部署 Prometheus + Grafana。
- 在 Grafana 中导入 Node Exporter 仪表盘。
- 编写 3 个 PromQL 查询:CPU 使用率、内存使用率、Pod 重启次数。
- 为一个应用创建 ServiceMonitor。
第 23 章 日志系统(Loki/ELK)
23.1 日志收集架构
应用日志 -> Log Agent -> 日志存储 -> 日志查询/分析常见日志 Agent:
- Fluentd
- Fluent Bit
- Filebeat
- Promtail
23.2 Loki 架构
Loki 是 Grafana Labs 开发的日志聚合系统,与 Prometheus 设计理念相似。
┌────────────┐ ┌────────────┐ ┌────────────┐
│ Promtail │────▶│ Loki │◀────│ Grafana │
│ (Agent) │ │ (Storage) │ │ (Query) │
└────────────┘ └────────────┘ └────────────┘23.3 部署 Loki + Promtail
使用 Helm:
bash
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install loki grafana/loki-stack \
--namespace monitoring \
--set promtail.enabled=true \
--set grafana.enabled=false23.4 LogQL 基础
logql
# 查询所有日志
{job="varlogs"}
# 查询特定 Pod 日志
{pod="nginx-xxx"}
# 过滤包含 error 的日志
{job="varlogs"} |= "error"
# 统计错误日志数量
sum(rate({job="varlogs"} |= "error" [1m]))23.5 ELK 栈
ELK = Elasticsearch + Logstash + Kibana
| 组件 | 作用 |
|---|---|
| Elasticsearch | 日志存储和搜索 |
| Logstash | 日志收集和处理 |
| Kibana | 日志可视化和查询 |
| Beats | 轻量级数据采集器 |
23.6 Fluentd/Fluent Bit 配置
yaml
# fluent-bit-configmap 片段
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Parser docker
DB /var/log/flb_kube.db
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
[OUTPUT]
Name es
Match *
Host elasticsearch
Port 9200
Index k8s-logs23.7 本章实验
实验 23-1:部署 Loki 并查询日志
bash
# 1. 部署 Loki Stack
helm install loki grafana/loki-stack \
--namespace monitoring \
--set promtail.enabled=true
# 2. 在 Grafana 中添加 Loki 数据源
# URL: http://loki:3100
# 3. 在 Explore 中查询
{job="kubernetes-pods"}
{pod=~"nginx-.*"} |= "GET"23.8 本章练习
- 部署 Loki + Promtail,在 Grafana 中查询容器日志。
- 使用 LogQL 查询包含 "error" 的日志。
- 了解 ELK 栈的架构和各组件作用。
- 比较 Loki 和 ELK 的优缺点。
第 24 章 告警管理与故障响应
24.1 Alertmanager
Alertmanager 负责处理 Prometheus 发送的告警,进行分组、抑制、静默和路由。
24.2 PrometheusRule
yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: node-alerts
labels:
release: prometheus
spec:
groups:
- name: node
rules:
- alert: NodeHighCPUUsage
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is above 80% for more than 5 minutes."24.3 Alertmanager 配置
yaml
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alert@example.com'
route:
receiver: 'default'
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: critical
receiver: 'pager'
receivers:
- name: 'default'
email_configs:
- to: 'ops@example.com'
- name: 'pager'
webhook_configs:
- url: 'https://pager.example.com/webhook'24.4 告警分级
| 级别 | 响应要求 | 示例 |
|---|---|---|
| P0/Critical | 立即响应 | 核心服务不可用 |
| P1/High | 30 分钟内响应 | 节点 NotReady、大量 Pod 异常 |
| P2/Medium | 工作时间内响应 | 资源使用率告警 |
| P3/Low | 可延后处理 | 证书即将过期 |
24.5 故障响应流程
- 发现:告警、监控、用户反馈
- 确认:确认故障影响范围
- 定位:快速定位根因
- 止损:先恢复服务,再查根因
- 修复:彻底解决问题
- 复盘:记录 RCA,制定改进措施
24.6 本章实验
实验 24-1:创建 CPU 告警规则
bash
kubectl apply -f - <<EOF
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: cpu-alert
namespace: monitoring
labels:
release: prometheus
spec:
groups:
- name: cpu
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 2m
labels:
severity: critical
annotations:
summary: "CPU usage is high on {{ $labels.instance }}"
description: "CPU usage has been above 90% for more than 2 minutes."
EOF24.7 本章练习
- 为节点内存使用率创建告警规则。
- 为 Pod 重启创建告警规则。
- 配置 Alertmanager 通过邮件或 Webhook 发送告警。
- 设计一个故障响应流程图。
第六部分总结
完成本阶段学习后,你应该能够:
- 理解可观测性三大支柱
- 部署 Prometheus + Grafana 监控系统
- 编写 PromQL 查询和告警规则
- 部署 Loki/ELK 日志系统
- 配置 Alertmanager 告警路由
- 建立故障响应流程
进入下一阶段:运维自动化与平台化。