Kubernetes (K8S) 是一个流行的容器编排平台,而 Ceph 是一个分布式存储系统,提供了对象存储、块存储和文件系统等多种存储服务。在 Kubernetes 中使用 Ceph 作为持久化存储后端是一种常见的部署模式。
CSI 的官方地址:https://github.com/ceph/ceph-csi/tree/devel
前提配置
- 确保 Ceph 集群和 Kubernetes 集群已经正确部署并运行稳定。
- 确保 K8S 和 Ceph 版本有所匹配,点击查看版本支持关系。
本文档版本信息
- kubernetes: 1.28.12
- Ceph-CSI: v3.11
- Ceph: 18.2.4
部署 Ceph-CSI 插件
前置资料准备
获取Cluster ID和Monitors信息
1
ceph mon dump
下载 Ceph-CSI 插件
1
git clone -b release-v3.11 https://github.com/ceph/ceph-csi.git
创建 RBD 池以及连接用户
创建 Pool 池
1
2# 创建 RBD 块
ceph osd pool create kubernetes 8 8创建认证用户
1
ceph auth get-or-create client.k8s mon 'allow r' osd 'allow rwx pool=kubernetes'
创建 CephFS 文件系统以及连接用户
创建 CephFS 文件系统
1
ceph fs volume create k8sfs --placement="label:mds"
创建连接 CephFS 的用户
1
ceph auth get-or-create client.k8sfs mon 'allow r' mds 'allow rw path=/' osd 'allow rw pool=cephfs.k8sfs.data'
部署 Ceph RDB 驱动
进入
deploy/rbd/kubernetes/
目录,修改csi-config-map.yaml
文件,修改后文件内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# cat csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: "ceph-csi-config"
namespace: ceph-csi
data:
config.json: |-
[
{
"clusterID": "b742f15a-84a8-11ef-ae40-005056818276",
"monitors": [
"172.31.100.181:6789",
"172.31.100.182:6789",
"172.31.100.183:6789"
]
}
]修改 csi-rbdplugin.yaml 以及 csi-rbdplugin-provisioner.yaml 文件,将挂载
ceph-csi-encryption-kms-config
相关的配置注释掉1
2
3
4
5
6
7
8volumeMounts:
#- name: ceph-csi-encryption-kms-config
# mountPath: /etc/ceph-csi-encryption-kms-config/
volumes:
#- name: ceph-csi-encryption-kms-config
# configMap:
# name: ceph-csi-encryption-kms-config配置所有资源部署的 namespace 为
ceph-csi
1
grep -rl 'namespace: default' ./ --include="*.yaml" | xargs sed -i 's/namespace: default/namespace: ceph-csi/g'
同步镜像到内网 Harbor 仓库,然后修改配置文件镜像地址为内网 Harbor 地址
1
2
3grep -rl 'image: ' ./ --include="*.yaml" | xargs sed -i \
-e 's#quay.io/cephcsi#harbor.cs.yubang168.cn/ceph-csi#g' \
-e 's#registry.k8s.io/sig-storage#harbor.cs.yubang168.cn/ceph-csi#g'安装 Ceph-CSI RBD 驱动
1
2
3
4
5
6
7
8kubectl create ns ceph-csi
kubectl apply -f csidriver.yaml -n ceph-csi
kubectl apply -f csi-config-map.yaml -n ceph-csi
kubectl apply -f ../../ceph-conf.yaml -n ceph-csi
kubectl apply -f csi-provisioner-rbac.yaml -n ceph-csi
kubectl apply -f csi-nodeplugin-rbac.yaml -n ceph-csi
kubectl apply -f csi-rbdplugin-provisioner.yaml -n ceph-csi
kubectl apply -f csi-rbdplugin.yaml -n ceph-csi使用 Ceph 认证信息创建 RBD secret
1
2
3
4
5
6
7
8
9
10
11
12cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: ceph-csi
stringData:
userID: k8s
userKey: AQDC/D9nzFCjAxAA9MpM9GEmivSCt2fak3TiLA==
adminID: admin
adminKey: AQDv1QNn6m8dJhAAgW7W3Tam2cLaKv/xeolTlg==
EOFceph auth ls 获取的用户名是 client.xxx,这里的 userID 只取后面的 xxx 值
创建 RBD 类型的 storageClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: b742f15a-84a8-11ef-ae40-005056818276
pool: kubernetes
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
EOF注意:clusterID 为
ceph mon dump
获取到的 fsid 值
部署 CephFS 驱动
修改
csi-cephfsplugin.yaml
以及csi-cephfsplugin-provisioner.yaml
文件,将挂载ceph-csi-encryption-kms-config
相关的配置注释掉1
2
3
4
5
6
7
8volumeMounts:
#- name: ceph-csi-encryption-kms-config
# mountPath: /etc/ceph-csi-encryption-kms-config/
volumes:
#- name: ceph-csi-encryption-kms-config
# configMap:
# name: ceph-csi-encryption-kms-config配置所有资源部署的 namespace 为
ceph-csi
1
grep -rl 'namespace: default' ./ --include="*.yaml" | xargs sed -i 's/namespace: default/namespace: ceph-csi/g'
同步镜像到内网 Harbor 仓库,然后修改配置文件镜像地址为内网 Harbor 地址
1
2
3grep -rl 'image: ' ./ --include="*.yaml" | xargs sed -i \
-e 's#quay.io/cephcsi#harbor.cs.yubang168.cn/ceph-csi#g' \
-e 's#registry.k8s.io/sig-storage#harbor.cs.yubang168.cn/ceph-csi#g'安装 Ceph-CSI RBD 驱动
1
2
3
4
5kubectl apply -f csidriver.yaml -n ceph-csi
kubectl apply -f csi-provisioner-rbac.yaml -n ceph-csi
kubectl apply -f csi-nodeplugin-rbac.yaml -n ceph-csi
kubectl apply -f csi-cephfsplugin-provisioner.yaml -n ceph-csi
kubectl apply -f csi-cephfsplugin.yaml -n ceph-csi使用 Ceph 认证信息创建 RBD secret
1
2
3
4
5
6
7
8
9
10
11
12cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: ceph-csi
stringData:
userID: k8s
userKey: AQDE9zZndLd3BhAAsNdpVS6c02ds4DhaNdgntQ==
adminID: admin
adminKey: AQDv1QNn6m8dJhAAgW7W3Tam2cLaKv/xeolTlg==
EOFceph auth ls 获取的用户名是 client.xxx,这里的 userID 只取后面的 xxx 值
创建 RBD 类型的 storageClass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID: b742f15a-84a8-11ef-ae40-005056818276
fsName: fstest
csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi
csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi
csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi
reclaimPolicy: Delete
allowVolumeExpansion: true
EOF注意:clusterID 为
ceph mon dump
获取到的 fsid 值
测试挂载
使用 RBD 存储
使用 ceph-csi 提供的示例文件创建 pvc
1
2
3
4
5
6
7
8
9
10# 进入示例文件目录
cd ceph-csi/examples/rbd/
# 创建 PVC
kubectl create -f pvc.yaml
# 查看创建的 pvc
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
rbd-pvc Bound pvc-3afa9aaa-b4b2-4341-a5fd-a18a999acb4b 1Gi RWO csi-rbd-sc 17h创建 pod 挂载 pvc
1
kubectl create -f pod.yaml
查看 Pod 文件挂载
1
2kubectl exec -it csi-rbd-demo-pod -- df -Th |grep /var/lib/www/html
/dev/rbd0 ext4 974M 24K 958M 1% /var/lib/www/html
使用 CephFS
默认情况下,Ceph CSI 插件会尝试在一个名为 csi 的 subvolume group 中创建卷,而这个 subvolume group 需要手动创建。
使用以下命令检查是否已经存在名为 csi 的 subvolume group
1
ceph fs subvolumegroup ls k8sfs
如果没有找到 csi 的 subvolume group,运行以下命令创建:
1
ceph fs subvolumegroup create k8sfs csi
使用 ceph-csi 提供的示例文件创建 pvc
1
2
3
4
5
6
7
8
9
10
11# 进入示例文件目录
cd ceph-csi/examples/cephfs/
# 创建 PVC
kubectl create -f pvc.yaml
# 查看创建的 pvc
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-cephfs-pvc Bound pvc-b34e6463-f1c6-4e5d-a58c-9a7d45bafc67 1Gi RWX csi-cephfs-sc 15h
rbd-pvc Bound pvc-3afa9aaa-b4b2-4341-a5fd-a18a999acb4b 1Gi RWO csi-rbd-sc 17h创建 pod 挂载 pvc
1
kubectl create -f pod.yaml
查看 Pod 文件挂载
1
2# kubectl exec -it csi-cephfs-demo-pod -- df -Th |grep /var/lib/www
172.31.100.181:6789,172.31.100.182:6789,172.31.100.183:6789:/volumes/csi/csi-vol-603fb11b-057e-49ec-9ab4-0499475d588f/ba67cbab-7923-49a0-a29c-ee439f487348 ceph 1.0G 0 1.0G 0% /var/lib/www