4. 故障排查前置准备:日志收集与环境快照

存储版本漂移校准的第一步,是建立完整的故障现场数据基线。缺少日志或环境快照,后续的版本比对、链路追踪、根因定位都将失去依据。本节围绕三类日志(kubelet、CSI sidecar、存储阵列)和环境快照的采集方法展开,确保你在排查前拥有可回溯、可交叉验证的数据集。

4.1 日志收集的三条主线

CSI 通信链路涉及 Kubernetes 节点代理、CSI 控制器/节点插件以及后端存储系统。日志必须覆盖这三层,缺一不可。

日志来源 关键作用 采集命令/路径 常见问题
kubelet 日志 记录挂载/卸载、卷健康检查、设备映射等节点操作 journalctl -u kubelet -n 5000 --no-pager 挂载超时、设备路径冲突、节点注册失败
CSI sidecar 日志 记录卷创建/删除、挂载/卸载、快照、扩容等 CSI 调用 kubectl logs -n <ns> <pod> -c <sidecar-name> gRPC 调用失败、版本协商错误、超时重试
存储阵列日志 记录 LUN 映射、iSCSI/FC 连接、访问控制、性能数据 厂商 CLI 或 Web 界面导出(如 storcli /c0 show all) LUN 未映射、CHAP 认证失败、端口链路抖动
采集时机:在复现故障前启动持续日志采集,避免丢失关键上下文。建议使用 kubectl logs --follow 或 journalctl -f 实时捕获。

4.2 日志采集详细步骤

4.2.1 kubelet 日志

kubelet 日志通常通过 systemd journal 管理。采集时需包含故障发生前后至少 30 分钟的数据。

# 采集当前节点 kubelet 日志,输出最近 10000 行
journalctl -u kubelet --since "2025-03-01 14:00:00" --until "2025-03-01 15:00:00" --no-pager > kubelet_20250301_14-15.log

# 若故障正在发生,使用 -f 实时追加
journalctl -u kubelet -f > kubelet_live.log &

4.2.2 CSI sidecar 日志

CSI sidecar 容器通常与 CSI driver 容器运行在同一 Pod 内。需要分别采集 csi-provisioner、csi-attacher、csi-resizer、csi-snapshotter 等 sidecar 的日志。

# 获取 CSI driver Pod 名称
kubectl get pods -n csi-system | grep <driver-name>

# 采集 provisioner sidecar 日志
kubectl logs -n csi-system <pod-name> -c csi-provisioner --tail=10000 > csi-provisioner.log

# 采集 attacher sidecar 日志
kubectl logs -n csi-system <pod-name> -c csi-attacher --tail=10000 > csi-attacher.log

# 若 Pod 已重启,使用 --previous 获取崩溃前日志
kubectl logs -n csi-system <pod-name> -c csi-provisioner --previous > csi-provisioner_previous.log

4.2.3 存储阵列日志

存储阵列日志的采集方式因厂商而异。以下以常见场景为例:

  • Dell EMC PowerStore: 通过 PowerStore Manager 导出系统事件日志,或使用 REST API 拉取。
  • NetApp ONTAP: set diag; event log show -severity error
  • HPE 3PAR: showalert -d 或通过 SSMC 导出。
  • 通用 iSCSI 阵列: 检查 iSCSI 会话状态:iscsiadm -m session -P 3
注意:存储阵列日志的时间戳可能与 Kubernetes 集群存在时区偏差。采集后务必统一转换为 UTC 或同一时区,否则版本漂移校准的时间线会错乱。

4.3 环境快照:固化故障现场

环境快照是对集群当前状态的“冻结”记录,用于后续版本比对和链路重建。快照内容应包含以下维度:

快照维度 采集命令/方法 用途
CSI Driver 版本 kubectl get csidriver -o yaml 确认 driver 注册版本与预期是否一致
CSI Node/Controller 状态 kubectl get pods -n csi-system -o wide 检查 Pod 运行状态、重启次数、节点分布
存储类与卷绑定 kubectl get sc,pv,pvc -o wide 查看卷的 provisioner、挂载参数、状态
节点存储设备状态 lsblk; mount | grep /var/lib/kubelet 确认设备映射和挂载点是否存在
gRPC 探针状态 kubectl describe pod -n csi-system <pod> 查看 readiness/liveness probe 失败记录
# 一键采集环境快照脚本示例
#!/bin/bash
SNAPSHOT_DIR="csi_snapshot_$(date +%Y%m%d_%H%M%S)"
mkdir -p $SNAPSHOT_DIR

kubectl get csidriver -o yaml > $SNAPSHOT_DIR/csidriver.yaml
kubectl get pods -n csi-system -o wide > $SNAPSHOT_DIR/csi_pods.txt
kubectl get sc,pv,pvc --all-namespaces -o wide > $SNAPSHOT_DIR/storage_resources.txt
kubectl describe nodes > $SNAPSHOT_DIR/nodes.txt
kubectl get events --all-namespaces --sort-by='.lastTimestamp' > $SNAPSHOT_DIR/events.txt

echo "环境快照已保存至: $SNAPSHOT_DIR"

4.4 日志与快照的关联分析

采集完成后,需要将三类日志与环境快照进行时间轴对齐。下图展示了日志与快照的关联分析流程:

日志与环境快照关联分析流程 日志与环境快照关联分析流程 kubelet 日志 CSI sidecar 日志 存储阵列日志 时间戳对齐(统一时区 → 时间轴合并) 环境快照(版本、状态、设备映射) 交叉验证 → 版本漂移定位
关键原则:日志中的错误时间戳必须与环境快照中的版本变更时间点进行比对。例如,若 sidecar 日志在 14:32:15 报出 unsupported version,而环境快照显示 CSI driver 镜像版本在 14:30 被更新,则版本漂移的窗口已锁定。

4.5 常见采集遗漏与避坑

  • 遗漏 sidecar 崩溃前日志:Pod 重启后,当前日志仅包含新进程日志。务必使用 --previous 参数获取崩溃前的日志。
  • 存储阵列日志未包含控制面:部分阵列的管理节点日志与数据节点日志分离,需分别采集。
  • 环境快照未包含 CSI 驱动配置:ConfigMap 和 Secret 中的参数(如阵列 IP、CHAP 密码)是版本漂移校准的关键输入。
  • 忽略节点内核日志:SCSI 层错误、多路径故障常出现在 dmesg 中,建议一并采集:dmesg -T | grep -E "sd|dm|multipath|iscsi"