
# 存储
#### 简介
弹性到CCI的工作负载支持多种华为云存储配置，用于满足客户多样化的存储需求。通过阅读本章用户可以：
- 了解弹性CCI的负载支持的存储类型。
- 了解弹性CCI的负载Hostpath类型的典型场景以及如何使用。
 
#### 约束与限制
调度到CCI的实例的存储类型支持ConfigMap、Secret、EmptyDir、DownwardAPI、Projected、PersistentVolumeClaims几种Volume类型，其中Projected和DownwardAPI类型仅bursting 1.3.25版本及以上支持。
- EmptyDir：不支持子路径。
- PersistentVolumeClaims：只支持SFS、SFS Turbo云存储类型，且只支持使用CSI类型的StorageClass。1.17.10及以下版本的Volcano调度器不支持调度所有云存储类型。
- Projected：如配置了serviceAccountToken类型的source，那么弹性到CCI后挂载的会是对应service-account-token secret中的token，该token为长期有效的token且没有预期受众，即expirationSeconds和audience两项配置不会生效。
 
#### 支持的存储类型
用户在配置负载存储类型时，CCE的console有如下选项。
![](https://support.huaweicloud.com/usermanual-cci/zh-cn_image_0000001771287148.png)
弹性CCI的负载对存储类型的支持情况如下：
| volume类型               | 是否支持 | 特殊场景说明                                                                                                                                                                                                                                                               |
|:---|:---|:---|
| HostPath               | 否    | - CCI是共享集群，不直接开放HostPath能力。  - 1.5.9及以上版本可支持配置path为/etc/localtime的HostPath存储，配置后CCI侧容器中挂载的时区将会与CCE节点的时区一致。   |
| ConfigMap              | 是    | -                                                                                                                                                                                                                                                                    |
| Secret                 | 是    | -                                                                                                                                                                                                                                                                    |
| EmptyDir               | 是    | 挂载EmptyDir不支持子路径。 EmptyDir的sizeLimit需为1Gi的整数倍，且不能大于Pod CPU核数的10倍。                                                                                                                                                                      |
| DownwardAPI            | 是    | -                                                                                                                                                                                                                                                                    |
| Projected              | 是    | 如配置了serviceAccountToken类型的source，弹性到CCI后会挂载对应service-account-token secret中的token，该token为长期有效，且token没有预期受众，即expirationSeconds和audience两项配置不会生效。                                                                                                                       |
| PersistentVolumeClaims | 是    | 只支持SFS、SFS Turbo云存储类型，且只支持使用CSI类型的StorageClass。                                                                                                                                                                                                                      |
   
#### 负载Hostpath配置方式
**操作场景**
在使用CCE或者其他K8s集群时，用户使用HostPath类型存储。但CCI是共享集群，不开放HostPath能力，因此使用HostPath的Pod通过bursting弹到CCI时，会被拦截。如无法改变Pod spec.volumes中配置的HostPath，可通过配置Annotation的形式，允许让使用HostPath的Pod弹性到CCI上，bursting在校验时需要去掉Pod中的HostPath或者将HostPath替换为emptyDir。
**约束与限制**
- EmptyDir的sizeLimit需为1Gi的整数倍，且不能大于Pod CPU核数的10倍。
- LocalDir和flexVolume当前暂不支持。
**操作步骤**
通过在Pod.Annotations中加入注解可以做到hostPath转emptydir。
- 单个hostPath替换为emptyDir配置方式：
  ```
  "coordinator.cci.io/hostpath-replacement": '[{"name":"source-hostpath-volume-3","policyType":"replaceByEmptyDir","emptyDir":{"sizeLimit":"10Gi"}}]'
  ```
  

- 单个hostPath忽略：
  ```
  "coordinator.cci.io/hostpath-replacement": '[{"name":"source-hostpath-volume-1","policyType":"remove"}]'
  ```
  
- 全部HostPath都忽略：
  ```
  "coordinator.cci.io/hostpath-replacement": '[{"name":"*","policyType":"remove"}]'
  ```
  
- 多个HostPath差异化替换策略：
  ```
  "coordinator.cci.io/hostpath-replacement": '[{"name":"source-hostpath-volume-1","policyType":"remove"},{"name":"source-hostpath-volume-3","policyType":"replaceByEmptyDir","emptyDir":{"sizeLimit":"10Gi"}}]'
  ```
  ![](https://support.huaweicloud.com/usermanual-cci/public_sys-resources/note_3.0-zh-cn.png)
  对于path为/etc/localtime的HostPath存储，会被单个HostPath替换的策略（策略name为具体的volume name）替换，不会被全部HostPath替换的策略（策略name为"\*"）替换。
  参考deployment yaml示例：
  ```
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      description: ''
    labels:
      virtual-kubelet.io/burst-to-cci: enforce
      appgroup: ''
      version: v1
    name: test
    namespace: default
  spec:
    replicas: 2
    selector:
      matchLabels:
        app: test
        version: v1
    template:
      metadata:
        labels:
          app: test
          version: v1
        annotations:
          coordinator.cci.io/hostpath-replacement: '[{"name": "test-log2", "policyType": "remove"}, {"name": "test-log", "policyType": "replaceByEmptyDir", "emptyDir":{"sizeLimit":"10Gi"}}, {"name": "test-log1", "policyType": "remove" }]'
      spec:
        containers:
          - name: container-1
            image: nginx
            imagePullPolicy: IfNotPresent
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
              limits:
                cpu: 250m
                memory: 512Mi
            volumeMounts:
              - name: test-log
                mountPath: /tmp/log
              - name: test-log1
                mountPath: /tmp/log1
              - name: test-log2
                mountPath: /tmp/log2
        volumes:
        - hostPath:
            path: /var/paas/sys/log/virtual-kubelet
            type: ""
          name: test-log
        - hostPath:
            path: /var/paas/sys/log
            type: ""
          name: test-log1
        - hostPath:
            path: /var/paas/sys/log2
            type: ""
          name: test-log2
  ```
  
 
