本文最后更新于8 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、Ceph 端准备(存储侧)
1️⃣ 创建 CRUSH 规则(副本池使用)
ceph osd crush rule create-replicated replicated_osd_rule default osd
ceph osd crush rule dump replicated_osd_rule
2️⃣ 创建 RBD 存储池
ceph osd pool create rbd01
ceph osd pool application enable rbd01 rbd
绑定 CRUSH 规则:
ceph osd pool set rbd01 crush_rule replicated_osd_rule
设置副本参数(小集群推荐):
ceph osd pool set rbd01 size 2
ceph osd pool set rbd01 min_size 1
3️⃣ 创建 Ceph RBD 用户(供 K8s 使用)
ceph auth add client.rbduser \
mon 'allow r' \
osd 'allow rwx pool=rbd01'
获取 key(后面写 Secret 要用):
ceph auth get client.rbduser
示例:
[client.rbduser]
key = AQAVG3hp2Ll4KxAA+g9t3VVEgsFN4Y+Q/Vch8w==
4️⃣ 获取 Ceph 集群信息
ceph mon dump
重点记录:
fsid(clusterID)monIP:PORT
示例:
fsid a381d0fc-fa89-11f0-a737-000c29fb9165
mon.ceph.example.com 172.17.0.140:6789
二、Kubernetes 端准备(CSI 驱动)
1️⃣ 下载 Ceph-CSI 部署文件
yum install -y git
mkdir /opt/ceph-csi
git clone https://gitee.com/yftyxa/ceph-csi.git /opt/ceph-csi
2️⃣ 创建命名空间
kubectl create ns csi
3️⃣ 准备 RBD CSI YAML 文件
mkdir /csi-rbd
cp /opt/ceph-csi/deploy/rbd/kubernetes/* /csi-rbd/
目录包含:
csi-config-map.yaml
csi-nodeplugin-rbac.yaml
csi-rbdplugin.yaml
csi-rbdplugin-provisioner.yaml
csi-provisioner-rbac.yaml
csidriver.yaml
4️⃣ 配置 Ceph CSI ConfigMap(关键)
编辑csi-config-map.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: ceph-csi-config
data:
config.json: |-
[
{
"clusterID": "a381d0fc-fa89-11f0-a737-000c29fb9165",
"monitors": [
"172.17.0.140:6789"
]
}
]
应用配置:
cp /opt/ceph-csi/deploy/ceph-conf.yaml /csi-rbd/
kubectl -n csi apply -f ceph-conf.yaml -f csi-config-map.yaml
5️⃣ 修改所有 YAML 的命名空间为 csi
sed -i 's/namespace: default/namespace: csi/g' /csi-rbd/*
6️⃣ 部署 Ceph CSI RBD 插件
kubectl apply \
-f csi-nodeplugin-rbac.yaml \
-f csi-rbdplugin-provisioner.yaml \
-f csi-rbdplugin.yaml \
-f csi-provisioner-rbac.yaml \
-n csi
确认 Pod 状态:
kubectl get pod -n csi
7️⃣ 调整 provisioner 副本数(推荐)
kubectl edit deployment csi-rbdplugin-provisioner -n csi
修改为:
replicas: 2
三、K8s 访问 Ceph 的认证(Secret)
1️⃣ 创建 RBD Secret
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: csi
stringData:
userID: rbduser
userKey: AQAVG3hp2Ll4KxAA+g9t3VVEgsFN4Y+Q/Vch8w==
应用:
kubectl apply -f secret.yaml -n csi
四、创建 StorageClass(核心)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: a381d0fc-fa89-11f0-a737-000c29fb9165
pool: rbd01
imageFeatures: "layering"
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: csi
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: csi
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
应用并验证:
kubectl apply -f storageclass.yaml -n csi kubectl get sc
五、PVC + Pod 验证
1️⃣ 创建 PVC
kubectl apply -f pvc.yaml -n csi kubectl get pvc -n csi
状态应为:
STATUS: Bound
2️⃣ 创建 Pod 挂载 RBD
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: pod01
image: centos:8
command: ["/bin/bash","-c","sleep 10000"]
volumeMounts:
- name: mypvc
mountPath: /opt/pvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
kubectl apply -f pod.yaml -n csi
3️⃣ 验证 RBD 挂载成功
kubectl exec -it csi-rbd-demo-pod -n csi -- df -Th
看到:
/dev/rbd0 ext4 1G /opt/pvc
写入测试:
cd /opt/pvc touch {1..100}.txt
4️⃣ Node 节点侧验证(可选)
lsblk | grep rbd
rbd0 1G /var/lib/kubelet/pods/.../mount
六、整体流程总结(一句话版)
Ceph 创建 RBD 池 → 创建 rbd 用户 → K8s 部署 Ceph CSI → 创建 Secret → StorageClass → PVC → Pod 挂载 → RBD 设备映射到 Node → Pod 内使用