目录
Please enable Javascript to view the contents

K8s存储-排障思路与常用命令

 ·  ☕ 3 分钟

系列导航

本系列从 K8s 存储模型入手,逐步展开到 CSI 插件实现与云原生存储全景。

① 概念 → ② Volume 生命周期 → ③ CSI 架构 → ④ FlexVolume 演进 → ⑤ 对比 → ⑥ 排障 ‖ ⑦ 开发 → ⑧ 高级特性 → ⑨ 演进展望

顺序文章定位
概念与入门基础——K8s 存储模型、PV/PVC/StorageClass
Volume 生命周期全解析全貌——两阶段处理、动态/静态供应
CSI 架构详解标准——gRPC 三服务、Sidecar 模式
FlexVolume 与 CSI 演进演进——FlexVolume 原理、CSI 设计思想
存储方案对比与选型选型——主流 CSI 插件横向对比
本篇 - 排障思路与常用命令运维——工具链 + 场景排查 + 性能
核心路径 ↑扩展展望 ↓
CSI 插件开发指南扩展——从零开发一个 CSI 插件
高级特性详解进阶——快照、克隆、扩容、拓扑感知
云原生存储演进与展望展望——容器原生存储、DPU 卸载

重要

存储排障按 Volume 生命周期逐阶段定位:PVC 是否 Pending → PV 是否 Bound → Attach 是否成功 → Mount 是否成功 → 文件系统是否可读写。每一步都有对应的 kubectl 命令和日志检查点。


1. 基础诊断工具链

工具用途示例
kubectl get pvc/pv/sc查看 PVC/PV/StorageClass 状态kubectl get pvc -A
kubectl describe pvc/pv查看事件和绑定状态kubectl describe pvc data-pvc
kubectl get volumeattachment查看 Attach 状态kubectl get volumeattachment
kubectl get pod -o yaml查看 Pod 的 Volume 挂载配置kubectl get pod web -o yaml
kubectl logs查看 CSI Sidecar 日志kubectl logs csi-provisioner -n kube-system
kubectl describe pod查看 Pod 事件(Mount 失败信息)kubectl describe pod web
lsblk节点上查看块设备ssh node-1 && lsblk
df -h节点上查看挂载点df -h /var/lib/kubelet
`mountgrep kubelet`查看 kubelet 相关挂载
findmnt查看挂载树findmnt /var/lib/kubelet/pods/<id>
dmesg内核日志(I/O 错误)`dmesg

2. 按现象排查

2.1 PVC 一直 Pending

1
2
3
kubectl get pvc
#NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
#data-pvc   Pending                                      fast           5m
原因检查方法解决方案
StorageClass 不存在kubectl get sc fast创建 StorageClass
provisioner 未运行kubectl get pods -n kube-system | grep provisioner检查 CSI Controller Pod
WaitForFirstConsumer 延迟绑定kubectl get sc fast -o yaml | grep bindingMode创建 Pod 后才会绑定
IPAM/容量不足kubectl logs csi-provisioner -n kube-system扩展存储后端容量
CSI 插件 CreateVolume 失败kubectl logs csi-plugin -n kube-system查看插件日志定位

2.2 Pod 卡在 ContainerCreating

1
2
3
4
5
6
7
kubectl get pod web
#NAME   READY   STATUS              RESTARTS  AGE
#web    0/1     ContainerCreating   0         3m

kubectl describe pod web
# Events:
#   Warning  FailedMount  ...  Unable to attach or mount volumes: ...
原因检查方法解决方案
Attach 失败kubectl get volumeattachment检查 CSI attacher 日志
Mount 失败kubectl describe pod 中的 Events检查节点上 CSI Node Pod 是否运行
设备路径不存在ssh node && lsblk检查块设备是否已 Attach
文件系统损坏dmesg | tailfsck 修复或重建 Volume
权限不足kubectl logs csi-node -n kube-system确认 DaemonSet 以 privileged 运行

2.3 PV 无法删除

1
2
3
kubectl get pv
#NAME       STATUS        CLAIM              ...   REASON
#pv-abcde   Terminating   default/data-pvc   ...   Volume detachment is pending
原因检查方法解决方案
VolumeAttachment 未删除kubectl get volumeattachment手动删除 VolumeAttachment
finalizer 卡住kubectl get pv pv-abcde -o yaml | grep finalizer手动移除 finalizer(谨慎)
CSI 插件 DeleteVolume 失败kubectl logs csi-provisioner检查底层存储是否已删除
1
2
# 手动移除 finalizer(最后手段)
kubectl patch pv pv-abcde -p '{"metadata":{"finalizers":null}}'

2.4 Volume 只读(Read-only filesystem)

原因检查方法解决方案
底层存储故障dmesg | grep "I/O error"修复存储或迁移数据
文件系统损坏fsck 检查修复文件系统
磁盘空间满df -h扩容或清理数据

3. 性能排查

3.1 IOPS / 延迟测量

1
2
3
4
5
6
7
# 在 Pod 内用 fio 测量
kubectl exec -it pod-with-volume -- fio --name=test --ioengine=libaio --rw=randwrite --bs=4k --size=1G --runtime=60

# 节点上用 iostat 查看设备级 I/O
iostat -x 1 /dev/xvdf
#Device     r/s     w/s   rsec/s   wsec/s  avgrq-sz  avgqu-sz  await
#xvdf     100.00  200.00  800.00  1600.00     8.00      0.50    1.67

3.2 常见性能瓶颈

瓶颈现象排查方向
网络带宽Ceph/NFS 跨节点延迟高iperf3 测节点间带宽
磁盘 I/OLocal PV IOPS 不达标fio 裸盘测试 vs 挂载测试对比
CSI 插件开销Attach/Mount 耗时 >30s检查 CSI 插件日志是否有重试
内核参数大量并发 I/O 时延迟尖峰tuned 调整 I/O scheduler

4. 各 CSI 插件常用排障命令

4.1 Ceph-CSI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看 Ceph 集群状态
ceph -s
ceph osd df

# 查看 RBD 镜像
rbd ls -p kubernetes
rbd info kubernetes/csi-vol-xxx

# 查看 Ceph 日志
kubectl logs csi-rbd-plugin -n kube-system
kubectl logs csi-rbd-provisioner -n kube-system

4.2 Longhorn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看 Longhorn Volume
kubectl get volumes.longhorn.io -n longhorn-system
kubectl describe volume <name> -n longhorn-system

# 查看副本状态
kubectl get replicas.longhorn.io -n longhorn-system

# Longhorn UI
# 端口转发到本地
kubectl port-forward -n longhorn-system svc/longhorn-frontend 8080:80

4.3 NFS-CSI

1
2
3
4
5
6
7
8
# 检查 NFS 服务可达性
showmount -e <nfs-server>

# 手动挂载测试
mount -t nfs <server>:<path> /mnt/test

# 查看 NFS 挂载
mount | grep nfs

参考链接

分享

Hex
作者
Hex
CloudNative Developer