一、整体流程总览
核心链路(必须按顺序)
Ceph 集群准备
→ 单机 CRUSH 故障域改为 osd
→ 创建 CephFS(meta + data pool)
→ 创建 CephFS 用户与 key
→ K8s 部署 Ceph-CSI(cephfs)
→ 配置 ceph-csi-config(fsid + mon)
→ 创建 Secret(admin / fs 用户)
→ 创建 StorageClass
→ 创建 PVC
→ Pod 挂载验证
二、Ceph 侧准备(单机 Ceph 关键点)
1️⃣ 单机 Ceph 必须使用 osd 作为故障域
原因: 默认host 故障域在单机环境永远无法满足副本要求,会导致 PG 一直 undersized。
创建新的 CRUSH rule(推荐,不改默认)
ceph osd crush rule create-replicated replicated_osd_rule default osd
ceph osd crush rule dump replicated_osd_rule
确认看到:
"op": "choose_firstn",
"type": "osd"
2️⃣ 创建 CephFS 所需的 pool
ceph osd pool create fs01_meta 32
ceph osd pool create fs01_data 32
设置副本与 CRUSH rule(单机推荐)
ceph osd pool set fs01_meta size 2
ceph osd pool set fs01_meta min_size 1
ceph osd pool set fs01_meta crush_rule replicated_osd_rule
ceph osd pool set fs01_data size 2
ceph osd pool set fs01_data min_size 1
ceph osd pool set fs01_data crush_rule replicated_osd_rule
3️⃣ 创建 CephFS
ceph fs new cephfs fs01_meta fs01_data
ceph fs ls
ceph fs status
必须看到:
STATE: active
4️⃣ 创建 CephFS 用户(给 CSI 用)
ceph fs authorize cephfs client.fs / rw \
> /etc/ceph/ceph.client.fs.keyring
查看 key:
cat /etc/ceph/ceph.client.fs.keyring
5️⃣ 确认 Ceph 基本信息(后面要用)
ceph fsid
ceph mon dump
示例:
fsid: a381d0fc-fa89-11f0-a737-000c29fb9165 mon: 172.17.0.140:6789
三、K8s 侧:部署 Ceph-CSI(CephFS)
1️⃣ 准备 Ceph-CSI 文件
mkdir /opt/ceph-csi
git clone https://gitee.com/yftyxa/ceph-csi.git /opt/ceph-csi
kubectl create ns csi
mkdir /csi-cephfs
cp /opt/ceph-csi/deploy/cephfs/kubernetes/* /csi-cephfs
cd /csi-cephfs
2️⃣ 配置 ceph-csi-config(最容易出错的地方)
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"
]
}
]
⚠️ clusterID必须等于****
ceph fsid,不能是 base64
3️⃣ 创建 Secret(admin + fs 用户)
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: csi
stringData:
userID: fs
userKey: <client.fs 的 key>
adminID: admin
adminKey: <client.admin 的 key>
encryptionPassphrase: test_passphrase
kubectl apply -f secret.yaml -n csi
4️⃣ 部署 CephFS CSI 组件
sed -i 's/namespace: default/namespace: csi/g' /csi-cephfs/*
kubectl apply -n csi \
-f csi-nodeplugin-rbac.yaml \
-f csi-cephfsplugin.yaml \
-f csi-cephfsplugin-provisioner.yaml \
-f csi-provisioner-rbac.yaml \
-f csidriver.yaml
调整 provisioner 副本(推荐 ≥2):
kubectl -n csi edit deploy csi-cephfsplugin-provisioner
5️⃣ StorageClass(CephFS)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID: a381d0fc-fa89-11f0-a737-000c29fb9165
fsName: cephfs
csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
csi.storage.k8s.io/provisioner-secret-namespace: csi
csi.storage.k8s.io.controller-expand-secret-name: csi-cephfs-secret
csi.storage.k8s.io.controller-expand-secret-namespace: csi
csi.storage.k8s.io.node-stage-secret-name: csi-cephfs-secret
csi.storage.k8s.io.node-stage-secret-namespace: csi
reclaimPolicy: Delete
allowVolumeExpansion: true
6️⃣ PVC(RWX)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-cephfs-pvc
namespace: csi
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: csi-cephfs-sc
7️⃣ Pod 挂载验证
apiVersion: v1
kind: Pod
metadata:
name: csi-cephfs-demo-pod
namespace: csi
spec:
containers:
- name: app
image: centos:8
command: ["/bin/bash","-c","sleep 999999"]
volumeMounts:
- name: data
mountPath: /opt/www
volumes:
- name: data
persistentVolumeClaim:
claimName: csi-cephfs-pvc
8️⃣ 验证写入是否成功
kubectl -n csi exec -it csi-cephfs-demo-pod -- /bin/bash
dd if=/dev/zero of=/opt/www/1000m.txt bs=100M count=10
Ceph 侧查看:
ceph df
四、最重要的“避坑总结”(你这次全部踩过)
❌ fsName 写成 pool 名
→ 必须是CephFS 名字
❌ clusterID 不等于 ceph fsid
→ CSI 一定报missing configuration for clusterID
❌ 单机还用 host 故障域
→ PG 永远 undersized
❌ 删 pool 不先删 CephFS
→EBUSY
五、最终一句话总结(适合写在笔记首页)
K8s 对接 CephFS 的核心不是 YAML,而是: Ceph 集群状态正确 + CRUSH 设计正确 + clusterID 对齐。