针对生产 Kubernetes + Rook-Ceph 环境整理真实故障场景
目标:
- 快速定位 Ceph 故障
- 降低数据风险
- 建立标准化恢复流程
- 支撑 7×24 小时生产运维
7.1 故障处理总原则
7.1.1 Ceph故障处理流程
Ceph异常
|
v
ceph -s检查
|
+-----------+-----------+
| |
HEALTH_WARN HEALTH_ERR
| |
v v
查看health detail 查看组件状态
|
|
+-------+-------+-------+-------+
| | | | |
MON MGR OSD PG 网络
|
v
确认影响范围
|
v
执行恢复操作
|
v
验证数据一致性
7.2 案例一:OSD全部Down导致Ceph不可用
7.2.1 故障现象
业务:
- Kubernetes PVC无法挂载
- Pod启动失败
查看:
kubectl get pod -A
异常:
MountVolume.SetUp failed
rbd image mount failed
Ceph:
ceph -s
结果:
HEALTH_ERR
osd: 0 up, 6 in
7.2.2 故障分析
查看OSD:
ceph osd tree
结果:
ID CLASS STATUS
0 hdd down
1 hdd down
2 hdd down
说明:
- OSD进程全部异常
- 数据盘可能正常
- 可能原因:
- 节点重启
- 网络断开
- 磁盘故障
- ceph-volume异常
7.2.3 检查Rook OSD Pod
kubectl -n rook-ceph get pod | grep osd
例如:
rook-ceph-osd-0 CrashLoopBackOff
查看日志:
kubectl -n rook-ceph logs \
rook-ceph-osd-0
7.2.4 恢复流程
第一步:确认节点
kubectl get node
检查:
ssh node01
systemctl status kubelet
第二步:检查磁盘
lsblk
确认:
/dev/sdb
/dev/sdc
第三步:重启OSD Pod
kubectl -n rook-ceph delete pod \
rook-ceph-osd-0
Rook自动拉起:
Running
第四步验证
ceph -s
恢复:
HEALTH_OK
osd: 6 up
pgs: active+clean
7.3 案例二:Ceph PG stuck inactive
故障现象
ceph -s
显示:
HEALTH_ERR
30 pgs stuck inactive
业务:
- PVC卡住
- IO阻塞
7.3.1 查看PG
ceph pg stat
例如:
30 pgs inactive
查看详情:
ceph health detail
输出:
pg 3.21 stuck inactive
7.3.2 定位OSD
ceph pg map 3.21
输出:
acting [1,5,8]
说明:
数据位于:
osd.1
osd.5
osd.8
7.3.3 检查OSD
ceph osd tree
发现:
osd.5 down
恢复:
kubectl delete pod \
rook-ceph-osd-5
7.3.4 强制恢复PG
如果长期卡住:
ceph pg repair 3.21
检查:
ceph -s
7.4 案例三:MON quorum丢失
故障现象
ceph -s
错误:
HEALTH_ERR
no quorum
7.4.1 查看MON
ceph mon stat
例如:
3 mons
quorum a,b
缺少:
mon.c
7.4.2 Kubernetes检查
kubectl -n rook-ceph get pod | grep mon
异常:
rook-ceph-mon-c Pending
7.4.3 查看事件
kubectl describe pod \
rook-ceph-mon-c
常见:
FailedMount
或者:
node unavailable
7.4.4 恢复
删除异常Pod:
kubectl delete pod \
rook-ceph-mon-c
Rook重建
验证:
ceph mon stat
正常:
quorum a,b,c
7.5 案例四:磁盘空间100%导致Ceph异常
故障现象
ceph -s
显示:
HEALTH_ERR
nearfull osd
或者:
full osd
7.5.1 查看容量
ceph df
例如:
85% USED
7.5.2 查看大对象
rados df
7.5.3 Kubernetes定位
查看PVC:
kubectl get pvc -A
寻找:
- 大日志
- 临时数据
- 构建缓存
7.5.4 临时扩容阈值
查看:
ceph osd dump | grep ratio
调整:
ceph osd pool set-quota
或者:
增加OSD:
kubectl label node node04 \
storage=true
7.6 案例五:Kubernetes节点宕机
故障现象
节点:
Node NotReady
Ceph:
ceph -s
显示:
osd down
7.6.1 查看节点
kubectl get node
7.6.2 查看OSD归属
ceph osd tree
例如:
host gpu-node01
osd.1
osd.2
7.6.3 恢复策略
节点短时间恢复
不要操作:
等待:
ceph osd status
节点永久故障
执行:
ceph osd out osd.1
等待:
ceph -s
完成数据迁移
7.7 案例六:Rook Operator异常
故障现象
所有Ceph Pod异常:
Pending
检查:
kubectl -n rook-ceph get pod
发现:
rook-ceph-operator CrashLoopBackOff
查看日志:
kubectl logs \
-n rook-ceph \
deploy/rook-ceph-operator
恢复
重启Operator:
kubectl rollout restart deployment \
rook-ceph-operator \
-n rook-ceph
验证:
kubectl get pod -n rook-ceph
7.8 案例七:PVC无法创建
现象
kubectl describe pvc test
错误:
failed to provision volume
排查顺序
1. CSI
kubectl get pod \
-n rook-ceph | grep csi
2. StorageClass
kubectl get sc
检查:
provisioner:
rook-ceph.rbd.csi.ceph.com
3. Ceph Pool
ceph osd pool ls
4. CSI日志
kubectl logs \
-n rook-ceph \
deploy/csi-rbdplugin-provisioner
7.9 案例八:误删除OSD恢复
场景
管理员:
ceph osd purge
误删除
处理
检查磁盘
ceph-volume inventory
查看:
ceph-volume lvm list
如果还能找到:
恢复:
ceph-volume lvm activate
如果磁盘数据存在:
不要:
wipefs
7.10 案例九:Ceph升级失败
场景
升级:
Ceph Reef
|
X
查看:
ceph versions
检查:
kubectl -n rook-ceph get pod
恢复:
暂停升级:
kubectl edit cephcluster
设置:
skipUpgradeChecks: true
回滚:
恢复旧镜像:
image:
quay.io/ceph/ceph:v18
7.11 案例十:整套Ceph灾难恢复
场景
所有K8s节点丢失
磁盘仍存在
恢复顺序
第一阶段
恢复:
Kubernetes
|
Rook Operator
|
CephCluster
第二阶段
恢复MON
检查:
/var/lib/rook
第三阶段
恢复OSD
ceph-volume lvm activate --all
第四阶段
验证:
ceph -s
目标:
HEALTH_OK
PG active+clean
7.12 生产事故应急命令清单
集群状态
ceph -s
ceph health detail
OSD
ceph osd tree
ceph osd stat
PG
ceph pg stat
ceph pg dump
MON
ceph mon stat
Rook
kubectl -n rook-ceph get pod
CSI
kubectl logs -n rook-ceph \
-l app=csi-rbdplugin
7.13 生产故障等级定义
| 等级 | 影响 | 响应 |
|---|---|---|
| P0 | 数据不可访问 | 立即处理 |
| P1 | 部分PVC异常 | 30分钟 |
| P2 | 性能下降 | 4小时 |
| P3 | 健康告警 | 计划处理 |