Rook-Ceph 故障排查完全指南:容器化存储的实战之道

Rook-Ceph 故障排查完全指南:容器化存储的实战之道

随着 Kubernetes 的普及,Rook-Ceph 已经成为容器化环境中部署 Ceph 的首选方案。相比传统的物理机部署,Rook-Ceph 具有自动化部署、简化运维、易于扩展等优势。然而,容器化环境也带来了新的挑战,故障排查方法与传统部署存在显著差异。

本文将详细介绍 Rook-Ceph 的故障排查方法,涵盖 Pod 异常、OSD 故障、PG 状态问题、存储 PVC/PV 故障等多个方面,帮助运维人员快速定位和解决容器化 Ceph 集群的问题。

目录

一、Rook-Ceph 架构概述

二、进入 Rook-Ceph 工具 Pod

三、Pod 故障排查

四、OSD 故障处理

五、PG 状态异常处理

六、存储 PVC/PV 故障

七、常见故障场景

八、监控与预防

一、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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注