# 通过StorageClass动态创建SFS Turbo子目录
#### 背景信息
在创建SFS Turbo时有最低容量限制，并非按实际的使用量进行计费。而默认情况下，工作负载在挂载SFS Turbo时将根目录映射至容器，负载实际使用的容量远低于这一限值，易造成资源浪费。
CCE支持一种在SFS Turbo下动态创建子目录的方法，能够在SFS Turbo下动态创建子目录并挂载到容器，这种方法能够共享使用SFS Turbo，从而更加经济合理地利用SFS Turbo存储容量。
目前，只有部分区域支持使用SFS Turbo，具体请以控制台为准。
#### 创建subpath类型SFS Turbo存储卷
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
相比于CCE Standard/Turbo集群，CCE Autopilot集群删除SFS Turbo子目录PVC时不支持对子目录进行归档，即删除SFS Turbo子目录PVC时，若该PVC对应的PV的persistentVolumeReclaimPolicy为Delete，则对应的SFS Turbo子目录会被删除。
1. 创建SFS Turbo资源，选择网络时，请选择与集群相同的VPC与子网。
2. 新建一个StorageClass的YAML文件，例如sfsturbo-subpath-sc.yaml。 
   配置示例：
   ```
   apiVersion: storage.k8s.io/v1
   allowVolumeExpansion: true
   kind: StorageClass
   metadata:
     name: sfsturbo-subpath-sc
   mountOptions:
   - lock
   parameters:
     csi.storage.k8s.io/csi-driver-name: sfsturbo.csi.everest.io
     csi.storage.k8s.io/fstype: nfs
     everest.io/share-access-to: 7ca2dba2-1234-1234-1234-626371a8fb3a
     everest.io/share-expand-type: bandwidth
     everest.io/share-export-location: 192.168.1.1:/sfsturbo/
     everest.io/share-source: sfs-turbo
     everest.io/share-volume-type: STANDARD
     everest.io/volume-as: subpath
     everest.io/volume-id: 0d773f2e-1234-1234-1234-de6a35074696
   provisioner: everest-csi-provisioner
   reclaimPolicy: Delete
   volumeBindingMode: Immediate
   ```
   其中：
   - name：storageclass的名称。
   
   - mountOptions：选填字段；mount挂载参数。
     默认使用如下所示配置，具体请参见[设置挂载参数](https://support.huaweicloud.com/usermanual-cce/cce_10_0626.html)。**此处** **不能** **配置为nolock=true，会导致挂载失败。**
     ```
     mountOptions:
     - vers=3
     - timeo=600
     - nolock
     - hard
     ```
     
   
   - everest.io/volume-as：该参数需设置为"subpath"来使用subpath模式。
   
   - everest.io/share-access-to：选填字段。subpath模式下，填写SFS Turbo资源的所在VPC的ID。
   
   - everest.io/share-expand-type：选填字段。若SFS Turbo资源存储类型为增强版（标准型增强版、性能型增强版），设置为bandwidth。
   
   - everest.io/share-export-location：挂载目录配置。由SFS Turbo共享路径和子目录组成，共享路径可至SFS Turbo服务页面查询，子路径由用户自定义，后续指定该StorageClass创建的PVC均位于该子目录下。
   
   - everest.io/share-volume-type：选填字段。填写SFS Turbo的类型。标准型为STANDARD，性能型为PERFORMANCE。对于增强型需配合"everest.io/share-expand-type"字段使用，everest.io/share-expand-type设置为"bandwidth"。
   
   - everest.io/zone：选填字段。指定SFS Turbo资源所在的可用区。
   
   - everest.io/volume-id：SFS Turbo资源的卷ID，可至SFS Turbo界面查询。
   
   
   
   

3. 执行**kubectl create -f sfsturbo-subpath-sc.yaml**。
4. 新建一个PVC的YAML文件，sfs-turbo-test.yaml。 
   配置示例：
   ```
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
     name: sfs-turbo-test
     namespace: default
   spec:
     accessModes:
     - ReadWriteMany
     resources:
       requests:
         storage: 50Gi
     storageClassName: sfsturbo-subpath-sc
     volumeMode: Filesystem
   ```
   其中：
   - name: PVC的名称。
   
   - storageClassName：SC的名称。
   
   - storage：subpath模式下，该参数无实际意义，容量受限于SFS Turbo资源的总容量，若SFS Turbo资源总容量不足，请及时到SFS Turbo界面扩容。
   
   
   
   

5. 执行**kubectl create -f sfs-turbo-test.yaml**。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
对subpath类型的SFS Turbo扩容时，没有实际的扩容意义。该操作不会对SFS Turbo资源进行实际的扩容，需要用户自行保证SFS Turbo的总容量不被耗尽。
#### 创建Deployment挂载已有数据卷
1. 新建一个Deployment的YAML文件，例如deployment-test.yaml。 
   配置示例：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: test-turbo-subpath-example
     namespace: default
     generation: 1
     labels:
       appgroup: ''
   spec: 
     replicas: 1 
     selector: 
       matchLabels: 
         app: test-turbo-subpath-example 
     template: 
       metadata: 
         labels: 
           app: test-turbo-subpath-example 
       spec: 
         containers: 
         - image: nginx:latest 
           name: container-0 
           volumeMounts: 
           - mountPath: /tmp
             name: pvc-sfs-turbo-example 
         restartPolicy: Always 
         imagePullSecrets:
         - name: default-secret
         volumes: 
         - name: pvc-sfs-turbo-example 
           persistentVolumeClaim: 
             claimName: sfs-turbo-test
   ```
   其中：
   - name：创建的工作负载名称。
   
   - image：工作负载的镜像。
   
   - mountPath：容器内挂载路径，示例中挂载到"/tmp"路径。
   
   - claimName：已有的PVC名称。
   
   
   
   

2. 创建Deployment负载。 
   **kubectl create -f deployment-test.yaml**
   
   
 
#### StatefulSet动态创建subpath模式的数据卷
1. 新建一个StatefulSet的YAML文件，例如statefulset-test.yaml。 
   配置示例：
   ```
   apiVersion: apps/v1
   kind: StatefulSet
   metadata:
     name: test-turbo-subpath
     namespace: default
     generation: 1
     labels:
       appgroup: ''
   spec:
     replicas: 2
     selector:
       matchLabels:
         app: test-turbo-subpath
     template:
       metadata:
         labels:
           app: test-turbo-subpath
         annotations:
           metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]'
           pod.alpha.kubernetes.io/initialized: 'true'
       spec:
         containers:
           - name: container-0
             image: 'nginx:latest'
             resources: {}
             volumeMounts:
               - name: sfs-turbo-160024548582479676
                 mountPath: /tmp
             terminationMessagePath: /dev/termination-log
             terminationMessagePolicy: File
             imagePullPolicy: IfNotPresent
         restartPolicy: Always
         terminationGracePeriodSeconds: 30
         dnsPolicy: ClusterFirst
         securityContext: {}
         imagePullSecrets:
           - name: default-secret
         affinity: {}
         schedulerName: default-scheduler
     volumeClaimTemplates:
       - metadata:
           name: sfs-turbo-160024548582479676
           namespace: default
           annotations: {}
         spec:
           accessModes:
             - ReadWriteOnce
           resources:
             requests:
               storage: 10Gi
           storageClassName: sfsturbo-subpath-sc
     serviceName: wwww
     podManagementPolicy: OrderedReady
     updateStrategy:
       type: RollingUpdate
     revisionHistoryLimit: 10
   ```
   其中：
   - name：创建的工作负载名称。
   
   - image：工作负载的镜像。
   
   - mountPath：容器内挂载路径，示例中挂载到"/tmp"路径。
   
   - "spec.template.spec.containers.volumeMounts.name "和 "spec.volumeClaimTemplates.metadata.name"有映射关系，必须保持一致。
   
   - storageClassName: 填写自建的SC名称。
   
   
   
   

2. 创建StatefulSet负载。 
   **kubectl create -f statefulset-test.yaml**
   
   
 
