
# 使用PersistentVolumeClaim申请持久化存储
云容器实例当前支持在容器中使用如下三种持久化存储。
- [云硬盘](https://www.huaweicloud.com/product/evs.html)（Elastic Volume Service，EVS），EVS是一种块存储服务，提供高I/O（sas）、超高I/O（ssd）和普通I/O（上一代产品）三种类型云硬盘。
- [弹性文件服务](https://www.huaweicloud.com/product/sfs.html)（Scalable File Service，SFS），SFS提供共享的文件存储，支持标准文件协议类型（nfs-rw）。SFS提供了SFS、SFS3.0和SFS Turbo三种类型的文件系统。
  - SFS、SFS3.0为用户提供一个完全托管的共享文件存储，能够弹性伸缩至PB规模，具备高可用性和持久性，为海量数据、高带宽型应用提供有力支持。适用于多种应用场景，包括HPC、媒体处理、文件共享、内容管理和Web服务等。
    ![](https://support.huaweicloud.com/devg-cci/public_sys-resources/note_3.0-zh-cn.png)
    如需在VPC中访问SFS 3.0容量型，请先在VPC中购买SFS 3.0容量型的VPC终端节点，可参考[配置VPC终端节点](https://support.huaweicloud.com/usermanual-sfs/sfs_01_0134.html)。如果已经购买了VPC终端节点，则不需要购买。
    
  
  - SFS Turbo为用户提供一个完全托管的共享文件存储，能够弹性伸缩至320TB规模，具备高可用性和持久性，为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景，包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。
   
- [对象存储服务](https://www.huaweicloud.com/product/obs.html)（Object Storage Service，OBS），OBS是一个基于对象的海量存储服务，为用户提供海量、安全、高可靠、低成本的数据存储能力。
上面三种存储中，OBS的使用方式最为直接，云容器实例当前支持直接以SDK方式使用对象存储服务（OBS）。您可以在应用程序中使用SDK方式使用OBS，将应用程序打包成容器镜像，在云容器实例中使用镜像创建负载。OBS的SDK的下载及使用方法请参见<https://sdkcenter.developer.huaweicloud.com/?product=OBS>。
EVS和SFS的使用有个挂载的过程，下面将介绍如何使用EVS和SFS。
#### PersistentVolumeClaim（PVC）
Kubernetes提供PVC专门用于持久化存储的申请，PVC可以让您无需关心底层存储资源如何创建、释放等动作，而只需要申明您需要何种类型的存储资源、多大的存储空间。
在实际使用中，您可以通过Pod中的Volume来关联PVC，通过PVC使用持久化存储，如[图1]所示。
图1使用持久化存储   
![](https://support.huaweicloud.com/devg-cci/zh-cn_image_0198271389.png "点击放大")
#### 创建PVC
- 通过如下定义创建PVC，这个定义申请了一块大小为100G的SAS型云硬盘。
  如果需要创建加密类型的云硬盘存储卷，在metadata.annotations中增加paas.storage.io/cryptKeyId字段即可。
  ```
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: pvc-evs
    namespace: namespaces-test
    annotations: {
    paas.storage.io/cryptKeyId: ee9b610c-e356-11e9-aadc-d0efc1b3bb6b
    }
  spec:
    accessModes:                  
    - ReadWriteMany
    resources:  
      requests:
        storage: 100Gi
    storageClassName: sas
  ```
  accessModes为存储访问模式，支持如下3种模式：
  - ReadWriteOnce：可以被单个节点以读/写模式挂载
  
  - ReadOnlyMany：可以被多个节点以只读模式挂载
  
  - ReadWriteMany：可以被多个节点以读/写模式挂载
   
  storageClassName表示申请的存储类型，当前支持如下4个参数：
  - sas：SAS（高I/O）型EVS硬盘
  
  - ssd：SSD（超高I/O）型EVS硬盘
  
  - nfs-rw：标准文件协议类型SFS文件存储
  
  - csi-sfs：SFS 3.0容量型弹性文件服务
   
- 通过如下定义创建PVC，这个定义申请了一块大小为100G的文件存储。 如果需要创建加密类型的文件存储卷，在metadata.annotations中增加paas.storage.io/cryptKeyId、paas.storage.io/cryptAlias和paas.storage.io/cryptDomainId即可。
  ```
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: pvc-sfs
    namespace: namespace-test
    annotations: {
    paas.storage.io/cryptKeyId: ee9b610c-e356-11e9-aadc-d0efc1b3bb6b
    paas.storage.io/cryptAlias: sfs/default
    paas.storage.io/cryptDomainId: d6912480-c3d6-4e9e-8c70-38afeea434c3
    volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxinfs
    }
  spec:
    accessModes:                  
    - ReadWriteMany
    resources:  
      requests:
        storage: 100Gi
    storageClassName: nfs-rw
  ```
  
 
#### 使用PVC
使用PVC申请到存储资源后，您可以在Pod中使用Volume来关联PVC，并将Volume挂载到容器中使用。
下面是的示例中说明了PVC如何在Pod中使用，这个Pod定义了一个名为"pvc-test-example"的Volume，并将这个Volume挂载到容器的"/tmp/volume0"路径，这样您写入到/tmp的数据就是写到名为pvc-test的PVC中。
- 写入上面申请的sas型云硬盘中
  ```
  apiVersion: v1
  kind: Pod
  metadata:
    name: nginx
    labels:
      app: nginx
  spec:
    containers:
    - image: nginx:latest
      name: container-0
      resources:
        limits:
          cpu: 500m
          memory: 1024Mi
        requests:
          cpu: 500m
          memory: 1024Mi
      volumeMounts:                 
      - mountPath: "/tmp/volume0"   # 将PVC挂载到容器的/tmp/volume0路径
        name: pvc-test-example      # Volume的名称
    volumes:                        # 定义Volume，关联PVC
    - name: pvc-test-example
      persistentVolumeClaim:
        claimName: pvc-test         # PVC的名称
    imagePullSecrets:
    - name: imagepull-secret
  ```
  

- 写入上面申请的文件存储（storageClassName设置为nfs-rw型）中。
  当创建PVC申请文件存储（storageClassName设置为nfs-rw型）时，在volumeMounts中可设置挂载子路径，即文件存储根路径下子路径。
  ```
  apiVersion: v1
  kind: Pod
  metadata:
    name: nginx
    labels:
      app: nginx
  spec:
    containers:
    - image: nginx:latest
      name: container-0
      resources:
        limits:
          cpu: 500m
          memory: 1024Mi
        requests:
          cpu: 500m
          memory: 1024Mi
      volumeMounts:                 
      - mountPath: "/tmp/volume0"   # 将PVC挂载到容器的/tmp/volume0路径
        subPath: "abc"              # 文件存储根路径下子路径，如果不存在会自动在文件存储中创建。该子路径必须为相对路径。
        name: pvc-test-example      # Volume的名称
    volumes:                        # 定义Volume，关联PVC
    - name: pvc-test-example
      persistentVolumeClaim:
        claimName: pvc-test         # PVC的名称
    imagePullSecrets:
    - name: imagepull-secret
  ```
  
 
