使用文件存储CFS
所有文档
menu

容器引擎 CCE

使用文件存储CFS

产品详情自助选购

容器引擎 CCE 支持通过创建 PV/PVC,并为工作负载挂载数据卷方式使用百度智能云文件存储CFS。本文将介绍如何在集群中动态和静态挂载文件存储。

使用限制

  • 创建的 CFS 实例和挂载点须和集群节点在同一 VPC 内。

前提条件

  1. 创建 CFS 实例,具体操作请参见 创建文件系统
  2. 添加 CFS 挂载点,具体操作请参见 添加挂载点
  3. 获取 CFS 实例挂载地址,具体操作请参见 获取挂载地址

操作步骤

本文以 CFS 挂载点地址为 cfs-test.baidubce.com 为例。

动态 PV/PVC 方式挂载 CFS

方式一:使用 kubectl 命令行操作

1. 创建 StorageClass 和 Provisioner

dynamic-cfs-template.yaml 是一个 yaml 文件模板,包含了需要创建的集群资源信息。

dynamic-cfs-template.yaml 文件内容如下:

  kind: ClusterRole
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: nfs-client-provisioner-runner
  rules:
    - apiGroups: [""]
      resources: ["persistentvolumes"]
      verbs: ["get", "list", "watch", "create", "delete"]
    - apiGroups: [""]
      resources: ["persistentvolumeclaims"]
      verbs: ["get", "list", "watch", "update"]
    - apiGroups: ["storage.k8s.io"]
      resources: ["storageclasses"]
      verbs: ["get", "list", "watch"]
    - apiGroups: [""]
      resources: ["events"]
      verbs: ["create", "update", "patch"]
  ---
  kind: ClusterRoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: run-nfs-client-provisioner
  subjects:
    - kind: ServiceAccount
      name: nfs-client-provisioner
      namespace: kube-system
  roleRef:
    kind: ClusterRole
    name: nfs-client-provisioner-runner
    apiGroup: rbac.authorization.k8s.io
  ---
  kind: Role
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: leader-locking-nfs-client-provisioner
    namespace: kube-system
  rules:
    - apiGroups: [""]
      resources: ["endpoints"]
      verbs: ["get", "list", "watch", "create", "update", "patch"]
  ---
  kind: RoleBinding
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
    name: leader-locking-nfs-client-provisioner
    namespace: kube-system
  subjects:
    - kind: ServiceAccount
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: kube-system
  roleRef:
    kind: Role
    name: leader-locking-nfs-client-provisioner
    apiGroup: rbac.authorization.k8s.io
  ---
  kind: ServiceAccount
  apiVersion: v1
  metadata:
    name: nfs-client-provisioner
    namespace: kube-system
  ---
  kind: PersistentVolume
  apiVersion: v1
  metadata:
    name: pv-cfs
  spec:
    capacity:
      storage: 5Gi
    accessModes:
      - ReadWriteMany
    persistentVolumeReclaimPolicy: Retain
    mountOptions:
      - hard
      - nfsvers=4.1
      - nordirplus
    nfs:
      path: {{NFS_PATH}}
      server: {{NFS_SERVER}}
  ---
  kind: PersistentVolumeClaim
  apiVersion: v1
  metadata:
    name: pvc-cfs
    namespace: kube-system
  spec:
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 5Gi
  ---
  kind: Deployment
  apiVersion: apps/v1
  metadata:
    name: nfs-client-provisioner
    namespace: kube-system
  spec:
    selector:
      matchLabels:
        app: nfs-client-provisioner
    replicas: 1
    strategy:
      type: Recreate
    template:
      metadata:
        labels:
          app: nfs-client-provisioner
      spec:
        serviceAccountName: nfs-client-provisioner
        containers:
          - name: nfs-client-provisioner
            image: registry.baidubce.com/cce-plugin-pro/nfs-client-provisioner:latest
            imagePullPolicy: Always
            volumeMounts:
              - name: nfs-client-root
                mountPath: /persistentvolumes
            env:
              - name: PROVISIONER_NAME
                value: {{PROVISIONER_NAME}}
              - name: NFS_SERVER
                value: {{NFS_SERVER}}
              - name: NFS_PATH
                value: {{NFS_PATH}}
        volumes:
          - name: nfs-client-root
            persistentVolumeClaim:
              claimName: pvc-cfs
  ---
  kind: StorageClass
  apiVersion: storage.k8s.io/v1
  metadata:
    name: {{STORAGE_CLASS_NAME}}
  provisioner: {{PROVISIONER_NAME}}
  parameters:
    archiveOnDelete: "{{ARCHIVE_ON_DELETE}}"
    sharePath: "{{SHARE_PATH}}"
  mountOptions:
    - hard
    - nfsvers=4.1
    - nordirplus

dynamic-cfs-template.yaml 模板文件中可自定义的选项及说明如下:

选项 说明
NFS_SERVER CFS 挂载点地址。
NFS_PATH CFS 远程挂载目录,注意该目录在使用前需要预先存在,如果目录不存在会导致 provisioner 插件启动失败。
SHARE_PATH 不同 PVC 的 CFS 挂载目录是否隔离,true-不隔离,false-隔离。若指定隔离,则会在 CFS 挂载目录下为每个 PVC 创建一个子目录,对应 PVC 使用该子目录作为挂载目录;否则所有 PVC 共享挂载目录。
ARCHIVE_ON_DELETE 删除 PVC 后是否保留对应数据,仅当 PVC 挂载目录隔离时生效,true-保留,false-不保留;PVC 挂载目录共享时,删除 PVC 不会删除任何数据。设置为不保留则直接删除对应 PVC 的子目录,否则仅将原子目录名加上 archive- 前缀后保留。
STORAGE_CLASS_NAME 创建的 StorageClass 名称。
PROVISIONER_NAME Provisioner 名称。

支持 shell 的系统中,可以直接使用下面的 replace.sh 脚本进行 yaml 模板中模板变量的替换操作。

 # !/bin/sh
 # user defined vars

NFS_SERVER="cfs-test.baidubce.com"
NFS_PATH="/cce/shared"
SHARE_PATH="true" # 不同PVC的挂载目录是否隔离,true-不隔离,false-隔离
ARCHIVE_ON_DELETE="false" # 删除PVC是否保留对应数据,仅当PVC挂载目录隔离时生效,true-保留,false-不保留
STORAGE_CLASS_NAME="sharedcfs" # StorageClass名称
PROVISIONER_NAME="baidubce/cfs-provisioner" # provisioner名称

YAML_FILE="./dynamic-cfs-template.yaml"

 # replace template vars in yaml file

sed -i "s#{{SHARE_PATH}}#$SHARE_PATH#" $YAML_FILE
sed -i "s#{{ARCHIVE_ON_DELETE}}#$ARCHIVE_ON_DELETE#" $YAML_FILE
sed -i "s#{{STORAGE_CLASS_NAME}}#$STORAGE_CLASS_NAME#" $YAML_FILE
sed -i "s#{{PROVISIONER_NAME}}#$PROVISIONER_NAME#" $YAML_FILE
sed -i "s#{{NFS_SERVER}}#$NFS_SERVER#" $YAML_FILE
sed -i "s#{{NFS_PATH}}#$NFS_PATH#" $YAML_FILE
  1. 将脚本中前半段中的 shell 变量替换为期望值,将 replace.sh 脚本和 dynamic-cfs-template.yaml 文件放置在同一个目录下,执行 sh replace.sh 即可。
  2. 或者采用其他方式,将模板 yaml 文件中的模板变量替换为期望值。
  3. 最后,使用 kubectl 工具,执行 kubectl create -f dynamic-cfs-template.yaml 完成 StorageClass 和 Provisioner 的创建。

    $ kubectl create -f dynamic-cfs-template.yaml
    clusterrole "nfs-client-provisioner-runner" created
    clusterrolebinding "run-nfs-client-provisioner" created
    role "leader-locking-nfs-client-provisioner" created
    rolebinding "leader-locking-nfs-client-provisioner" created
    serviceaccount "nfs-client-provisioner" created
    persistentvolume "pv-cfs" created
    persistentvolumeclaim "pvc-cfs" created
    deployment "nfs-client-provisioner" created
    storageclass "sharedcfs" created
    $ kubectl get pod --namespace kube-system  | grep provisioner
    nfs-client-provisioner-c94494f6d-dlxmj   1/1       Running   0          26s

如果相应的 Pod 进入 Running 状态,则动态绑定 PV 所需的资源已经建立成功。

2. 创建 PVC 时动态生成 PV 并绑定
  • 在 PVC Spec 中指定上面创建的 StorageClass 名称,则在创建 PVC 时,会自动调用相应 StorageClass 绑定的 Provisioner 生成相应的 PV 进行绑定。
  • 使用 kubectl,执行 kubectl create -f dynamic-pvc-cfs.yaml 完成 PVC 的创建。
  • 假设创建的 StorageClass 名称为 sharedcfs,对应的 dynamic-pvc-cfs.yaml 文件如下所示:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: dynamic-pvc-cfs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: sharedcfs
      resources:
        requests:
          storage: 5Gi
  • 创建 PVC 后,可以看见相应的 PV 自动创建,PVC 状态变为 Bound,即 PVC 已经与新创建的 PV 绑定。

    $ kubectl create -f dynamic-pvc-cfs.yaml
    persistentvolumeclaim "dynamic-pvc-cfs" created
    $ kubectl get pvc
    NAME              STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    dynamic-pvc-cfs   Bound     pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            sharedcfs      4s
    $ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                     STORAGECLASS   REASON    AGE
    pv-cfs                                     5Gi        RWX            Retain           Bound     kube-system/pvc-cfs                                21m
    pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            Delete           Bound     default/dynamic-pvc-cfs   sharedcfs                7s
3. 在 Pod 内挂载 PVC
  • 在 Pod spec 内指定相应的 PVC 名称即可,使用 kubectl,执行 kubectl create -f dynamic-cfs-pod.yaml 完成资源的创建。
  • 对应的 dynamic-cfs-pod.yaml 文件如下所示:

    kind: Pod
    apiVersion: v1
    metadata:
      name: test-pvc-pod
      labels:
        app: test-pvc-pod
    spec:
      containers:
      - name: test-pvc-pod
        image: nginx
        volumeMounts:
          - name: cfs-pvc
            mountPath: "/cfs-volume"
      volumes:
        - name: cfs-pvc
          persistentVolumeClaim:
            claimName: dynamic-pvc-cfs

Pod 创建后,可以读写容器内的 /cfs-volume 路径来访问相应的 CFS 存储上的内容。

4. 释放 PVC 时动态销毁绑定 PV

删除 PVC 时,与之绑定的动态 PV 会被一同删除,其中的数据则根据用户定义的 SHARE_PATHARCHIVE_ON_DELETE 选项进行相应的保留或删除处理。

$ kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
dynamic-pvc-cfs   Bound     pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            sharedcfs      9m
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                     STORAGECLASS   REASON    AGE
pv-cfs                                     5Gi        RWX            Retain           Bound     kube-system/pvc-cfs                                31m
pvc-6dbf3265-bbe0-11e8-bc54-fa163e08135d   5Gi        RWX            Delete           Bound     default/dynamic-pvc-cfs   sharedcfs                9m
$ kubectl delete -f dynamic-pvc-cfs.yaml
persistentvolumeclaim "dynamic-pvc-cfs" deleted
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                 STORAGECLASS   REASON    AGE
pv-cfs    5Gi        RWX            Retain           Bound     kube-system/pvc-cfs                            31m
$ kubectl get pvc
No resources found.

方式二:通过控制台操作

  1. 登陆 CCE 控制台,单击集群名称进入集群详情页。
  2. 创建Provisioner。

    a. 在左侧导航栏中选择工作负载 > 自定义资源,进入自定义资源管理页面。

    b. 点击页面上方YAML创建资源按钮,在弹框中分别创建以下资源。

    image.png

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: kube-system
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      namespace: kube-system
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: kube-system
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      namespace: kube-system
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv-cfs
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      mountOptions:
        - hard
        - nfsvers=4.1
        - nordirplus
      nfs:
        path: {{NFS_PATH}}
        server: {{NFS_SERVER}}
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-cfs
      namespace: kube-system
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: nfs-client-provisioner
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          app: nfs-client-provisioner
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: registry.baidubce.com/cce-plugin-pro/nfs-client-provisioner:latest
              imagePullPolicy: Always
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: {{PROVISIONER_NAME}} # 指定 Provisioner 名称
                - name: NFS_SERVER
                  value: {{NFS_SERVER}} # 指定 CFS 挂载点地址
                - name: NFS_PATH
                  value: {{NFS_PATH}} # 指定 CFS 远程挂载目录,注意该目录在使用前需要预先存在,如果目录不存在会导致 provisioner 插件启动失败
          volumes:
            - name: nfs-client-root
              persistentVolumeClaim:
                claimName: pvc-cfs
  3. 创建存储类 StorageClass。

    a. 在左侧导航栏中选择存储配置 > 存储类,进入存储类列表页面。

    b. 点击存储类列表上方新建存储类按钮,在文件模版中输入以下 yaml 内容。

    image.png

       kind: StorageClass
       apiVersion: storage.k8s.io/v1
       metadata:
         name: {{STORAGE_CLASS_NAME}} # 指定 StorageClass 名称
       provisioner: {{PROVISIONER_NAME}} # 指定创建的 Provisioner 名称
       parameters:
         archiveOnDelete: "{{ARCHIVE_ON_DELETE}}" # 删除 PVC 后是否保留对应数据,仅当 PVC 挂载目录隔离时生效,true-保留,false-不保留;PVC 挂载目录共享时,删除 PVC 不会删除任何数据。设置为不保留则直接删除对应 PVC 的子目录,否则仅将原子目录名加上 archive- 前缀后保留。
         sharePath: "{{SHARE_PATH}}" # 不同 PVC 的 CFS 挂载目录是否隔离,true-不隔离,false-隔离。若指定隔离,则会在 CFS 挂载目录下为每个 PVC 创建一个子目录,对应 PVC 使用该子目录作为挂载目录;否则所有 PVC 共享挂载目录。
       mountOptions:
         - hard
         - nfsvers=4.1
         - nordirplus

    c. 点击确定,将为您创建存储类。

  4. 创建持久卷声明 PVC 后动态生成 PV 并绑定。

    a. 在左侧导航栏选择存储配置 > 持久卷声明,进入持久卷声明列表。

    b. 点击持久卷声明列表上方新建持久卷声明按钮,选择表单创建Yaml 创建

    c. 若选择表单创建则需填写相关参数,其中三种访问模式详情参见存储管理概述,点击确定后在确认配置弹窗中输入 storageClassName 的值,即存储类的名称。确认配置无误后点击确定

    image.png

    image.png

    d. 若选择YAML创建,在文件模版中输入以下 yaml 内容。

       kind: PersistentVolumeClaim
       apiVersion: v1
       metadata:
         name: pvc-cfs
         namespace: kube-system
       spec:
         accessModes:
           - ReadWriteMany
         storageClassName:  {{STORAGE_CLASS_NAME}} # 指定创建的 StorageClass 名称
         resources:
           requests:
             storage: 5Gi

    e. 创建 PVC 后,在持久卷声明列表 > 持久卷列可以看见相应的 PV 自动创建,PVC 状态列显示为 Bound,即 PVC 已经与新创建的 PV 绑定。

    image.png

  5. 创建应用并挂载 PVC,在 Pod spec 内指定相应的 PVC 名称即可。Pod 创建后,可以读写容器内的 /cfs-volume 路径来访问相应的 CFS 存储上的内容。

静态 PV/PVC 方式挂载 CFS

方式一:通过 kubectl 命令行操作

1. 在集群中创建 PV 和 PVC 资源
  • 使用kubectl,执行 kubectl create -f pv-cfs.yaml 完成 PV 的创建
  • 对应的 pv-cfs.yaml 文件如下所示:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv-cfs
    spec:
      capacity:
        storage: 8Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      mountOptions:
        - hard
        - nfsvers=4.1
        - nordirplus
      nfs:
        path: /
        server: cfs-test.baidubce.com

    注意:

    • yaml 中 server 字段对应的是 CFS 挂载点地址。
    • yaml 中 path 字段对应的是 CFS 挂载目录,该目录需要在挂载前预先存在。

创建 PV 后,输入kubectl get pv 可以看见一个 available 状态的 PV,如下所示:

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Available                                      3s

建立一个能够与该 PV 绑定的 PVC

使用 kubectl,执行 kubectl create -f pvc-cfs.yaml 完成 PVC 的创建

对应的 pvc-cfs.yaml 文件如下所示:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-cfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi

绑定前,PVC 为 pending 状态

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-cfs   Pending                                                      2s                                                  2s

绑定后,PV 和 PVC 状态变为 Bound

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM             STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Bound     default/pvc-cfs                            36s
$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-cfs   Bound     pv-cfs    8Gi        RWX                           1m

有关 PV 和 PVC 的更多设置和字段说明,参见k8s官方文档

2. 在 Pod 内挂载 PVC

在 Pod spec 内指定相应的 PVC 名称即可,使用 kubectl,执行 kubectl create -f demo-cfs-pod.yaml 完成 Pod 的创建

对应的 demo-cfs-pod.yaml 文件如下所示:

kind: Pod
apiVersion: v1
metadata:
  name: demo-cfs-pod
  labels:
    app: demo-cfs-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
      - name: cfs-pvc
        mountPath: "/cfs-volume"
  volumes:
    - name: cfs-pvc
      persistentVolumeClaim:
        claimName: pvc-cfs

Pod 创建后,可以读写容器内的 /cfs-volume 路径来访问相应的 CFS 存储上的内容。

由于创建 PV 和 PVC 时指定了 accessModesReadWriteMany,该 PVC 可以被多节点上的 Pod 挂载读写。

3. 释放 PV 和 PVC 资源

完成存储资源的使用后,可以释放 PVC 和 PV 资源。在释放 PVC 和 PV 之前,需要先删除挂载了对应 PVC 的所有 Pod。

使用以下命令可以释放 PVC

$ kubectl delete -f  pvc-cfs.yaml

释放 PVC 后,原来与之绑定的 PV 状态会变为 Release,如下所示:

NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM             STORAGECLASS   REASON    AGE
pv-cfs    8Gi        RWX            Retain           Released   default/pvc-cfs                            16m

输入以下指令释放 PV 资源

$ kubectl delete -f  pv-cfs.yaml

方式二:通过控制台操作

  1. 登陆 CCE 控制台,单击集群名称进入集群详情页。
  2. 创建持久卷 PV。

    a. 在左侧导航栏选择存储配置 > 持久卷,进入持久卷列表。

    b. 点击持久卷列表上方新建持久卷按钮,选择表单创建或 Yaml 创建。

    c. 若选择表单创建则需填写相关参数,根据需求设置存储容量,存储类型选择文件存储 CFS。挂载点地址可参见获取挂载地址。点击确定在二次弹窗中确认配置后点击确定创建 PV。

    image.png

    image.png

  3. 创建可以和持久卷 PV 绑定的持久卷声明 PVC。

    a. 在左侧导航栏选择存储配置 > 持久卷声明,进入持久卷声明列表。

    b. 点击持久卷列表上方新建持久卷声明按钮,选择表单创建或 Yaml 创建。

    c. 根据之前创建的 PV 配置 PVC 的存储容量、访问模式、存储类(可选),点击确定创建 PVC。会查找现有的 PV 资源,寻找与 PVC 请求相匹配的 PV。

    d. 绑定后,可以分别在持久卷列表和持久卷声明列表中看见 PV 和 PVC 的状态列变为 Bound。

  4. 创建应用并挂载 PVC,在 Pod spec 内指定相应的 PVC 名称即可。
上一篇
使用云盘CDS
下一篇
使用对象存储BOS