# 设置对象存储挂载参数
本章节主要介绍如何设置对象存储的挂载参数。您可以在PV中设置挂载参数，然后通过PVC绑定PV，也可以在StorageClass中设置挂载参数，然后使用StorageClass创建PVC，动态创建出的PV会默认带有StorageClass中设置的挂载参数。
#### 前提条件
[CCE容器存储（Everest）](https://support.huaweicloud.com/usermanual-cce/cce_10_0066.html)版本要求**1.2.8及以上**版本。插件主要负责将挂载参数识别并传递给底层存储，指定参数是否有效依赖于底层存储是否支持。
#### 约束与限制
挂载参数暂不支持安全容器。
 #### 对象存储挂载参数
CCE的存储插件everest在挂载对象存储时默认设置了[表1]和[表2]的参数，其中[表1]中的参数不可取消。
 表1默认使用且不可取消的挂载参数 
| 参数                  | 支持的对象存储类型                                 | 参数值  | 描述                                                                                                               |
|:---|:---|:---|:---|
| use_ino              | 并行文件系统                                     | 无需填写 | 使用该选项，由obsfs分配inode编号。读写模式下自动开启。                                                                                  |
| big_writes             | 并行文件系统 对象桶  | 无需填写 | 配置后可更改写缓存最大值大小。                                                                                                    |
| nonempty             | 并行文件系统 对象桶    | 无需填写  | 允许挂载目录非空。                                                                                                          |
| allow_other        | 并行文件系统 对象桶  | 无需填写 | 允许其他用户访问挂载目录。                                                                                                     |
| no_check_certificate | 并行文件系统 对象桶 | 无需填写 | 不校验服务端证书。                                                                                                        |
| enable_noobj_cache | 对象桶                                       | 无需填写  | 为不存在的对象启用缓存条目，可提高性能。对象桶读写模式下自动使用。 **从everest 1.2.40版本开始不再默认设置enable_noobj_cache参数。** |
| sigv2                 | 对象桶                                        | 无需填写 | 签名版本。对象桶自动使用。                                                                                                      |
| compat_dir            | 对象桶                                       | 无需填写   | 使用1.92版本的s3fs时自动添加该参数。支持显示桶内的多级目录对象。                                                                                |
   
 表2默认使用且可修改的挂载参数 
| 参数                 | 支持的对象存储类型                                | 参数值     | 描述                                                                                                               |
|:---|:---|:---|:---|
| max_write            | 并行文件系统 对象桶 | 131072 | 仅配置big_writes的情况下才生效，推荐使用128KB。                                                                                    |
| multipart_size    | 对象桶                                       | 20      | 以多段上传模式上传文件时，段的大小，会影响能够上传的文件大小，单位为MB。                                                                             |
| ssl_verify_hostname | 并行文件系统 对象桶 | 0      | 不根据主机名验证SSL证书。配置为1时则会开启SSL校验，需保证OBS服务端证书为权威ca签发，否则会导致存储卷挂载失败。                                                     |
| max_background     | 并行文件系统 对象桶  | 100   | 可配置后台最大等待请求数。并行文件系统自动使用。                                                                                           |
| umask               | 并行文件系统 对象桶   | 0      | 配置文件权限的掩码。 例如，如果umask值为022，而目录最大权限为777，则设置umask后该目录权限为777 - 022 = 755，即rwxr-xr-x。 |
   
#### 配置挂载参数
您可以通过以下两种方式进行配置：
- [在PV中设置挂载参数]
  在PV中设置挂载参数可以通过mountOptions字段实现，如下所示，mountOptions支持挂载的字段请参见[对象存储挂载参数]。
  1. 使用kubectl连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
  
  2. 在PV中设置挂载参数，示例如下： 
     ```
     apiVersion: v1
     kind: PersistentVolume
     metadata:
       annotations:
         pv.kubernetes.io/provisioned-by: everest-csi-provisioner
         everest.io/reclaim-policy: retain-volume-only      # 可选字段，删除PV，保留底层存储卷
       name: pv-obs       # PV的名称
     spec:
       accessModes:
       - ReadWriteMany    # 访问模式，对象存储必须为ReadWriteMany
       capacity:
         storage: 1Gi     # 存储容量大小，此处仅为校验需要（不能为空和0），设置的大小不起作用
       csi:
         driver: obs.csi.everest.io        # 挂载依赖的存储驱动
         fsType: obsfs                     # 实例类型
         volumeHandle: <your_volume_id>    # 对象存储的名称
         volumeAttributes:
           storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
           everest.io/obs-volume-type: STANDARD
           everest.io/region: <your_region>                        # 对象存储的区域
           everest.io/enterprise-project-id: <your_enterprise_project_id>     # 可选字段，表示对象存储的企业项目ID，仅限于已开通企业项目的企业客户账号使用。如果指定企业项目，则创建PVC时也需要指定相同的企业项目，否则PVC无法绑定PV。
         nodePublishSecretRef:            # 设置对象存储的自定义密钥
           name: <your_secret_name>       # 自定义密钥的名称
           namespace: <your_namespace>    # 自定义密钥的命名空间
       persistentVolumeReclaimPolicy: Retain    # 回收策略
       storageClassName: csi-obs               # 存储类名称
       mountOptions:                            # 挂载参数
       - umask=027
     ```
     
     
  
  3. PV创建后，可以创建PVC关联PV，然后在工作负载的容器中挂载，具体操作步骤请参见[通过静态存储卷使用已有对象存储](https://support.huaweicloud.com/usermanual-cce/cce_10_0379.html)。
  
  4. 验证挂载参数是否生效。 
     本例中将PVC挂载至使用nginx:latest镜像的工作负载，可以登录到运行挂载对象存储卷的Pod所在节点上通过进程详情观察。
     执行以下命令：
     - 对象桶：ps -ef \| grep s3fs
       ```
       root     22142     1  0 Jun03 ?        00:00:00 /usr/bin/s3fs {your_obs_name} /mnt/paas/kubernetes/kubelet/pods/{pod_uid}/volumes/kubernetes.io~csi/{your_pv_name}/mount -o url=https://{endpoint}:443 -o endpoint={region} -o passwd_file=/opt/everest-host-connector/***_obstmpcred/{your_obs_name} -o nonempty -o big_writes -o sigv2 -o allow_other -o no_check_certificate -o ssl_verify_hostname=0 -o umask=027 -o max_write=131072 -o multipart_size=20
       ```
       
     
     - 并行文件系统：ps -ef \| grep obsfs
       ```
       root      1355     1  0 Jun03 ?        00:03:16 /usr/bin/obsfs {your_obs_name} /mnt/paas/kubernetes/kubelet/pods/{pod_uid}/volumes/kubernetes.io~csi/{your_pv_name}/mount -o url=https://{endpoint}:443 -o endpoint={region} -o passwd_file=/opt/everest-host-connector/***_obstmpcred/{your_obs_name} -o allow_other -o nonempty -o big_writes -o use_ino -o no_check_certificate -o ssl_verify_hostname=0 -o max_background=100 -o umask=027 -o max_write=131072
       ```
       
      
     
     
   
- [在StorageClass中设置挂载参数]
  在StorageClass中设置挂载参数同样可以通过mountOptions字段实现，如下所示，mountOptions支持挂载的字段请参见[对象存储挂载参数]。
  1. 使用kubectl连接集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
  
  2. 创建自定义的StorageClass，示例如下： 
     ```
     kind: StorageClass
     apiVersion: storage.k8s.io/v1
     metadata:
       name: csi-obs-mount-option
     provisioner: everest-csi-provisioner
     parameters:
       csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io
       csi.storage.k8s.io/fstype: s3fs
       everest.io/obs-volume-type: STANDARD
     reclaimPolicy: Delete
     volumeBindingMode: Immediate
     mountOptions:                            # 挂载参数
     - umask=027
     ```
     
     
  
  3. StorageClass设置好后，就可以使用这个StorageClass创建PVC，动态创建出的PV会默认带有StorageClass中设置的挂载参数，具体操作步骤请参见[通过动态存储卷使用对象存储](https://support.huaweicloud.com/usermanual-cce/cce_10_0630.html)。
  
  4. 验证挂载参数是否生效。 
     本例中将PVC挂载至使用nginx:latest镜像的工作负载，可以登录到运行挂载对象存储卷的Pod所在节点上通过进程详情观察。
     执行以下命令：
     - 对象桶：ps -ef \| grep s3fs
       ```
       root     22142     1  0 Jun03 ?        00:00:00 /usr/bin/s3fs {your_obs_name} /mnt/paas/kubernetes/kubelet/pods/{pod_uid}/volumes/kubernetes.io~csi/{your_pv_name}/mount -o url=https://{endpoint}:443 -o endpoint={region} -o passwd_file=/opt/everest-host-connector/***_obstmpcred/{your_obs_name} -o nonempty -o big_writes -o sigv2 -o allow_other -o no_check_certificate -o ssl_verify_hostname=0 -o umask=027 -o max_write=131072 -o multipart_size=20
       ```
       
     
     - 并行文件系统：ps -ef \| grep obsfs
       ```
       root      1355     1  0 Jun03 ?        00:03:16 /usr/bin/obsfs {your_obs_name} /mnt/paas/kubernetes/kubelet/pods/{pod_uid}/volumes/kubernetes.io~csi/{your_pv_name}/mount -o url=https://{endpoint}:443 -o endpoint={region} -o passwd_file=/opt/everest-host-connector/***_obstmpcred/{your_obs_name} -o allow_other -o nonempty -o big_writes -o use_ino -o no_check_certificate -o ssl_verify_hostname=0 -o max_background=100 -o umask=027 -o max_write=131072
       ```
       
      
     
     
   
