概述
在使用k8s部署服务的时候,绝大多数的时候都是需要使用持久卷的。k8s常常会使用存储类(storageclass)来对物理存储(支持nfs、ceph等)进行抽象。由于k8s的ceph内置驱动与实际的ceph版本之间存在版本差,有的时候会无法部署。因此,推荐使用ceph-csi插件来使k8s支持ceph的RBD。
前提
1、ceph集群
ceph版本号为:ceph version 17.2.5 quincy (stable)
- mon1:192.168.3.51
- mon2:192.168.3.52
- mon3:192.168.3.53
2、k8s集群
kubernetes版本号为:Client Version: version.Info{Major:”1″, Minor:”23″, GitVersion:”v1.23.8″
- k8s1:192.168.3.31
- k8s2:192.168.3.32
- k8s3:192.168.3.33
- k8s4:192.168.3.34
配置ceph-csi
1、所有的k8s节点都需要安装rbd,即ceph-common
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod u+x cephadm
./cephadm install
cephadm install ceph-common
2、查询ceph集群的一些相关信息
在配置ceph-csi的过程中,需要ceph集群对应的一些信息,这些信息可以通过在mon的节点上执行相关操作获得。
查看ceph集群id
ceph fsid

ceph用户对应的密钥
由于是测试环境,本人直接使用ceph的管理员账号进行操作,获取admin的密钥:
ceph auth get-key client.admin

3、关于ceph的配置文件
(1)、ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
fsid = 0fa001fa-7029f-11ed-b8da-d9d44tg323aba5
mon_host = 192.168.3.51,192.168.3.52,192.168.3.53
keyring: |
metadata:
name: ceph-config
- fsid:上面步骤2中获取的fsid
- mon_host:所有mon的节点地址或主机名
(2)、csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: admin
userKey: AQCLOYdjGigUERAA54ffhcu6c7DkZOh88Lqvw==
- userID:ceph的用户名
- userKey:上面步骤2中获取的ceph用户的密钥
(3)、csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "0fa001fa-7029f-11ed-b8da-d9d44tg323aba5",
"monitors": [
"192.168.3.51:6789",
"192.168.3.52:6789",
"192.168.3.53:6789"
]
}
]
metadata:
name: ceph-csi-config
- clusterID:就是步骤2中的fsid
- monitors:ceph集群中的mon节点ip及端口号
4、关于ceph-csi插件的配置文件
从github中下载与k8s版本对应的ceph-csi源码包,并将其中的一些部署文件拷贝到相关目录。注意:ceph-csi的版本必须与k8s的版本对应,版本对照表参见ceph-csi项目首页。
https://codeload.github.com/ceph/ceph-csi/zip/refs/tags/v3.7.2
将源码包解压后,将相关的内容拷贝到自己的创建的目录(myceph-csi)中。
cd myceph-csi
cp ceph-csi/ceph-csi-3.7.2/deploy/rbd/kubernetes/csi-rbdplugin.yaml ./
cp ceph-csi/ceph-csi-3.7.2/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml ./
cp ceph-csi/ceph-csi-3.7.2/examples/kms/vault/kms-config.yaml ./
5、k8s存储相关的配置
(1)、storageclass的配置文件(sc-csi-rbd.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 0fa001fa-709f-11ed-b8da-d9d40593aba5
pool: k8s-pools
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
(2)、pvc部署文件(pvc-test.yaml)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
部署ceph-csi
我们把上面所有的配置文件都存放在目录myceph-csi中,通过ls -l的命令我们查看一下该目录下的文件:

注意:在部署的时候,不要使用【kubectl apply -f .】的命令,因为首次安装rbdplugin需要拉取大量的镜像,会使整个安装过程很慢。如果rbdplugin还没有安装成功,而你的storageclass与pvc操作已经开始创建,那结果就一定是失败。
1、先执行
cd myceph-csi
kubectl create -f csi-rbd-secret.yaml
kubectl create -f ceph-config-map.yaml
kubectl create -f csi-config-map.yaml
kubectl create -f kms-config.yaml
kubectl create -f csi-rbdplugin.yaml
kubectl create -f csi-rbdplugin-provisioner.yaml
然后查看所有的pods,看看与rbdplugin相关的pod是否已经创建成功,创建成功以后再创建storageclass与pvc。
kubectl get pods

2、创建sc与pvc
cd myceph-csi
kubectl create -f sc-csi-rbd.yaml
kubectl create -f pvc-test.yaml
3、查看结果

