Skip to content

第六部分 可观测性体系

可观测性是运维工作的眼睛。本部分讲解如何基于 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 本章练习

  1. 解释 Metrics、Logs、Traces 的区别和联系。
  2. 列举四个黄金指标。
  3. 解释 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-namespace

22.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: 15s

22.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 / xxx

22.7 本章练习

  1. 部署 Prometheus + Grafana。
  2. 在 Grafana 中导入 Node Exporter 仪表盘。
  3. 编写 3 个 PromQL 查询:CPU 使用率、内存使用率、Pod 重启次数。
  4. 为一个应用创建 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=false

23.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-logs

23.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 本章练习

  1. 部署 Loki + Promtail,在 Grafana 中查询容器日志。
  2. 使用 LogQL 查询包含 "error" 的日志。
  3. 了解 ELK 栈的架构和各组件作用。
  4. 比较 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/High30 分钟内响应节点 NotReady、大量 Pod 异常
P2/Medium工作时间内响应资源使用率告警
P3/Low可延后处理证书即将过期

24.5 故障响应流程

  1. 发现:告警、监控、用户反馈
  2. 确认:确认故障影响范围
  3. 定位:快速定位根因
  4. 止损:先恢复服务,再查根因
  5. 修复:彻底解决问题
  6. 复盘:记录 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."
EOF

24.7 本章练习

  1. 为节点内存使用率创建告警规则。
  2. 为 Pod 重启创建告警规则。
  3. 配置 Alertmanager 通过邮件或 Webhook 发送告警。
  4. 设计一个故障响应流程图。

第六部分总结

完成本阶段学习后,你应该能够:

  • 理解可观测性三大支柱
  • 部署 Prometheus + Grafana 监控系统
  • 编写 PromQL 查询和告警规则
  • 部署 Loki/ELK 日志系统
  • 配置 Alertmanager 告警路由
  • 建立故障响应流程

进入下一阶段:运维自动化与平台化