Rook Ceph 裸金属持久存储 Hands-on
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| CSI | Container Storage Interface | 容器存储接口 |
| GitOps | GitOps | 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式 |
| MON | Monitor | Ceph 监视器组件 |
| OSD | Object Storage Daemon | Ceph 对象存储守护进程 |
| PG | Placement Group | Ceph 归置组 |
| PVC | Persistent Volume Claim | 持久卷申领 |
| RBD | RADOS Block Device | Ceph 块设备;RADOS 为 Reliable Autonomic Distributed Object Store(可靠自主分布式对象存储) |
| RWO | ReadWriteOnce | 卷访问模式:由一个节点以读写方式挂载 |
| RWX | ReadWriteMany | 卷访问模式:由多个节点以读写方式挂载 |
范围:三台以上独立存储节点、未使用的专用裸盘、有备份的隔离预生产集群。本文部署三副本 RBD,验证实际业务文件持久性;不是把本地目录包装成高可用存储。Ceph 节点/磁盘损坏后的重建需要额外容量和带宽。
1. 盘点与锁定磁盘#
每个存储节点由管理员执行:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,SERIAL
sudo blkid核对盘序列号与资产单;系统盘、有文件系统/分区/挂载的数据盘禁止加入。按 Rook 版本前置要求安装 lvm2、内核模块/工具;生产选择固定 Rook/Ceph 兼容版本,规划副本、故障域、时钟、网络、内存和至少足够重建一故障域的余量。本篇不执行 wipefs/sgdisk,盘不空应停下处理资产。
2. 安装 Operator#
export ROOK_VERSION='v1.20.7'
git clone --depth 1 --branch "$ROOK_VERSION" https://github.com/rook/rook.git rook-source
cd rook-source/deploy/examples
# 审阅该 tag 的镜像、CRD、RBAC、CSI 权限与 node placement。
kubectl create -f crds.yaml -f common.yaml -f csi-operator.yaml
kubectl wait --for=condition=Established crd/operatorconfigs.csi.ceph.io --timeout=2m
kubectl create -f operator.yaml
kubectl -n rook-ceph rollout status deployment/rook-ceph-operator --timeout=5m
kubectl -n rook-ceph rollout status deployment/ceph-csi-controller-manager --timeout=5m这里明确使用 Rook v1.20.7 的安装结构,包含独立 Ceph-CSI Operator;更换版本时按该 tag 的说明调整文件与兼容矩阵,不能只改版本号。生产将已审核清单纳入 GitOps;若已有 Rook,不执行上述 create 叠加安装。补齐资源/调度与特权 namespace 例外,并确认两个 Operator 都就绪,之后检查 RBD CSIDriver 和节点插件;只有 Rook Operator 成功不能证明 PVC 可用。
3. 创建显式磁盘集群#
保存 ceph-cluster.yaml;以下 disk 名逐台换为已确认空盘,Ceph image 固定为所选 Rook 支持的 digest:
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata: {name: rook-ceph, namespace: rook-ceph}
spec:
cephVersion:
image: REPLACE_SUPPORTED_CEPH_IMAGE_AT_DIGEST
dataDirHostPath: /var/lib/rook
mon: {count: 3, allowMultiplePerNode: false}
mgr: {count: 2, allowMultiplePerNode: false}
dashboard: {enabled: false}
storage:
useAllNodes: false
useAllDevices: false
nodes:
- name: storage-1
devices: [{name: REPLACE_EMPTY_DISK_1}]
- name: storage-2
devices: [{name: REPLACE_EMPTY_DISK_2}]
- name: storage-3
devices: [{name: REPLACE_EMPTY_DISK_3}]
resources:
mon:
requests: {cpu: '1', memory: 2Gi}
limits: {memory: 2Gi}
mgr:
requests: {cpu: 500m, memory: 1Gi}
limits: {memory: 2Gi}
osd:
requests: {cpu: '1', memory: 4Gi}
limits: {memory: 4Gi}
disruptionManagement:
managePodBudgets: true
osdMaintenanceTimeout: 30kubectl apply --dry-run=server -f ceph-cluster.yaml
kubectl apply -f ceph-cluster.yaml
kubectl -n rook-ceph get cephcluster,pods -wapply 会让 Ceph 接管指定盘,必须先完成第一步。验收 Ceph HEALTH_OK、三个 MON quorum、OSD up/in,不能仅看 Kubernetes Pod Running。使用该 tag 的 toolbox 清单,先确认镜像与集群 Ceph 版本一致,再运行 ceph status、ceph osd tree、ceph df。
4. 创建业务存储类#
保存 rbd-storage.yaml:
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata: {name: orders-rbd, namespace: rook-ceph}
spec:
failureDomain: host
replicated: {size: 3, requireSafeReplicaSize: true}
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata: {name: orders-rbd}
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: orders-rbd
imageFormat: '2'
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumerkubectl apply -f rbd-storage.yaml
kubectl get storageclass orders-rbd按 CSI 实验创建 PVC 并挂载到真实业务,或将 RabbitMQ storageClassName 设置为 orders-rbd;云盘专用参数不要复制进此类。RBD 通常用于 RWO;需要 RWX 时另建 CephFS,不把 RWO 当多节点共享盘。
5. 故障与数据验收#
记录业务文件校验和/消息确认水位→停一台存储节点→确认业务可读写、Ceph 降级有告警→恢复该节点→等 PG clean/副本恢复→再做下一项。三节点三副本失去一节点后可能没有第四个故障域用于完整重建,生产容量规划必须明确这个边界。
空间接近满、MON 无 quorum、重建未完成时停止节点维护。备份放在独立故障域,快照不是异地备份;按 Velero验证恢复。失败不降低 pool size 到 1、不清空 dataDirHostPath、不卸载 Operator 来“重试”。退役单独走官方卸载/数据销毁流程。