Ceph跟K8S进行集成
# github官网:
https://github.com/kubernetes/examples/tree/master/volumes/cephfs/
# k8s官网:
https://kubernetes.io/docs/concepts/storage/volumes/#cephfs
# ceph官网
https://docs.ceph.com/en/reef/rbd/rbd-kubernetes/
# 参考:
《HCIE-openEuler V1.0 实验手册》

环境信息
1、k8s集群
| 主机名 | IP地址 | 操作系统 | 配置 | 关键组件 |
|---|---|---|---|---|
| k8s-master01 | 172.16.90.11 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kube-apiserver, etcd, etc |
| k8s-node01 | 172.16.90.12 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kubelet, kube-proxy |
| k8s-node02 | 172.16.90.13 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kubelet, kube-proxy |
# 为了方便管理,k8s配置dashboard,本文采用kubesphere
# 只在master节点部署,前提是已经安装helm
[root@k8s-master01 ~]# helm upgrade --install -n kubesphere-system --create-namespace ks-core https://charts.kubesphere.com.cn/main/ks-core-1.1.4.tgz --set global.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --set extension.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --debug --wait
# Access the KubeSphere Console
http://172.16.90.11:30880
# Login to KubeSphere Console
Use the following credentials to log in:
Account: admin
Password: P@88w0rd # 第一次登录需要修改密码

2、ceph集群
| 主机名 | IP地址 | 操作系统 | 配置 | 作用 |
|---|---|---|---|---|
| serverc.lab.example.com | 172.16.90.91 | Rocky Linux release 8 | 2颗CPU 2G内存 40G硬盘 3*30G硬盘 | 存储节点 |
| serverd.lab.example.com | 172.16.90.92 | Rocky Linux release 8 | 2颗CPU 2G内存 40G硬盘 3*30G硬盘 | 存储节点 |
| servere.lab.example.com | 172.16.90.93 | Rocky Linux release 8 | 2颗CPU 2G内存 40G硬盘 3*30G硬盘 | 存储节点 |
| clienta.lab.example.com | 172.16.90.94 | Rocky Linux release 8 | 2颗CPU 2G内存 40G硬盘 3*30G硬盘 | 管理节点 |
# ceph dashboard
https://172.16.90.91:8443/
admin/redhat

# 内置了Prometheus和Grafana
https://172.16.90.91:3000/

# ceph 和 k8s 集群各节点互相添加hosts解析
# 最终的hosts文件如下
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.90.91 serverc.lab.example.com serverc
172.16.90.92 serverd.lab.example.com serverd
172.16.90.93 servere.lab.example.com servere
172.16.90.94 client.lab.example.com client
172.16.90.11 k8s-master01
172.16.90.12 k8s-node01
172.16.90.13 k8s-node02
实验介绍
关于本实验
本实验通过 ceph 的对接使用,实现对于 Kubernetes 后端块存储和文件存储的实践。
实验目的
-
理解 volume 挂载 ceph-rbd 的方法。(k8s v1.31 版本将删除Ceph RBD 卷插件及其 CSI 迁移支持*,rbd*卷类型将无法继续使用。 建议你在集群中使用RBD CSI 驱动。)
-
理解 PV 和 PVC 挂载 ceph-rbd 的方法。
-
掌握 StorageClass 挂载 ceph-rbd 的方法。
-
掌握 StorageClass 挂载 cephfs 的方法。
实验步骤
一、K8S连接Ceph步骤
1.1、kubernetes的主机上安装ceph客户端
所有节点安装ceph-common
添加ceph的yum源:
cat > /etc/yum.repos.d/ceph.repo <<EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/x86_64
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-quincy/el9/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF
安装ceph-common:
yum install ceph-common -y
1.2、配置ceph配置文件
将ceph配置文件拷贝到各个k8s的node节点
[root@serverc ~]# scp -r /etc/ceph/ k8s-master01:/etc/
[root@serverc ~]# scp -r /etc/ceph/ k8s-node01:/etc/
[root@serverc ~]# scp -r /etc/ceph/ k8s-node02:/etc/
1.3、ceph新建pool、user
# 1、新建一个pool
[root@k8s-master01 ~]# ceph osd pool create kubernetes
pool 'kubernetes' created
# 新创建的池必须在使用前进行初始化。
[root@k8s-master01 ~]# rbd pool init kubernetes
# 2、为 Kubernetes 和ceph-csi创建新用户,且只能使用指定的pool(kubernetes)
[root@k8s-master01 ceph_test]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
key = AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
# 3、查看用户
[root@k8s-master01 ceph_test]# ceph auth ls | grep -A 3 client.kubernetes
installed auth entries:
client.kubernetes
key: AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
caps: [mgr] profile rbd pool=kubernetes
caps: [mon] profile rbd
# 4、对这个用户进行加密,后面的secret会用到
[root@k8s-master01 ceph_test]# echo AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA== | base64
QVFEenJmaG5OcCtoS0JBQTJHTWVReGwxNXRBcE5MeDRQZytvSUE9PQo=
# 5、查看mon地址
[root@k8s-master01 ~]# ceph mon dump
epoch 4
fsid 368690e6-ef0f-11ee-a429-defa6053e742
last_changed 2024-03-31T03:41:23.472436+0000
created 2024-03-31T03:33:15.412646+0000
min_mon_release 16 (pacific)
election_strategy: 1
0: [v2:172.16.90.91:3300/0,v1:172.16.90.91:6789/0] mon.serverc.lab.example.com
1: [v2:172.16.90.93:3300/0,v1:172.16.90.93:6789/0] mon.servere
2: [v2:172.16.90.92:3300/0,v1:172.16.90.92:6789/0] mon.serverd
3: [v2:172.16.90.94:3300/0,v1:172.16.90.94:6789/0] mon.client
dumped monmap epoch 4
二、StorageClass集成Ceph
下图展示了 Kubernetes/Ceph 技术栈

2.1 Storage Class的作用
简单来说,storage配置了要访问ceph RBD的IP/Port、用户名、keyring、pool,等信息,我们不需要提前创建image;当用户创建一个PVC时,k8s查找是否有符合PVC请求的storage class类型,如果有,则依次执行如下操作:
-
到ceph集群上创建image
-
创建一个PV,名字为pvc-xx-xxx-xxx,大小pvc请求的storage。
-
将上面的PV与PVC绑定,格式化后挂到容器中
通过这种方式管理员只要创建好storage class就行了,后面的事情用户自己就可以搞定了。如果想要防止资源被耗尽,可以设置一下Resource Quota。
当pod需要一个卷时,直接通过PVC声明,就可以根据需求创建符合要求的持久卷。
2.2 配置 ceph-csi
Ceph CSI (Container Storage Interface)
Ceph CSI(容器存储接口)是 Ceph 社区为 Kubernetes 开发的一个插件,它允许 Kubernetes 使用 Ceph 的块存储功能。CSI 是 Kubernetes 存储生态的一部分,用于标准化各种存储系统的集成方式。
CSI 的作用:
-
标准化接口:CSI 提供了一个标准的接口,使得 Kubernetes 可以与不同的存储系统交互。
-
存储管理:通过 CSI 插件,Kubernetes 可以创建、删除、挂载和卸载存储卷。
-
动态配置:支持动态配置存储类(StorageClass),这允许用户定义存储需求,并由 Kubernetes 动态地分配资源。
前提配置
-
确保Ceph集群和Kubernetes集群已经正确部署并运行稳定。
-
配置MDS服务,确保CephFS可以使用。
-
创建存储池和文件系统,为CephFS接口准备必要的存储资源。
-
确保K8S和Ceph版本有所匹配。
Ceph CSI github地址:GitHub - ceph/ceph-csi at release-v3.14
Ceph CSI drivers are currently developed and tested exclusively in Kubernetes environments.
Ceph CSI Version Container Orchestrator Name Version Tested v3.14.0 Kubernetes v1.30, v1.31, v1.32 v3.13.1 Kubernetes v1.29, v1.30, v1.31 v3.13.0 Kubernetes v1.29, v1.30, v1.31 There is work in progress to make this CO-independent and thus support other
1、生成ceph-csi ConfigMap
生成类似于以下示例的csi-config-map.yaml文件,将fsid替换为"clusterID",将监视器地址替换为"monitors":
在上面的步骤,我们已经在ceph集群用创建了我们所需的信息,现在在k8s集群中使用起来
# 1、新建目录
[root@k8s-master01 ~]# mkdir /app/ceph_test -p ;cd /app/ceph_test
# 2、创建secret的yaml文件
[root@k8s-master01 ceph_test]# cat csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "368690e6-ef0f-11ee-a429-defa6053e742",
"monitors": [
"172.16.90.91:6789",
"172.16.90.92:6789",
"172.16.90.93:6789"
]
}
]
metadata:
name: ceph-csi-config
# 3、create这个ConfigMap
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
[root@k8s-master01 ceph_test]# kubectl apply -f csi-config-map.yaml
configmap/ceph-csi-config created
最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供程序的详细信息。如果未设置 KMS,请在csi-kms-config-map.yaml文件中放入一个空配置,或参考https://github.com/ceph/ceph-csi/tree/master/examples/kms上的示例:
$ cat <<EOF > csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
{}
metadata:
name: ceph-csi-encryption-kms-config
EOF
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
$ kubectl apply -f csi-kms-config-map.yaml
ceph-csi的最新版本还需要另一个ConfigMap对象来定义 Ceph 配置,以添加到 CSI 容器内的 ceph.conf 文件中:
$ cat <<EOF > ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
ceph.conf: |
[global]
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# keyring is a required key and its value should be empty
keyring: |
metadata:
name: ceph-config
EOF
生成后,将新的ConfigMap对象存储在 Kubernetes 中:
$ kubectl apply -f ceph-config-map.yaml
2、生成ceph-csi cephx Secret
ceph-csi需要 cephx 凭据才能与 Ceph 集群通信。使用新创建的 Kubernetes 用户 ID 和 cephx 密钥生成类似以下示例的csi-rbd-secret.yaml文件:
$ cat <<EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: kubernetes
userKey: AQDzrfhnNp+hKBAA2GMeQxl15tApNLx4Pg+oIA==
EOF
生成后,将新的Secret对象存储在 Kubernetes 中:
$ kubectl apply -f csi-rbd-secret.yaml
3、配置ceph-csi插件
创建所需的ServiceAccount和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象无需根据你的 Kubernetes 环境进行定制,因此可以直接从ceph-csi 部署 YAML 中使用:
操作之前先去除 master节点污点
# master 去除污点
[root@k8s-master01 ceph_test]# kubectl describe nodes k8s-master01 | grep -i taint
Taints: node-role.kubernetes.io/control-plane:NoSchedule
[root@k8s-master01 ceph_test]# kubectl taint node k8s-master01 node-role.kubernetes.io/control-plane:NoSchedule-
node/k8s-master01 untainted
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
最后,创建ceph-csi配置器和节点插件。除了ceph-csi容器发行版本之外,这些对象无需根据您的 Kubernetes 环境进行定制,因此可以直接从ceph-csi部署 YAML 中使用:
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
此处需要修改镜像地址:
[root@k8s-master01 ceph_test]# grep -i image: csi-rbdplugin-provisioner.yaml
image: quay.io/cephcsi/cephcsi:canary
#image: registry.k8s.io/sig-storage/csi-provisioner:v5.1.0
image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-provisioner:v5.1.0
#image: registry.k8s.io/sig-storage/csi-snapshotter:v8.2.0
image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-snapshotter:v8.2.0
#image: registry.k8s.io/sig-storage/csi-attacher:v4.8.0
image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-attacher:v4.8.0
#image: registry.k8s.io/sig-storage/csi-resizer:v1.13.1
image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-resizer:v1.13.1
image: quay.io/cephcsi/cephcsi:canary
image: quay.io/cephcsi/cephcsi:canary
[root@k8s-master01 ceph_test]# grep -i image: csi-rbdplugin.yaml
image: quay.io/cephcsi/cephcsi:canary
#image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
image: registry.cn-hangzhou.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.13.0
image: quay.io/cephcsi/cephcsi:canary
$ kubectl apply -f csi-rbdplugin-provisioner.yaml
$ kubectl apply -f csi-rbdplugin.yaml
2.3 使用 Ceph 块设备
1、创建StorageClass
Kubernetes StorageClass定义了一种存储类别。可以创建多个StorageClass 对象,以映射到不同的服务质量级别(例如,NVMe 池与基于 HDD 的池)和功能。
例如,要创建映射到上面创建的Kubernetes池的ceph-csi StorageClass ,可以在确保"clusterID"属性与 Ceph 集群的fsid匹配后使用以下 YAML 文件:
$ cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: 368690e6-ef0f-11ee-a429-defa6053e742
pool: kubernetes
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
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
EOF
$ kubectl apply -f csi-rbd-sc.yaml
2、创建PersistentVolumeClaim
PersistentVolumeClaim是用户对抽象存储资源的请求。PersistentVolumeClaim随后会关联到Pod资源,以配置一个PersistentVolume,该卷将由 Ceph 块镜像支持。可以包含可选的volumeMode ,用于在已挂载的文件系统(默认)或基于原始块设备的卷之间进行选择。
使用ceph-csi,为volumeMode指定Filesystem可以支持 ReadWriteOnce和ReadOnlyMany accessMode声明, 为volumeMode指定Block可以支持ReadWriteOnce、ReadWriteMany和 ReadOnlyMany accessMode声明。
例如,要创建一个基于块的PersistentVolumeClaim,该 PersistentVolumeClaim 利用上面创建的基于ceph-csi的StorageClass,可以使用以下 YAML 从csi-rbd-sc StorageClass请求原始块存储:
$ cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: raw-block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f raw-block-pvc.yaml
下面演示了将上述 PersistentVolumeClaim作为原始块设备绑定到Pod资源的示例:
$ cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-raw-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: raw-block-pvc
EOF
$ kubectl apply -f raw-block-pod.yaml
查看:
[root@k8s-master01 ceph_test]# kubectl get pv,pvc,pod
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/pvc-7f2800ad-68c4-438c-8413-95e32c0e3995 1Gi RWO Delete Bound default/raw-block-pvc csi-rbd-sc <unset> 46m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/raw-block-pvc Bound pvc-7f2800ad-68c4-438c-8413-95e32c0e3995 1Gi RWO csi-rbd-sc <unset> 46m
NAME READY STATUS RESTARTS AGE
pod/csi-rbdplugin-kfwgw 3/3 Running 0 47m
pod/csi-rbdplugin-nmn5h 3/3 Running 0 47m
pod/csi-rbdplugin-provisioner-777d6d9654-5rmkp 7/7 Running 3 (15m ago) 48m
pod/csi-rbdplugin-provisioner-777d6d9654-cjhjb 7/7 Running 0 48m
pod/csi-rbdplugin-provisioner-777d6d9654-h289k 7/7 Running 2 (15m ago) 48m
pod/csi-rbdplugin-vslhw 3/3 Running 0 47m
pod/pod-with-raw-block-volume 1/1 Running 0 45m
创建一个基于文件系统PersistentVolumeClaim其利用 ceph- CSI基StorageClass上面创建,以下YAML可以用于请求安装从文件系统(由RBD图像支持)CSI -rbd-SC StorageClass:
$ cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rbd-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem # Filesystem
resources:
requests:
storage: 1Gi
storageClassName: csi-rbd-sc
EOF
$ kubectl apply -f pvc.yaml
以下示例和示例将上述PersistentVolumeClaim绑定 到作为已挂载文件系统的Pod资源:
$ cat <<EOF > pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: csi-rbd-demo-pod
spec:
containers:
- name: web-server
image: nginx:1.17.1
volumeMounts:
- name: mypvc
mountPath: /var/www/html
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: rbd-pvc
readOnly: false
EOF
$ kubectl apply -f pod.yaml
三、StorageClass对接 CephFS
3.1 创建Cephfs文件系统
Cephfs类型的CSI提供了指定使用哪一个Cephfs文件系统的参数,我们可以在Ceph集群中再创建一个Cephfs文件系统,专门为Storageclass使用。
1.创建Cephfs使用的资源池
# ceph osd pool create k8s_cephfs_data 64
# ceph osd pool create k8s_cephfs_metadata 64
2.创建cephfs文件系统
# ceph fs new k8s_cephfs k8s_cephfs_metadata k8s_cephfs_data
部署MDS
# ceph orch apply mds k8s_cephfs --placement="3 ceph1 ceph2 ceph3"
3、在Cephfs文件系统中创建一个子卷
StorageClass使用Cephfs-CSI客户端将数据持久化到Cephfs文件系统时,无法指定Cephfs文件系统中现有的子目录进行挂载,只能将数据写在文件系统的/目录中,这是Cephfs-CSI程序内部写死的,无法进行配置,除非修改源代码。
volumes目录是无法修改的,只能修改volumes目录中的子目录csi,Cephfs-CSI会在Ceph集群指定的Cephfs文件系统中创建一个子卷,这个目录就对应的就是子卷的名称。
下面我们来创建一个子卷。
命令格式:ceph fs subvolumegroup create {cephfs文件系统名称} {子卷名称}
1>.创建子卷
# ceph fs subvolumegroup create k8s_cephfs csi
2>.查看文件系统下所有的子卷
[root@k8s-master01 ceph_test]# ceph fs subvolumegroup ls k8s_cephfs
[
{
"name": "csi"
}
]
3.2 在K8S集群中部署Cephfs-CSI供应商客户端
创建所需的ServiceAccount和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象。这些对象无需根据你的 Kubernetes 环境进行定制,因此可以直接从ceph-csi 部署 YAML 中使用:
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-provisioner-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-nodeplugin-rbac.yaml
$ kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csidriver.yaml
•csi-driver.yaml文件在Kubernetes中主要用于部署CSI(Container Storage Interface)驱动,这些驱动允许动态地在Kubernetes环境中创建和挂载存储卷。
最后,创建ceph-csi配置器和节点插件。除了ceph-csi容器发行版本之外,这些对象无需根据您的 Kubernetes 环境进行定制,因此可以直接从ceph-csi部署 YAML 中使用:
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yaml
$ wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/cephfs/kubernetes/csi-cephfsplugin.yaml
此处需要修改镜像地址:
# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google_containers#' csi-cephfsplugin-provisioner.yaml
# sed -i 's#registry.k8s.io/sig-storage#registry.cn-hangzhou.aliyuncs.com/google_containers#' csi-cephfsplugin.yaml
$ kubectl apply -f csi-cephfsplugin-provisioner.yaml
$ kubectl apply -f csi-cephfsplugin.yaml
CSI连接Ceph集群的ConfigMap资源
[root@k8s-master01 ceph_test]# cat csi-cephfs-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "368690e6-ef0f-11ee-a429-defa6053e742",
"monitors": [
"172.16.90.91:6789",
"172.16.90.92:6789",
"172.16.90.93:6789"
],
"cephFS": {
"subvolumeGroup": "csi"
}
}
]
metadata:
name: ceph-csi-config
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-config-map.yaml
clusterID:集群的ID号
monitors:Monitor组件的地址
subvolumeGroup:Cephfs文件系统中的子卷名称,StorageClass分配的PV,产生的持久化数据都会存储在这里。
创建 secret,后面对接回用到
# 查看key
[root@k8s-master01 ceph_test]# ceph auth get client.admin
[client.admin]
key = AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
exported keyring for client.admin
创建 secret,修改 userKey 和 adminKey 为上述命令查询到的 key 值:
[root@k8s-master01 ceph_test]# cat csi-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-secret
stringData:
# Required for statically provisioned volumes
userID: admin
userKey: AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
# Required for dynamically provisioned volumes
adminID: admin
adminKey: AQB62QhmzFY0JRAAmWFjOZKyL5mtynddMMnRHw==
# Encryption passphrase
encryptionPassphrase: test_passphrase
# kubectl apply -f csi-secret.yaml
[root@k8s-master01 ceph_test]# kubectl get secrets
NAME TYPE DATA AGE
csi-rbd-secret Opaque 2 3h7m
csi-secret Opaque 5 83m
2.3 使用 Cephfs设备
1、创建StorageClass
[root@k8s-master01 ceph_test]# cat csi-cephfs-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs-sc
namespace: default
provisioner: cephfs.csi.ceph.com
parameters:
clusterID: 368690e6-ef0f-11ee-a429-defa6053e742
fsName: k8s_cephfs
pool: k8s_cephfs_data
csi.storage.k8s.io/provisioner-secret-name: csi-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/controller-expand-secret-name: csi-secret
csi.storage.k8s.io/controller-expand-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
mounter: kernel
reclaimPolicy: Delete
allowVolumeExpansion: true
# kubectl apply -f csi-cephfs-sc.yaml
# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-cephfs-sc cephfs.csi.ceph.com Delete Immediate true 46m
csi-rbd-sc rbd.csi.ceph.com Delete Immediate true 175m
2、创建PersistentVolumeClaim
[root@k8s-master01 ceph_test]# cat csi-cephfs-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: csi-cephfs-pvc
spec:
storageClassName: csi-cephfs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
# kubectl apply -f csi-cephfs-pvc.yaml
准备演示pod
[root@k8s-master01 ceph_test]# cat csi-cephfs-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: csi-cephfs-pod1
name: csi-cephfs-pod1
spec:
containers:
- name: csi-cephfs-pod1
image: nginx:1.17.1
volumeMounts:
- name: csi-cephfs-pod1
mountPath: /mnt
readOnly: false
volumes:
- name: csi-cephfs-pod1
persistentVolumeClaim:
claimName: csi-cephfs-pvc
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-pod1.yaml
pod/csi-cephfs-pod1 created
部署 csi-cephfs-pod2,共同挂载一个 PVC:
[root@k8s-master01 ceph_test]# cat csi-cephfs-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: csi-cephfs-pod2
name: csi-cephfs-pod2
spec:
containers:
- name: csi-cephfs-pod2
image: nginx:1.17.1
volumeMounts:
- name: csi-cephfs-pod2
mountPath: /mnt
readOnly: false
volumes:
- name: csi-cephfs-pod2
persistentVolumeClaim:
claimName: csi-cephfs-pvc
[root@k8s-master01 ceph_test]# kubectl apply -f csi-cephfs-pod2.yaml
pod/csi-cephfs-pod1 created
登录 csi-cephfs-pod1:
[root@k8s-master01 ceph_test]# kubectl exec -it csi-cephfs-pod1 -- /bin/bash
root@csi-cephfs-pod1:/# echo "hello csi-ceph" >> /mnt/test.txt
root@csi-cephfs-pod1:/# exit
exit
登录 csi-cephfs-pod2,可以查看到文件/mnt/test.txt:
[root@k8s-master01 ceph_test]# kubectl exec -it csi-cephfs-pod2 -- /bin/cat /mnt/test.txt
hello csi-ceph