如果应用需要存储图片、音视频等非结构化数据,可以使用OSS作为持久化存储卷。本文介绍如何为应用挂载OSS静态存储卷,并验证OSS的共享存储和持久化存储。
背景信息
OSS是一个海量、安全、低成本、高可靠的存储空间,适合存储写入后较少修改的数据,以及非结构化数据(如图片、音视频等)。更多信息,请参见存储概述。
ACS仅支持OSS静态存储卷,暂不支持OSS动态存储卷。
前提条件
ACS集群中已安装csi-provisioner组件。
您可以在ACS集群管理页的左侧导航栏单击组件管理,然后在存储页签下确认csi-provisioner组件的安装情况。
注意事项
- OSS为共享存储,一个OSS存储卷可以挂载到多个Pod上。 
- 挂载目录中建议存放的文件数不要超过1000个。 - 通过ossfs进行 - ls等操作时,将发起HTTP请求到OSS获取文件的Meta信息,如果- ls的目标目录下文件较多,ossfs将消耗大量系统内存,可能会导致Pod发生OOM(Out Of Memory)事件。您可以通过挂载OSS Bucket的子目录,或对文件较多的目录进行目录分级来避免此问题。
创建并获取OSS Bucket信息
- 创建OSS Bucket。 
- (可选)如果需要挂载OSS Bucket的子目录,按需创建子目录。 - 在Bucket列表页面,单击目标Bucket名称。 
- 在Bucket详情页面的左侧导航栏,选择。 
- 根据需要单击新建目录,对OSS Bucket进行目录分级。 
 
- 获取OSS Bucket的Endpoint。 - 在Bucket列表页面,单击目标Bucket名称。 
- 在Bucket详情页面,单击概览页签,然后在访问端口区域,复制目标Endpoint。 - OSS Bucket和ACS集群属于相同地域时,请复制VPC内网的Endpoint。 
- OSS Bucket没有地域属性,或者和ACS集群属于不同地域时,请复制外网的Endpoint。 
 
 
- 获取AccessKey ID和AccessKey Secret,用于OSS授权访问。具体操作,请参见获取AccessKey。 说明- 如果需要跨账号挂载OSS Bucket,请获取OSS Bucket所属账号的AccessKey。 
挂载OSS存储卷
kubectl
步骤一:创建PV
- 将以下YAML内容保存为oss-pv.yaml。 - apiVersion: v1 kind: Secret metadata: name: oss-secret namespace: default stringData: akId: <your AccessKey ID> akSecret: <your AccessKey Secret> --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: storageClassName: test capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "<your OSS Bucket Name>" url: "<your OSS Bucket Endpoint>" otherOpts: "-o max_stat_cache_size=0 -o allow_other"说明- 以上YAML可以创建一个Secret和一个PV。Secret用于保存AccessKey,以便在PV中可以安全使用。请使用实际的AccessKey ID和AccessKey Secret替换 - akId和- akSecret的取值。- PV的相关参数说明如下: - 参数 - 说明 - alicloud-pvname- PV的标签。用于绑定PVC。 - storageClassName- 该配置仅用于绑定PVC,无需关联实际的StorageClass。 - storage- OSS存储卷的容量大小。 说明- OSS静态卷的容量仅起声明效果,实际容量不受限制,可使用量以OSS控制台显示为准。 - accessModes- 访问模式。 - persistentVolumeReclaimPolicy- 回收策略。 - driver- 驱动类型。此处配置为 - ossplugin.csi.alibabacloud.com,表示使用阿里云OSS CSI插件。- volumeHandle- PV的唯一标识符,与 - metadata.name保持一致。- nodePublishSecretRef- 从指定的Secret中获取AccessKey,用于授权认证。 - bucket- OSS Bucket的名称。请使用实际的OSS Bucket名称替换 - bucket的取值。- url- OSS Bucket的接入域名(Endpoint)。请使用实际的OSS Bucket的Endpoint替换 - url的取值。- OSS Bucket和ACS集群属于相同地域时,使用VPC内网的Endpoint。例如 - oss-cn-shanghai-internal.aliyuncs.com。
- OSS Bucket没有地域属性,或者和ACS集群属于不同地域时,使用外网的Endpoint。例如 - oss-cn-shanghai.aliyuncs.com。
 - otherOpts- 挂载参数。格式为 - -o *** -o ***,例如:- -o max_stat_cache_size=0 -o allow_other。
- 创建Secret和PV。 - kubectl create -f oss-pv.yaml
- 查看PV。 - kubectl get pv- 预期返回: - NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE oss-pv 20Gi RWX Retain Available test <unset> 9s
步骤二:创建PVC
- 将以下YAML内容保存为oss-pvc.yaml。 - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc spec: storageClassName: test accessModes: - ReadWriteMany resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: oss-pv- 相关参数说明如下: - 参数 - 说明 - storageClassName- 该配置仅用于绑定PV,无需关联实际的StorageClass。与PV的 - spec.storageClassName保持一致。- accessModes- 访问模式。 - storage- 分配给Pod的存储容量。不能高于OSS存储卷的容量。 - alicloud-pvname- 要绑定的PV的标签。与PV的 - metadata.labels.alicloud-pvname保持一致。
- 创建PVC。 - kubectl create -f oss-pvc.yaml
- 查看PVC。 - kubectl get pvc- 预期返回如下,此时PVC已绑定步骤一创建的PV。 - NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE oss-pvc Bound oss-pv 20Gi RWX test <unset> 6s
步骤三:创建应用并挂载OSS
- 使用以下YAML内容,创建oss-test.yaml文件。 - 以下YAML示例可以创建包含2个Pod的Deployment,2个Pod均通过名为 - oss-pvc的PVC申请存储资源,挂载路径均为- /data。- apiVersion: apps/v1 kind: Deployment metadata: name: oss-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: /data volumes: - name: pvc-oss persistentVolumeClaim: claimName: oss-pvc
- 创建Deployment并挂载OSS。 - kubectl create -f oss-test.yaml
- 查看Deployment中Pod的部署情况。 - kubectl get pod | grep oss-test- 返回示例如下,已创建2个Pod。 - oss-test-****-***a 1/1 Running 0 28s oss-test-****-***b 1/1 Running 0 28s
- 查看挂载路径。 - 命令示例如下,预期会返回OSS Bucket挂载目录下的数据,默认为空。 - kubectl exec oss-test-****-***a -- ls /data
控制台
步骤一:创建PV
- 登录容器计算服务控制台。 
- 在集群列表页面,单击目标集群名称,进入该集群的管理页面。 
- 在集群管理页面的左侧导航栏,选择。 
- 在存储卷页面,单击创建。 
- 在弹出的对话框中,完成参数配置,然后单击创建。 - 参数 - 说明 - 示例 - 存储卷类型 - 选择OSS。 - OSS - 名称 - PV名称,自定义输入。格式要求请参考界面提示。 - oss-pv - 总量 - OSS存储卷的容量大小。 说明- OSS静态卷的容量仅起声明效果,实际容量不受限制,可使用量以OSS控制台显示为准。 - 20Gi - 访问模式 - 按需选择以下配置: - ReadOnlyMany:卷可以被多个Pod以只读方式挂载。 
- ReadWriteMany:卷可以被多个Pod以读写方式挂载。 
 - ReadWriteMany - 访问证书 - 为保证安全性,将AccessKey信息保存到Secret中。本文以新建保密字典为例。 - 新建保密字典 
- 命名空间:default 
- 名称:oss-secret 
- AccessKey ID:******** 
- AccessKey Secret:******** 
 - Bucket ID - 选择OSS Bucket。 - oss-acs-*** - OSS Path - 要挂载的目录。默认挂载根目录( - /),可按需挂载子目录(如- /dir),需确保该子目录已存在。- / - 访问域名 - OSS Bucket的接入域名(Endpoint)。 - OSS Bucket和ACS集群属于相同地域时,选择私网域名。 
- OSS Bucket没有地域属性,或者和ACS集群属于不同地域时,选择公网域名。 
 - 私网域名 - 创建完成后,在存储卷页面可以看到新创建的PV信息,当前PV还没绑定PVC。 
步骤二:创建PVC
- 在集群管理页面的左侧导航栏,选择。 
- 在存储声明页面,单击创建。 
- 在弹出的对话框中,完成参数配置,然后单击创建。 - 参数 - 说明 - 示例 - 存储声明类型 - 选择OSS。 - OSS - 名称 - PVC名称,自定义输入。格式要求请参考界面提示。 - oss-pvc - 分配模式 - 选择已有存储卷。 - 已有存储卷 - 已有存储卷 - 选择之前创建的PV。 - oss-pv - 总量 - 分配给Pod的存储容量。不能高于OSS存储卷的容量。 - 20Gi - 创建完成后,在存储声明页面可以看到新创建的PVC,该PVC已绑定PV(即OSS存储卷)。 
步骤三:创建应用并挂载OSS
- 在集群管理页面的左侧导航栏,选择。 
- 在无状态页面,单击使用镜像创建。 
- 完成Deployment的参数配置,单击创建。 - 需要注意的参数如下,其他参数保持默认即可。更多信息,请参见创建无状态工作负载Deployment。 - 配置页 - 参数 - 说明 - 示例 - 应用基本信息 - 应用名称 - Deployment名称,自定义输入。格式要求请参考界面提示。 - oss-test - 副本数量 - 配置Deployment的副本数量。 - 2 - 容器配置 - 镜像名称 - 输入用于部署应用的镜像地址。 - registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest - 所需资源 - 设置所需的vCPU和内存资源。 - 0.25 vCPU,0.5 GiB - 数据卷 - 单击增加云存储声明,然后完成参数配置。 - 挂载源:选择之前创建的PVC。 
- 容器路径:输入OSS Bucket要挂载到的容器路径。 
 - 挂载源:oss-pvc 
- 容器路径:/data 
 
- 查看应用部署情况。 - 在无状态页面,单击应用名称。 
- 在容器组页签下,确认Pod已正常运行(状态为Running)。 
 
验证OSS的共享存储和持久化存储
按照上文示例创建的Deployment中含有2个Pod,2个Pod同时挂载了同一OSS Bucket。您可以通过以下方式进行验证:
- 在一个Pod中创建文件,然后另一个Pod中查看文件,以此来验证共享存储。 
- 重建Deployment,然后在新创建的Pod中查看OSS Bucket中的数据是否存在,以此来验证持久化存储。 
- 查看Pod信息。 - kubectl get pod | grep oss-test- 返回示例如下: - oss-test-****-***a 1/1 Running 0 40s oss-test-****-***b 1/1 Running 0 40s
- 验证共享存储。 - 在一个Pod中创建文件。 - 以名为 - oss-test-****-***a的Pod作为示例:- kubectl exec oss-test-****-***a -- touch /data/test.txt
- 在另一个Pod中查看文件。 - 以名为 - oss-test-****-***b的Pod作为示例:- kubectl exec oss-test-****-***b -- ls /data- 预期返回如下,可以看到已共享新建的文件 - test.txt。- test.txt
 
- 验证持久化存储。 - 重建Deployment。 - kubectl rollout restart deploy oss-test
- 查看Pod,等待新Pod创建成功。 - kubectl get pod | grep oss-test- 返回示例如下: - oss-test-****-***c 1/1 Running 0 67s oss-test-****-***d 1/1 Running 0 49s
- 在新Pod中查看文件系统中的数据是否存在。 - 以名为 - oss-test-c***的Pod作为示例:- kubectl exec oss-test-****-***c -- ls /data- 预期返回如下,可以看到OSS Bucket中的数据依然存在,在新Pod的挂载目录下可以重新获取。 - test.txt