共享文件系统一般用于多个 Pod 共享一个存储。
一、先决条件¶
- 有一个 Rook 集群
- 在 Rook 可以配置存储之前,需要创建StorageClass
- 每个 OSD 必须位于不同的节点上,因为 被failureDomain设置为
host且 被replicated.size设置为3
二、创建共享文件系统¶
通过在 CRD 中指定元数据池、数据池和元数据服务器的所需设置来创建文件系统CephFilesystem,这里创建具有三个复制的元数据池和具有三个复制的单个数据池。
1.创建文件系统
$ cd /root/rook/deploy/examples
$ kubectl create -f filesystem.yaml
2.查看创建情况,观察到已经成功创建
[root@k8s-master01 examples]# kubectl get po -n rook-ceph | grep rook-ceph-mds
rook-ceph-mds-myfs-a-8d97b844c-bbdhq 2/2 Running 0 2m45s
rook-ceph-mds-myfs-b-8599b4fd96-mmrgh 2/2 Running 0 2m44s
3.查看文件系统的详细状态,观察到ceph status该服务将显示一条新行mds
[root@k8s-master01 examples]# kubectl exec -it rook-ceph-tools-6b465bd77-jrj84 -n rook-ceph -- bash
bash-4.4$ ceph status
cluster:
id: 1fb7e7e8-4cae-4fc9-9ca1-274e75a14c51
health: HEALTH_OK
services:
mon: 3 daemons, quorum b,a,c (age 31h)
mgr: b(active, since 79m)
mds: 1/1 daemons up, 1 hot standby
osd: 3 osds: 3 up (since 31h), 3 in (since 31h)
data:
volumes: 1/1 healthy
pools: 3 pools, 49 pgs
objects: 24 objects, 451 KiB
usage: 150 MiB used, 120 GiB / 120 GiB avail
pgs: 49 active+clean
io:
client: 852 B/s rd, 1 op/s rd, 0 op/s wr
5.登录Ceph界面进行查看,其中myfs-replicated用于存储数据,myfs-metadata代表元数据

三、创建StorageClass¶
1.根据自己需要修改storageclass.yaml(下面的文件是去掉注释进行展示)
$ cd /root/rook/deploy/examples/csi/cephfs
$ vim storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
clusterID: rook-ceph # namespace:cluster
fsName: myfs
pool: myfs-replicated
csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph # namespace:cluster
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph # namespace:cluster
csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph # namespace:cluster
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
上面参数说明:
- apiVersion: 定义了使用的 Kubernetes API 版本,这里是
storage.k8s.io/v1。 - kind: 定义了资源类型,这里是
StorageClass,表示创建一个存储类。 - metadata: 元数据部分包含关于资源的信息,这里设置了存储类的名称为
rook-cephfs。 - provisioner: 指定用于创建和管理卷的 CSI(Container Storage Interface)插件的提供者,这里使用 Rook-Ceph RBD CSI 插件来创建和管理与该 StorageClass 关联的持久卷。
- parameters: 参数部分包含了存储类的配置参数。
- clusterID: 指定 Rook Ceph 集群的名称,这里设置为
rook-ceph。 - fsName: 指定 Rook CephFS 文件系统的名称,这里设置为
myfs。 - pool: 指定 Rook CephFS 文件系统所使用的存储池的名称,这里设置为
myfs-replicated。 - csi.storage.k8s.io/provisioner-secret-name: 指定用于 CSI 驱动程序的凭据的名称,这里设置为
rook-csi-cephfs-provisioner。 - csi.storage.k8s.io/provisioner-secret-namespace: 指定 CSI 驱动程序凭据所在的命名空间,这里设置为
rook-ceph。 - csi.storage.k8s.io/controller-expand-secret-name: 指定用于 CSI 控制器扩展的凭据的名称,这里设置为
rook-csi-cephfs-provisioner。 - csi.storage.k8s.io/controller-expand-secret-namespace: 指定 CSI 控制器扩展凭据所在的命名空间,这里设置为
rook-ceph。 - csi.storage.k8s.io/node-stage-secret-name: 指定用于 CSI 节点阶段的凭据的名称,这里设置为
rook-csi-cephfs-node。 - csi.storage.k8s.io/node-stage-secret-namespace: 指定 CSI 节点阶段凭据所在的命名空间,这里设置为
rook-ceph。 - reclaimPolicy: 定义了 PVC 删除后对应 PV 的回收策略,这里设置为
Delete,表示删除 PVC 时同时删除对应的 PV。 - allowVolumeExpansion: 定义了是否允许对卷进行扩展,这里设置为
true,表示允许扩展。 - mountOptions: 定义了挂载选项,这里没有具体指定。挂载选项可以用于自定义挂载卷时的行为,例如设置文件系统类型、读写权限等。
说明:我这里没有做修改,可以根据自己的需求进行修改
如果已将 Rook 运算符部署在“rook-ceph”以外的命名空间中,需要更改配置程序中的前缀以匹配目前使用的命名空间。例如,如果 Rook 操作符在名称空间“my-namespace”中运行,则配置程序值应为“my-namespace.rbd.csi.ceph.com”。
provisioner: my-namespace.rbd.csi.ceph.com
2.创建StorageClass
$ cd /root/rook/deploy/examples/csi/cephfs
$ k create -f storageclass.yaml
3.查看创建的 storageClass
[root@k8s-master01 cephfs]# k get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-cephfs rook-ceph.cephfs.csi.ceph.com Delete Immediate true 9m21s
四、挂载测试¶
下面使用nginx进行挂载测试:
1.定义一个名为nginx.yaml的yaml
$ vim nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
selector:
app: nginx
type: ClusterIP
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-share-pvc
spec:
storageClassName: rook-cephfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
containers:
- name: nginx
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: nginx-share-pvc
2.创建yaml
$ k create -f nginx.yaml
3.查看pod、service及pvc创建情况,观察到已成功创建
[root@k8s-master01 ~]# k get po -l app=nginx
NAME READY STATUS RESTARTS AGE
web-679855cc-5jmxf 1/1 Running 0 3m14s
web-679855cc-bl6kr 1/1 Running 0 3m14s
web-679855cc-z24rx 1/1 Running 0 3m14s
[root@k8s-master01 ~]# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nginx-share-pvc Bound pvc-b94bb9f8-f7e4-48cd-82be-db9dee6c451d 1Gi RWX rook-cephfs 7m32s
[root@k8s-master01 ~]# k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 106d
nginx ClusterIP 10.0.91.106 <none> 80/TCP 8m3s
4.先进入一个容器填充内容到/usr/share/nginx/html文件夹下的index.html文件,再到另一个容器验证共享
[root@k8s-master01 ~]# k exec -it web-679855cc-5jmxf -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # echo "hello" > index.html
/usr/share/nginx/html # exit
You have new mail in /var/spool/mail/root
[root@k8s-master01 ~]# k exec web-679855cc-bl6kr -- cat /usr/share/nginx/html/index.html
hello
[root@k8s-master01 ~]# curl 10.0.91.106
hello
五、配置清除¶
下面清除上面演示配置
$ kubectl delete -f nginx.yaml
$ kubectl -n rook-ceph delete cephfilesystem myfs