K8s 对接 CephFS

一、整体流程总览

核心链路(必须按顺序)

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 对齐。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇