告别存储困境:kubeasz+Rook打造Kubernetes原生Ceph存储集群实战指南
为什么需要Kubernetes原生存储解决方案?
你是否还在为Kubernetes集群存储方案选型而烦恼?传统NFS存储性能不足,云厂商存储服务绑定特定平台,而分布式存储又面临部署复杂、运维成本高的问题。本文将带你通过kubeasz工具与Rook结合,从零构建基于Ceph的Kubernetes原生存储集群,彻底解决容器化应用的数据持久化难题。
读完本文你将掌握:
- 使用kubeasz快速部署支持Ceph的Kubernetes环境
- 通过Rook操作Ceph存储集群的全流程管理
- 动态PV创建与应用挂载的最佳实践
- 存储集群监控与故障排查实用技巧
存储方案对比:为什么选择Rook+Ceph?
| 存储方案 | 性能 | 高可用 | 运维复杂度 | Kubernetes集成度 |
|---|---|---|---|---|
| NFS | 低 | 需额外配置 | 低 | 一般 |
| 云厂商存储 | 中高 | 高 | 低 | 高(厂商锁定) |
| Rook+Ceph | 高 | 原生支持 | 中 | 完全原生 |
Rook作为Kubernetes的存储编排器,能够将Ceph存储系统无缝集成到K8s环境中,提供以下核心优势:
- 完全基于Kubernetes API的操作体验
- 自动化存储集群部署与扩缩容
- 支持块存储、文件存储和对象存储
- 自愈能力与数据冗余保护
环境准备与前置条件
在开始部署前,请确保你的环境满足以下要求:
- 至少3台节点的Kubernetes集群(通过kubeasz部署最佳)
- 每节点至少1块空闲磁盘(用于Ceph OSD)
- 节点间网络互通(建议10Gbps以上带宽)
- kubeasz版本3.6.0+(版本说明)
使用kubeasz部署支持Rook的K8s集群
- 首先通过ezdown工具下载所需资源:
./ezdown -D
- 配置集群参数,编辑配置文件:
vi clusters/mycluster/config.yml
- 确保开启必要的存储相关组件:
# 在config.yml中添加以下配置
nfs_provisioner_install: "no" # 禁用NFS provisioner
local_path_provisioner_install: "yes" # 启用本地存储供Rook使用
- 执行集群部署:
./ezctl setup mycluster 01 02 03 04 05 06 07
验证集群状态:
kubectl get nodes
kubectl get pods -n kube-system
Rook Ceph集群部署实战
部署Rook Operator
- 创建Rook命名空间:
kubectl create namespace rook-ceph
- 下载Rook部署清单(以v1.11.8为例):
wget https://github.com/rook/rook/raw/v1.11.8/deploy/examples/operator.yaml
- 修改operator配置以适配kubeasz环境:
# 添加以下配置到operator.yaml的rook-ceph-operator Deployment中
env:
- name: FLEXVOLUME_DIR_PATH
value: "/opt/kubernetes/kubelet/plugins/kubernetes.io/flexvolume"
- 应用部署清单:
kubectl apply -f operator.yaml -n rook-ceph
验证operator部署状态:
kubectl get pods -n rook-ceph
创建Ceph集群
- 创建集群配置文件cluster.yaml(关键配置片段):
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: ceph/ceph:v17.2.6
dataDirHostPath: /var/lib/rook
mon:
count: 3 # 生产环境建议3或5
storage:
useAllNodes: true
useAllDevices: true
deviceFilter: "^sd[b-z]" # 过滤要使用的磁盘
- 应用集群配置:
kubectl apply -f cluster.yaml -n rook-ceph
- 监控集群部署进度:
kubectl -n rook-ceph rollout status deploy/rook-ceph-operator
部署完成后,查看Ceph集群状态:
kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph status
存储池与存储类配置
创建Ceph块存储
- 创建Ceph存储池:
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 3 # 3副本存储
- 创建StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
将此StorageClass设置为默认:
kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
应用实战:使用Ceph存储
动态PV创建与使用示例
创建PVC请求:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# storageClassName: rook-ceph-block (如已设为默认则可省略)
在应用中使用PVC:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: test-volume
mountPath: /mnt/test
volumes:
- name: test-volume
persistentVolumeClaim:
claimName: test-pvc
验证存储挂载:
kubectl exec -it test-pod -- df -h /mnt/test
监控与运维管理
集成Prometheus监控
通过kubeasz部署的集群已默认集成Prometheus,只需添加以下ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rook-ceph-monitor
namespace: monitoring
spec:
selector:
matchLabels:
app: rook-ceph-mgr
namespaceSelector:
matchNames:
- rook-ceph
endpoints:
- port: http-metrics
常用运维命令
查看Ceph集群状态:
kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph -s
查看OSD状态:
kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph osd tree
扩容存储池:
kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph osd pool set replicapool size 3
故障处理与最佳实践
磁盘故障处理流程
- 标记故障磁盘为out:
kubectl exec -n rook-ceph deploy/rook-ceph-tools -- ceph osd out osd.0
- 移除故障OSD:
# 编辑CephCluster资源,添加要移除的设备
spec:
storage:
nodes:
- name: node1
devices:
- name: sdb
config:
device_removal_safety: "out"
- 更换物理磁盘后,重新添加设备:
spec:
storage:
nodes:
- name: node1
devices:
- name: sdc # 新磁盘
性能优化建议
- 使用专用网络分离Ceph集群流量(public与cluster网络)
- 为OSD启用缓存分层(使用SSD作为缓存层)
- 根据工作负载调整PG数量(推荐每OSD 100-200个PG)
- 定期执行Ceph集群健康检查与数据清理
总结与进阶学习
通过本文介绍的方法,你已成功使用kubeasz和Rook在Kubernetes集群中部署了Ceph存储系统。这一解决方案不仅提供了企业级的存储能力,还保持了与Kubernetes生态的原生集成,为容器化应用提供了可靠的数据持久化保障。
进阶学习资源:
- Rook官方文档
- kubeasz存储配置指南:docs/setup/08-cluster-storage.md
- Ceph性能调优:manifests/deprecated/es-cluster/elasticsearch/README.md
存储是Kubernetes生态中至关重要的一环,选择合适的存储方案直接影响整个集群的稳定性与性能。希望本文能帮助你构建更可靠、高效的容器存储基础设施!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



