Rook-Ceph 故障排查完全指南:容器化存储的实战之道
Rook-Ceph 故障排查完全指南:容器化存储的实战之道
随着 Kubernetes 的普及,Rook-Ceph 已经成为容器化环境中部署 Ceph 的首选方案。相比传统的物理机部署,Rook-Ceph 具有自动化部署、简化运维、易于扩展等优势。然而,容器化环境也带来了新的挑战,故障排查方法与传统部署存在显著差异。
本文将详细介绍 Rook-Ceph 的故障排查方法,涵盖 Pod 异常、OSD 故障、PG 状态问题、存储 PVC/PV 故障等多个方面,帮助运维人员快速定位和解决容器化 Ceph 集群的问题。
目录
三、Pod 故障排查
四、OSD 故障处理
七、常见故障场景
八、监控与预防
一、Rook-Ceph 架构概述
1.1 Rook-Ceph 组件
Rook 是一个 Kubernetes 的存储编排器,它将 Ceph 存储系统以 Operator 的方式部署在 Kubernetes 集群中。了解 Rook-Ceph 的组件有助于故障排查。
Operator Pod:Rook Operator 是核心组件,负责管理 Ceph 集群的生命周期,包括部署、配置、升级等。
Mon Pod:Ceph Monitor 守护进程,通常部署 3 个副本,负责维护集群映射和法定人数。
MGR Pod:Ceph Manager 守护进程,提供监控和管理接口,如 Dashboard、Prometheus 指标导出等。
OSD Pod:Ceph OSD 守护进程,每个 Pod 管理一块存储设备(磁盘或分区)。
RGW Pod:Ceph RADOS Gateway,提供 S3/Swift 兼容的对象存储接口。
MDS Pod:Ceph Metadata Server,提供 CephFS 文件系统服务。
Tool Pod:Rook 提供的工具容器,用于执行 ceph 命令行工具,是故障排查的重要入口。
1.2 容器化环境的特点
容器化部署的 Ceph 具有以下特点:
动态性:Pod 可以自动重启、重新调度,这要求故障排查时需要追踪 Pod 的历史状态。
资源隔离:每个 Pod 有独立的资源限制,需要关注 CPU、内存、磁盘 I/O 等资源使用情况。
网络隔离:Pod 之间通过 Kubernetes 网络通信,需要检查 NetworkPolicy、Service 等配置。
存储抽象:Ceph OSD 通过 HostPath 或 Local PV 使用宿主机存储,需要了解存储卷的挂载情况。
1.3 命名空间
默认情况下,Rook-Ceph 部署在 rook-ceph 命名空间中。所有相关的 Pod、Service、ConfigMap 等资源都位于该命名空间。
# 设置默认命名空间
kubectl config set-context --current --namespace=rook-ceph
# 查看所有 Pod
kubectl get pods -n rook-ceph
二、进入 Rook-Ceph 工具 Pod
2.1 查找工具 Pod
Rook-Ceph 工具 Pod 是执行 ceph 命令的入口,Pod 名称通常以 rook-ceph-tools 开头。
# 查找工具 Pod
kubectl get pods -n rook-ceph -l app=rook-ceph-tools
2.2 进入工具容器
# 进入工具容器
kubectl exec -it -n rook-ceph $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o jsonpath='{.items[0].metadata.name}') bash
# 进入后可以使用所有 ceph 命令
ceph -s
ceph osd tree
ceph health detail
2.3 一键进入命令
可以创建一个别名简化操作:
# 添加别名到 ~/.bashrc 或 ~/.zshrc
alias ceph-tool='kubectl exec -it -n rook-ceph $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o jsonpath="{.items[0].metadata.name}") -- bash'
# 使用别名
ceph-tool
三、Pod 故障排查
3.1 查看 Pod 状态
# 查看所有 Pod 状态
kubectl get pods -n rook-ceph -o wide
# 查看 Pod 详细信息
kubectl describe pod <pod-name> -n rook-ceph
# 查看 Pod 事件
kubectl get events -n rook-ceph --field-selector involvedObject.name=<pod-name>
3.2 常见 Pod 异常状态
CrashLoopBackOff
容器反复重启失败,通常表示容器启动后立即退出。
原因:配置错误、资源不足、依赖服务不可用、应用程序错误
排查步骤:
# 查看 Pod 日志
kubectl logs <pod-name> -n rook-ceph
# 查看之前的日志(如果 Pod 已重启)
kubectl logs <pod-name> -n rook-ceph --previous
# 查看 Pod 详细信息
kubectl describe pod <pod-name> -n rook-ceph
ImagePullBackOff
无法拉取容器镜像。
原因:镜像名称错误、私有仓库认证失败、网络问题
排查步骤:
# 检查镜像拉取凭证
kubectl get secrets -n rook-ceph
# 检查镜像仓库访问
docker pull <image-name>
Pending
Pod 无法调度到任何节点。
原因:资源不足、节点污点、亲和性规则、PVC 未绑定
排查步骤:
# 检查节点资源
kubectl describe nodes
# 检查 PVC 绑定状态
kubectl get pvc -n rook-ceph
# 查看 Pod 调度情况
kubectl describe pod <pod-name> -n rook-ceph | grep -A 10 Events
3.3 查看 Pod 日志
# 查看单个容器日志
kubectl logs <pod-name> -n rook-ceph
# 查看 Pod 中所有容器的日志
kubectl logs <pod-name> -n rook-ceph --all-containers=true
# 实时查看日志
kubectl logs -f <pod-name> -n rook-ceph
# 查看最近 100 行日志
kubectl logs --tail=100 <pod-name> -n rook-ceph
四、OSD 故障处理
4.1 查看 OSD Pod 状态
# 查看 OSD Pod 状态
kubectl get pods -n rook-ceph -l app=rook-ceph-osd
# 进入工具容器查看 OSD 状态
ceph osd tree
ceph -s
4.2 OSD 磁盘故障更换
步骤 1:定位故障 OSD
# 查看 OSD Pod 状态
kubectl get pods -n rook-ceph -l app=rook-ceph-osd
# 查看 OSD 状态
ceph osd tree
ceph -s
步骤 2:标记故障 OSD 为 out
# 进入工具容器
ceph-tool
# 标记 OSD 为 out
ceph osd out <osd-id>
# 等待数据迁移完成
ceph -w
步骤 3:删除故障 OSD Pod
# 删除 OSD Pod
kubectl delete pod <osd-pod-name> -n rook-ceph
# 查看删除后的状态
ceph osd tree
步骤 4:清理 OSD 数据
# 在宿主机上清理磁盘(需要 SSH 到对应节点)
ssh <node-name>
# 查找磁盘设备
lsblk
# 清理磁盘分区和数据
ceph-volume lvm zap /dev/<device> --destroy
# 或者使用 wipefs
wipefs -a /dev/<device>
步骤 5:添加新 OSD
# 使用 rook-ceph-operator 自动发现并创建新 OSD
# 需要更新 CephCluster 资源,添加新设备配置
kubectl edit cephcluster -n rook-ceph rook-ceph
# 或者使用 DeviceSet 模式
kubectl edit cephcluster -n rook-ceph rook-ceph
# 在 storage.devices 中添加新设备路径
步骤 6:验证集群状态
# 等待新 OSD 上线
ceph -s
# 查看 OSD 树
ceph osd tree
# 检查数据恢复进度
ceph -w
4.3 OSD Pod 反复重启
原因:磁盘错误、内存不足、配置错误、数据损坏
排查步骤:
# 查看 OSD Pod 日志
kubectl logs <osd-pod-name> -n rook-ceph
# 查看 Pod 详细信息
kubectl describe pod <osd-pod-name> -n rook-ceph
# 在宿主机上检查磁盘健康
ssh <node-name>
smartctl -a /dev/<device>
dmesg | grep -i error
五、PG 状态异常处理
5.1 查看 PG 状态
# 进入工具容器
ceph-tool
# 查看 PG 状态
ceph pg stat
# 查看异常 PG
ceph pg dump | grep -E "(degraded|inconsistent|stuck)"
5.2 PG 不一致(inconsistent)
现象:
HEALTH_ERR
Possible data damage: 1 pg inconsistent
pg 2.1 is active+clean+inconsistent
处理步骤:
# 执行 scrub 检查
ceph pg scrub <pgid>
# 执行 deep scrub 深度检查
ceph pg deep-scrub <pgid>
# 执行 repair 修复
ceph pg repair <pgid>
# 验证修复结果
ceph -s
ceph health detail
5.3 PG 降级(degraded)
现象:部分副本丢失,但数据仍可访问
处理步骤:
# 查看降级 PG
ceph pg ls | grep degraded
# 查看故障 OSD
ceph osd tree
# 恢复故障 OSD 或等待自动恢复
ceph -w
# 查看恢复进度
ceph pg dump_stuck incomplete
六、存储 PVC/PV 故障
6.1 查看 PVC/PV 状态
# 查看 PVC 状态
kubectl get pvc -A
# 查看 PV 状态
kubectl get pv
# 查看 PVC 详细信息
kubectl describe pvc <pvc-name> -n <namespace>
6.2 PVC 无法绑定
现象:PVC 状态为 Pending
原因:StorageClass 配置错误、资源不足、节点污点
排查步骤:
# 查看 PVC 事件
kubectl describe pvc <pvc-name> -n <namespace>
# 查看 StorageClass
kubectl get sc
# 查看 Ceph RBD Pool 状态
ceph osd lspools
# 检查 RBD 镜像
rbd ls -p <pool-name>
6.3 Pod 无法挂载 PVC
现象:Pod 状态为 ContainerCreating,挂载 PVC 失败
原因:PVC 未绑定、CSI 插件错误、权限问题
排查步骤:
# 查看 Pod 详细信息
kubectl describe pod <pod-name> -n <namespace>
# 查看 CSI 插件 Pod
kubectl get pods -n rook-ceph -l app=rook-ceph-csi-rbd-plugin
# 查看 CSI 插件日志
kubectl logs -n rook-ceph <csi-pod-name>
# 查看 Ceph RBD 状态
rbd info -p <pool-name> <image-name>
七、常见故障场景
7.1 工具 Pod 无法启动
现象:rook-ceph-tools Pod 处于 CrashLoopBackOff 状态
原因:镜像拉取失败、资源不足、Ceph 集群不可用
处理步骤:
# 查看工具 Pod 日志
kubectl logs -n rook-ceph rook-ceph-tools-xxxxx
# 重新部署工具 Pod
kubectl delete deployment -n rook-ceph rook-ceph-tools
# 检查 Rook Operator 状态
kubectl get pods -n rook-ceph -l app=rook-ceph-operator
7.2 Operator Pod 异常
现象:rook-ceph-operator Pod 无法启动或反复重启
影响:无法管理 Ceph 集群,无法自动恢复故障
处理步骤:
# 查看 Operator Pod 日志
kubectl logs -n rook-ceph deployment/rook-ceph-operator
# 查看 Operator 配置
kubectl get cephcluster -n rook-ceph -o yaml
# 手动重启 Operator
kubectl delete pod -n rook-ceph -l app=rook-ceph-operator
7.3 Monitor Pod 异常
现象:rook-ceph-mon Pod 无法启动或无法形成法定人数
影响:整个 Ceph 集群无法提供服务
处理步骤:
# 查看 Monitor Pod 状态
kubectl get pods -n rook-ceph -l app=rook-ceph-mon
# 查看 Monitor 日志
kubectl logs -n rook-ceph <mon-pod-name>
# 进入工具容器查看 Monitor 状态
ceph-tool
ceph mon stat
ceph quorum_status
# 如果 Monitor 损坏,可以尝试移除并重建
kubectl delete cm -n rook-ceph rook-ceph-mon-endpoints
7.4 数据迁移过慢
现象:OSD 故障后,数据迁移速度很慢,影响业务性能
原因:网络带宽限制、磁盘 I/O 瓶颈、并发恢复线程限制
优化步骤:
# 进入工具容器
ceph-tool
# 查看恢复进度
ceph -w
# 增加并发恢复线程
ceph config set osd osd_recovery_max_active 10
ceph config set osd osd_max_backfills 2
# 增加恢复带宽
ceph config set osd osd_recovery_op_priority 5
# 设置恢复时间窗口(业务低峰期)
ceph tell osd.* injectargs '--osd_recovery_sleep 0.1'
八、监控与预防
8.1 健康检查
定期检查集群健康状态:
# 进入工具容器
ceph-tool
# 查看集群健康状态
ceph health
# 查看集群详细状态
ceph -s
# 查看集群实时状态
ceph -w
8.2 监控 Pod 状态
# 监控所有 Pod 状态
watch kubectl get pods -n rook-ceph
# 监控 OSD Pod
watch kubectl get pods -n rook-ceph -l app=rook-ceph-osd
8.3 Prometheus 监控
Rook-Ceph 内置了 Prometheus 指标导出功能:
# 查看 Prometheus Service
kubectl get svc -n rook-ceph -l app=rook-ceph-mgr
# 访问 Metrics 端点
curl http://<mgr-pod-ip>:9283/metrics
关键监控指标:
ceph_health_status:集群健康状态
ceph_osd_up:OSD 在线数量
ceph_osd_in:OSD 在集群中的数量
ceph_pg_active_clean:active clean PG 的数量
ceph_pg_degraded:degraded PG 的数量
ceph_pool_stored:存储池已用容量
8.4 日志收集
# 收集所有 Pod 日志
kubectl logs -n rook-ceph -l app=rook-ceph-osd --all-containers=true --tail=1000
# 收集 Operator 日志
kubectl logs -n rook-ceph deployment/rook-ceph-operator --tail=1000
总结
Rook-Ceph 作为容器化存储的最佳实践,其故障排查需要结合 Kubernetes 和 Ceph 两方面的知识。本文详细介绍了 Rook-Ceph 的架构、工具使用、故障排查方法和常见故障场景,涵盖了 Pod 异常、OSD 故障、PG 状态问题、存储 PVC/PV 故障等多个方面。
掌握 Rook-Ceph 故障排查技能的关键在于:
熟悉 Kubernetes Pod 生命周期和资源管理
掌握 Ceph 集群状态和 PG 状态的分析方法
熟练使用 kubectl 和 ceph 命令行工具
理解容器化环境的网络和存储隔离机制
建立完善的监控和告警体系
通过不断学习和实践,运维人员可以构建稳定可靠的容器化存储平台,为 Kubernetes 集群提供高性能、高可用的存储服务。
参考资源
Rook 官方文档:https://rook.io/docs/rook/latest/
Ceph 官方文档:https://docs.ceph.com/
Rook GitHub 仓库:https://github.com/rook/rook






