共享文件系统一般用于多个 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代表元数据

使用共享文件系统-1

三、创建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