快速部署指南:K8s中Rook-Ceph分布式块存储实践
2025.09.18 18:51浏览量:0简介:本文详细介绍如何在Kubernetes集群中快速部署基于Rook-Ceph的分布式块存储系统,涵盖环境准备、Rook-Ceph安装、存储类配置及验证测试全流程,助力开发者构建高可用、弹性扩展的存储解决方案。
一、为什么选择Rook-Ceph作为K8s分布式存储?
1.1 Ceph的核心优势
Ceph作为开源分布式存储系统,具备三大核心能力:
- 统一存储层:支持块存储(RBD)、文件存储(CephFS)和对象存储(RADOSGW)三种接口。
- 弹性扩展:通过CRUSH算法实现数据自动分布,支持EB级存储容量。
- 高可用性:采用多副本和纠删码机制,确保数据零丢失。
1.2 Rook的集成价值
Rook作为Kubernetes的存储编排工具,解决了原生Ceph部署的复杂性:
- 自动化运维:通过Operator模式管理Ceph集群生命周期。
- K8s原生集成:将Ceph资源抽象为CRD(Custom Resource Definitions),如
Cluster
、Pool
、StorageClass
。 - 简化配置:提供默认配置模板,支持通过Values文件自定义参数。
1.3 典型应用场景
二、部署前环境准备
2.1 硬件要求
组件 | 最低配置 | 推荐配置 |
---|---|---|
Kubernetes节点 | 3节点(1Master+2Worker) | 5节点(3Master+2Worker) |
CPU | 4核/节点 | 8核/节点 |
内存 | 8GB/节点 | 16GB/节点 |
磁盘 | 1块100GB系统盘+1块200GB数据盘 | 2块500GB SSD(RAID1系统盘+JBOD数据盘) |
2.2 软件依赖
# 验证K8s版本(需≥1.19)
kubectl version --short | grep "Server Version"
# 安装Helm(v3.x)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
# 安装Ceph客户端工具(可选)
sudo apt-get install ceph-common -y # Ubuntu示例
2.3 存储节点预处理
- 磁盘标记:确保数据盘未被分区或格式化
lsblk -o NAME,ROTA,FSTYPE,MOUNTPOINT | grep -v "ROTA=1"
- 关闭交换分区:避免内存交换影响性能
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
三、Rook-Ceph部署实战
3.1 创建Rook命名空间
kubectl create namespace rook-ceph
3.2 部署Rook Operator
# 添加Rook Helm仓库
helm repo add rook-release https://charts.rook.io/release
helm repo update
# 安装Operator(使用默认配置)
helm install rook-ceph rook-release/rook-ceph \
--namespace rook-ceph \
--set operatorNamespace=rook-ceph \
--set image.tag=v1.12.0 \ # 指定稳定版本
--set configDir=/var/lib/rook
3.3 创建Ceph集群
准备Cluster CRD:
# ceph-cluster.yaml
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
name: rook-ceph
namespace: rook-ceph
spec:
cephVersion:
image: quay.io/ceph/ceph:v18.2.6
mon:
count: 3
allowMultiplePerNode: false
storage:
useAllNodes: false
useAllDevices: false
nodes:
- name: "node1"
devices:
- name: "sdb" # 替换为实际设备名
- name: "node2"
devices:
- name: "sdb"
config:
osdPoolDefaultSize: 3
osdPoolDefaultMinSize: 2
应用配置:
kubectl apply -f ceph-cluster.yaml
验证集群状态:
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
ceph status
# 预期输出:
# cluster:
# id: xxxxx
# health: HEALTH_OK
# mon: 3 daemons, quorum a,b,c
# osd: 3 osds, 3 up, 3 in
四、配置分布式块存储
4.1 创建存储池和存储类
# storageclass.yaml
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
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: Delete
allowVolumeExpansion: true
4.2 创建PVC并验证
# pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-block-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: rook-ceph-block
resources:
requests:
storage: 10Gi
# 应用并验证
kubectl apply -f pvc-test.yaml
kubectl get pvc
# 预期输出:
# NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
# ceph-block-pvc Bound pvc-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 10Gi RWO rook-ceph-block 5s
五、高级配置与优化
5.1 性能调优参数
# 在CephCluster CRD的spec.storage.config中添加:
config:
osd:
scheduleTimeout: 0
osdMemoryTargets: 4294967296 # 4GB per OSD
mon:
pgNumMin: 128
pgpNumMin: 128
5.2 多命名空间支持
# 为不同业务创建独立StorageClass
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block-prod
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: prod-pool
# ...其他参数同上
EOF
5.3 监控集成方案
部署Prometheus Operator:
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
配置ServiceMonitor:
# ceph-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rook-ceph-monitor
namespace: rook-ceph
labels:
release: prometheus
spec:
selector:
matchLabels:
app: rook-ceph-mgr
endpoints:
- port: metrics
interval: 30s
六、故障排查指南
6.1 常见问题处理
现象 | 可能原因 | 解决方案 |
---|---|---|
PVC卡在Pending状态 | StorageClass配置错误 | 检查provisioner 字段是否正确 |
OSD启动失败 | 磁盘权限问题 | 执行chown -R ceph:ceph /dev/sdb |
Ceph健康状态为HEALTH_ERR | MON节点不健康 | 检查ceph mon stat 输出 |
性能低下 | 磁盘I/O瓶颈 | 替换为SSD或调整osd_memory_target |
6.2 日志收集命令
# 获取Operator日志
kubectl logs -n rook-ceph deploy/rook-ceph-operator --tail=100
# 获取特定OSD日志
POD_NAME=$(kubectl -n rook-ceph get pods -l app=rook-ceph-osd -o jsonpath='{.items[0].metadata.name}')
kubectl -n rook-ceph logs $POD_NAME -c osd
# 收集Ceph集群状态
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -s
七、最佳实践建议
节点规划原则:
- 避免在Master节点部署OSD
- 每个Worker节点建议部署1-2个OSD
- 保持MON节点分散在不同可用区
数据安全策略:
# 在CephCluster CRD中启用加密
spec:
security:
encryption:
enabled: true
kms:
# 配置Vault或Barbican集成
升级维护流程:
# 1. 更新Operator
helm upgrade rook-ceph rook-release/rook-ceph -n rook-ceph --values values.yaml
# 2. 更新Ceph镜像
kubectl patch cephcluster rook-ceph -n rook-ceph \
--type='merge' -p '{"spec":{"cephVersion":{"image":"quay.io/ceph/ceph:v19.2.0"}}}'
# 3. 验证升级状态
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph -v
通过本文的详细指导,开发者可以在Kubernetes环境中快速构建高可用的Rook-Ceph分布式块存储系统。该方案不仅简化了Ceph的部署复杂度,还通过K8s原生接口实现了存储资源的自动化管理,特别适合需要弹性扩展和持久化存储的云原生应用场景。建议在实际生产环境中部署前,先在测试集群验证所有配置,并根据业务负载特点调整存储池参数。
发表评论
登录后可评论,请前往 登录 或 注册