1. Ceph RBD与Kubernetes集成概述
在云原生环境中,持久化存储一直是容器编排系统面临的核心挑战之一。Ceph RBD(RADOS Block Device)作为Ceph存储集群提供的块存储服务,通过与Kubernetes CSI(Container Storage Interface)驱动集成,能够为容器化应用提供高性能、高可靠的块存储解决方案。这种集成方式特别适合需要独占式存储访问的应用场景,如数据库、消息队列等有状态服务。
我在多个生产环境中的实践表明,Ceph RBD与Kubernetes的集成方案具有以下显著优势:
- 数据持久性:即使Pod被重新调度,存储卷中的数据也能完好保留
- 性能隔离:每个RBD镜像都是独立的存储实体,避免I/O干扰
- 动态扩容:支持存储卷的在线扩容,满足业务增长需求
- 快照与克隆:基于RBD特性可实现高效的数据备份和快速部署
2. Ceph集群端准备工作
2.1 存储池创建与配置
在Ceph集群中,我们需要为Kubernetes创建专用的存储池。存储池的PG(Placement Group)数量设置至关重要,它直接影响数据分布的均衡性和集群性能。根据官方推荐公式:
code复制PG总数 = (OSD数量 × 100) / 副本数
假设我们使用3个OSD节点,采用默认的3副本配置,则单个存储池的PG数量建议为:
code复制(3 × 100) / 3 = 100
考虑到未来扩展性,我们选择32个PG(最接近100的2的幂次方),这也是为什么示例中使用32 PG的原因。实际操作命令如下:
bash复制# 创建存储池
ceph osd pool create meta_rbd_k8s 32 32
# 启用RBD应用特性
ceph osd pool application enable meta_rbd_k8s rbd
# 初始化存储池
rbd pool init -p meta_rbd_k8s
注意:生产环境中建议根据实际数据量和性能需求调整PG数量。PG过少会导致数据分布不均,过多则会增加集群管理开销。
2.2 访问用户创建与权限配置
安全访问是生产环境中的关键考量。我们需要为Kubernetes创建专用的客户端用户,并严格控制其权限范围。以下是创建client.k8s用户的命令:
bash复制ceph auth get-or-create client.k8s \
mon 'allow r,profile rbd' \
mds 'allow rw' \
osd 'allow rw pool=cephfs.meta_fs.meta, allow rw pool=cephfs.meta_fs.data,profile rbd pool=meta_rbd_k8s' \
mgr 'profile rbd pool=meta_rbd_k8s' \
> /etc/ceph/ceph.client.k8s.keyring
这个命令创建了一个具有以下权限的用户:
- 监控器(mon):允许读取操作和RBD profile权限
- 元数据服务器(mds):允许读写操作(为同时支持CephFS做准备)
- OSD:限制只能访问指定的存储池
- 管理器(mgr):授予RBD管理权限
实践经验:建议为不同用途创建独立的用户,如单独为RBD和CephFS创建用户,遵循最小权限原则。
3. Kubernetes端CSI驱动部署
3.1 CSI驱动镜像准备
Ceph CSI驱动采用微服务架构,由多个组件构成。我们需要准备以下关键镜像:
code复制quay.io/cephcsi/cephcsi:v3.8.0 # 核心驱动组件
registry.k8s.io/sig-storage/csi-attacher:v4.0.0 # 卷附加控制器
registry.k8s.io/sig-storage/csi-provisioner:v3.3.0 # 卷供应控制器
registry.k8s.io/sig-storage/csi-resizer:v1.6.0 # 卷扩容控制器
registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0 # 快照控制器
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.6.2 # 节点注册器
离线环境部署时,需要先下载这些镜像,然后通过docker load导入:
bash复制docker load < ceph-csi.tar
常见问题:镜像版本必须严格匹配,特别是CSI驱动与Kubernetes版本的兼容性。v3.8.0版本支持Kubernetes 1.20+。
3.2 关键配置文件解析
3.2.1 集群连接配置(ceph-csi-config-map.yaml)
这个ConfigMap定义了Ceph集群的连接信息:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: "ceph-csi-config"
data:
config.json: |-
[
{
"clusterID": "06b11530-dcc8-11ed-af24-000c292339e4",
"monitors": [
"192.168.10.40:6789",
"192.168.10.41:6789",
"192.168.10.42:6789"
]
}
]
关键参数说明:
clusterID:通过ceph -s命令获取的集群FSIDmonitors:Ceph监控节点的IP和端口列表(默认6789)
注意事项:生产环境建议至少配置3个monitor地址,确保高可用性。
3.2.2 Ceph配置文件(ceph-config-map.yaml)
这个ConfigMap包含了Ceph客户端配置:
yaml复制apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
fsid = 06b11530-dcc8-11ed-af24-000c292339e4
mon_initial_members = ceph01,ceph02,ceph03
mon_host = 192.168.10.40,192.168.10.41,192.168.10.42
public_network = 192.168.10.0/24
cluster_network = 192.168.10.0/24
mon_allow_pool_delete = true
osd_pool_default_size = 2
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
keyring: |
metadata:
name: ceph-config
安全提示:
mon_allow_pool_delete在生产环境应谨慎开启,避免误删存储池。
3.2.3 认证密钥配置(csi-rbd-secret.yaml)
这个Secret存储了Ceph用户的认证信息:
yaml复制apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi
stringData:
userID: k8s
userKey: AQCbBT5k69+6MhAAmHIMBE/G2kWcfVO2W5vHag==
安全最佳实践:建议定期轮换密钥,并通过Kubernetes的RBAC限制对此Secret的访问。
3.3 StorageClass配置
StorageClass定义了动态供应的存储特性:
yaml复制apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 06b11530-dcc8-11ed-af24-000c292339e4
pool: meta_rbd_k8s
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
关键参数解析:
imageFeatures: 启用RBD镜像特性,layering支持快照和克隆fstype: 指定文件系统类型,ext4是较稳定的选择allowVolumeExpansion: 启用存储卷扩容功能discard: 支持TRIM/UNMAP,提高SSD使用寿命
性能调优:对于高性能需求场景,可考虑添加
csi.storage.k8s.io/fstype: xfs和mountOptions: [discard,nobarrier]。
4. 部署与验证
4.1 部署流程
-
创建命名空间:
bash复制
kubectl create namespace ceph-csi -
应用基础配置:
bash复制
kubectl -n ceph-csi apply -f ceph-csi-config-map.yaml kubectl -n ceph-csi apply -f ceph-config-map.yaml kubectl -n ceph-csi apply -f csi-rbd-secret.yaml -
部署RBAC规则:
bash复制
kubectl -n ceph-csi apply -f csi-nodeplugin-rbac.yaml kubectl -n ceph-csi apply -f csi-provisioner-rbac.yaml -
部署CSI驱动:
bash复制
kubectl -n ceph-csi apply -f csidriver.yaml kubectl -n ceph-csi apply -f csi-rbdplugin-provisioner.yaml kubectl -n ceph-csi apply -f csi-rbdplugin.yaml -
创建StorageClass:
bash复制
kubectl -n ceph-csi apply -f storageclass.yaml
部署技巧:建议使用kustomize或helm管理这些YAML文件,便于版本控制和批量操作。
4.2 资源验证
检查Pod运行状态:
bash复制kubectl -n ceph-csi get pods -o wide
预期输出应包含类似以下内容的运行中Pod:
code复制csi-rbdplugin-provisioner-5b5d8f8c6d-2q6n4 3/3 Running
csi-rbdplugin-abcde 2/2 Running
排障提示:如果Pod处于CrashLoopBackOff状态,检查日志时重点关注认证和网络连接问题。
4.3 功能测试
4.3.1 创建PVC测试
创建测试PVC:
yaml复制apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dev-rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
storageClassName: csi-rbd-sc
应用并检查状态:
bash复制kubectl apply -f pvc.yaml
kubectl get pvc dev-rbd-pvc
4.3.2 Pod挂载测试
创建测试Pod:
yaml复制apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx:latest
volumeMounts:
- name: mypvc
mountPath: /var/lib/www/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: dev-rbd-pvc
readOnly: false
验证挂载:
bash复制kubectl exec -it csi-rbd-demo-pod -- df -h | grep rbd
预期应看到类似输出:
code复制/dev/rbd0 97M 5.6M 91M 6% /var/lib/www/html
5. 生产环境注意事项
-
性能调优:
- 根据工作负载特点调整RBD缓存策略
- 考虑使用
krbd内核模块而非用户空间实现以获得更好性能 - 对于高IOPS需求,可启用RBD的
exclusive-lock和fast-diff特性
-
监控与告警:
- 部署Ceph集群的Prometheus监控
- 设置RBD镜像使用率的告警阈值
- 监控CSI驱动组件的健康状态
-
备份策略:
- 定期创建RBD快照
- 考虑使用Velero进行应用一致性备份
- 实现跨集群的RBD镜像复制
-
故障处理:
- 常见问题收集:
症状 可能原因 解决方案 PVC处于Pending状态 StorageClass配置错误 检查Provisioner日志 Pod挂载失败 节点内核不支持RBD 升级内核或使用用户空间驱动 IO性能差 网络延迟高 检查集群网络配置
- 常见问题收集:
-
版本兼容性:
- Ceph CSI v3.8.0对应Ceph Quincy(17.x)及以上版本
- 确保Kubernetes节点内核版本支持所需的RBD特性
- 升级时遵循官方推荐的升级路径
在实际生产部署中,我们发现以下几个经验特别有价值:
- 在节点上预先安装
ceph-common包可以减少驱动初始化时间 - 为RBD存储池设置适当的配额可以防止单个命名空间占用过多资源
- 定期检查并清理孤儿卷可以避免存储空间浪费
- 启用CSI驱动的详细日志有助于快速定位问题