概述
在应用kubernetes集群的时候,我们通常会使用ceph来为持久卷提供底层存储功能。ceph有两种提供存储的方式——RBD及cephfs。当分别使用它们为pv(Persistent Volumes——持久卷)提供底层存储的时候要注意,RBD本身只支持ReadWriteOnce的访问模式。如果你的k8s集群只有一个节点可以使用它,在多个节点的k8s集群中,RBD是不可用的,这个时候只能使用cephfs来作为底层存储。
安装条件
集群及软件版本
- kubernetes集群 版本v1.23.8,四个节点(k8s1、k8s2、k8s3、k8s4)
- ceph集群 版本v15.2.17 octopus (stable)
- ceph-csi 版本v3.6.2
注意,上述的版本是通过测试的,如果你需要更换kubernetes或ceph版本,那么ceph-csi的版本也需要进行变更。具体支持列表可以查看官方首页。
cephfs的创建
在使用ceph-csi的时候,我们需要先在ceph集群中创建好文件系统(Filesystems),创建方式如下:
ceph osd pool create k8s-cephfs-pools 64
ceph osd pool create k8s-cephfs-metadata 64
ceph osd pool ls
k8s-cephfs-pools
k8s-cephfs-metadata
#如果你的ceph集群中已经存在其他的文件系统,需要设置集群支持多文件系统
ceph fs flag set enable_multiple true
#创建一个名为k8s-cephfs的文件系统
ceph fs new k8s-cephfs k8s-cephfs-metadata k8s-cephfs-pools
ceph fs ls
name: k8s-cephfs, metadata pool: k8s-cephfs-metadata, data pools: [k8s-cephfs-pools ]

查看集群相关信息
1、fsid(ceph-csi中称为ClusterID)
ceph fsid

2、获取用户的密钥
本实例由于是内部测试环境,直接使用admin用户进行管理。
ceph auth get-key client.admin

配置ceph-csi
1、拷贝插件配置文件
在github中下载ceph-csi-3.6.2.tar.gz文件,解压后拷贝出需要用到的配置文件到指定目录。
tar zxvf ceph-csi-3.6.2.tar.gz
mkdir cephfs-csi
cp ceph-csi-3.6.2/deploy/cephfs/kubernetes/* ./
其目录结构如下:

2、修改csi-config-map.yaml配置文件
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "64406cb4-75fd-11ed-a77b-bff23c982581",
"monitors": [
"192.168.3.51:6789",
"192.168.3.52:6789",
"192.168.3.53:6789"
]
}
]
metadata:
name: ceph-csi-config
- clusterID:上面操作中获取到的fsid
- monitors:ceph集群中的所有mon节点的ip地址及端口号
3、添加文件:ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
fuse_set_user_groups = false
fuse_big_writes = true
fsid = 64406cb4-75fd-11ed-a77b-bff23c982581
mon_host = 192.168.3.51,192.168.3.52,192.168.3.53
keyring: |
metadata:
name: ceph-config
- fsid:上面操作获取的fsid
- mon_host:ceph集群的所有mon节点的ip地址
4、添加csi-secret.yaml文件
---
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: default
stringData:
userID: admin
userKey: AQA7O5Bjoyy6KRAAIZOKOmiHPY8RwNHRNW2e0Q==
adminID: admin
adminKey: AQA7O5Bjoyy6KRAAIZOKOmiHPY8RwNHRNW2e0Q==
- userID:ceph下的用户
- userKey:用户对应的key
5、创建storageclass的配置文件(sc-csi-cephfs.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
clusterID: 64406cb4-75fd-11ed-a77b-bff23c982581
fsName: k8s-cephfs
csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
- clusterID:上面操作中获取的fsid
- fsName:上面操作中创建的cephfs文件系统的名称
- csi-cephfs-secret:csi-secret.yaml文件中配置的secret名称
6、创建pvc(pvc-test.yaml)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: csi-cephfs-sc
- storageClassName:storageclass的名称
7、创建并测试
cd cephfs
kubectl create -f .
注意:首次创建的过程中,由于需要拉取镜像,过程会很慢。pvc会在sc创建之前完成,导致pvc创建的过程中报找不到storageclass的错误,需要手动删除pvc后再单独创建一次pv即可。
kubectl delete -f pvc-test.yaml
kubectl create -f pvc-test.yaml
kubectl get pv
