如果应用需要存储图片、音视频等非结构化数据,可以使用OSS作为持久化存储卷。本文介绍如何为应用挂载OSS静态存储卷,并验证OSS的共享存储和持久化存储。
背景信息
OSS是一个海量、安全、低成本、高可靠的存储空间,适合存储写入后较少修改的数据,以及非结构化数据(如图片、音视频等)。更多信息,请参见存储概述。
OSS存储卷客户端
OSS存储卷可通过客户端文件系统(Filesystem in Userspace,简称FUSE)实现对象存储的本地挂载。相较于传统的本地存储和块存储,其在POSIX操作兼容性方面存在一定限制。目前ACS支持如下OSS存储卷客户端。
适用场景 | 客户端 | 类型 | 说明 |
读写或需要配置用户权限等绝大部分场景。 | FUSE | 支持大部分POSIX操作,包括追加写、随机写、设置用户权限等。 | |
只读或只包括顺序追加写的场景。如AI训练、推理、大数据处理、自动驾驶等。 | FUSE | 支持完整读和顺序追加写操作。适用于多读场景,如AI训练、推理、大数据处理、自动驾驶等,可大幅提升数据读取性能。 ossfs 2.0目前仅支持GPU算力。如需使用CPU算力,请提交工单申请。 |
若对当前业务的读写模型不明确,建议优先选用ossfs 1.0。ossfs 1.0对POSIX操作的兼容性更佳,可更好地保障业务稳定运行。
对于读写可分离场景,即读写操作不同时进行或读写操作文件不同(例如断点保存、日志持久保存等),建议拆分不同的存储卷,如使用ossfs 2.0存储卷挂载只读路径,使用ossfs 1.0存储卷挂载写路径。
POSIX API支持情况
以下为ossfs 1.0与ossfs 2.0对于常用POSIX API的支持情况。
POSIX API支持情况
性能Benchmark
ossfs 2.0相较于ossfs 1.0在顺序读写和高并发小文件读取方面均实现了显著的性能提升。
顺序写入性能:在单线程大文件顺序写入场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了近18倍。
顺序读取性能:在单线程或多线程(4线程)大文件顺序读取场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了3倍以上。
小文件并发读取性能:在高并发(128线程)读取小文件的场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了20倍以上。
如遇读写性能(如时延、吞吐)未达到预期的情况,请参见OSS存储卷性能调优最佳实践。
前提条件
ACS集群中已安装csi-provisioner组件。
您可以在ACS集群管理页的左侧导航栏单击组件管理,然后在存储页签下确认csi-provisioner组件的安装情况。
注意事项
以下注意事项主要针对通用读写场景(ossfs 1.0),ossfs 2.0客户端由于仅支持部分POSIX操作(主要为读操作),基本不涉及。
ACS仅支持OSS静态存储卷,暂不支持OSS动态存储卷。
随机或者追加写文件实际为在本地生成新文件重新上传至OSS服务端,由于OSS存储特性,请注意以下事项:
文件、文件夹的rename操作非原子。
请尽量避免并发多写,或直接在挂载路径下进行压缩、解压缩等操作。
重要多写场景依赖用户自行协调各个客户端的行为。对于写操作导致的元数据和数据的不一致性问题,ACS不承诺保障。
此外,还需注意以下限制:
不支持硬链接(Hard Link)。
不支持挂载归档存储、冷归档存储或者深度冷归档存储类型的Bucket。
针对ossfs1.0存储卷,readdir操作默认会发送大量headObject请求以获取路径下的所有对象的扩展信息。当目标路径下的文件较多时,可能会影响ossfs的整体性能。若在读写场景中对文件的权限等属性不敏感,可开启
-o readdir_optimize参数进行优化。具体请参见新增readdir优化功能。
创建并获取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存储卷
ossfs 1.0存储卷
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 umask=022 -o allow_other"说明以上YAML可以创建一个Secret和一个PV。Secret用于保存AccessKey,以便在PV中可以安全使用。请使用实际的AccessKey ID和AccessKey Secret替换
akId和akSecret的取值。PV的相关参数说明如下:
参数
说明
alicloud-pvnamePV的标签。用于绑定PVC。
storageClassName该配置仅用于绑定PVC,无需关联实际的StorageClass。
storageOSS存储卷的容量大小。
说明OSS静态卷的容量仅起声明效果,实际容量不受限制,可使用量以OSS控制台显示为准。
accessModes访问模式。
persistentVolumeReclaimPolicy回收策略。
driver驱动类型。此处配置为
ossplugin.csi.alibabacloud.com,表示使用阿里云OSS CSI插件。volumeHandlePV的唯一标识符,与
metadata.name保持一致。nodePublishSecretRef从指定的Secret中获取AccessKey,用于授权认证。
bucketOSS Bucket的名称。请使用实际的OSS Bucket名称替换
bucket的取值。urlOSS 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为OSS存储卷输入定制化参数,格式为
-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=100000 -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
数据卷
单击增加云存储声明(PersistentVolumeClaim),然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入OSS Bucket要挂载到的容器路径。
挂载源:oss-pvc
容器路径:/data
查看应用部署情况。
在无状态页面,单击应用名称。
在容器组页签下,确认Pod已正常运行(状态为Running)。
ossfs 2.0存储卷
ACS目前仅支持使用kubectl方式挂载ossfs 2.0静态存储卷。
步骤一:创建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: fuseType: ossfs2 # 显式声明使用ossfs 2.0客户端 bucket: "<your OSS Bucket Name>" url: "<your OSS Bucket Endpoint>" otherOpts: "-o close_to_open=false" # 注意:支持的挂载参数与ossfs 1.0客户端不兼容说明以上YAML可以创建一个Secret和一个PV。Secret用于保存AccessKey,以便在PV中可以安全使用。请使用实际的AccessKey ID和AccessKey Secret替换
akId和akSecret的取值。PV的相关参数说明如下:
参数
说明
alicloud-pvnamePV的标签。用于绑定PVC。
storageClassName该配置仅用于绑定PVC,无需关联实际的StorageClass。
storageOSS存储卷的容量大小。
说明OSS静态卷的容量仅起声明效果,实际容量不受限制,可使用量以OSS控制台显示为准。
accessModes访问模式。
persistentVolumeReclaimPolicy回收策略。
driver驱动类型。此处配置为
ossplugin.csi.alibabacloud.com,表示使用阿里云OSS CSI插件。volumeHandlePV的唯一标识符,与
metadata.name保持一致。nodePublishSecretRef从指定的Secret中获取AccessKey,用于授权认证。
fuseType使用ossfs 2.0客户端时,固定为
ossfs2。bucketOSS Bucket的名称。请使用实际的OSS Bucket名称替换
bucket的取值。urlOSS 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为OSS存储卷输入定制化参数,格式为
-o *** -o ***,例如-o close_to_open=false。close_to_open:默认为关闭。开启后,每次打开文件时,系统会主动向OSS发送GetObjectMeta请求,以获取文件在OSS中的最新元数据信息,从而确保元数据的实时性。但在需要大量读取小文件的场景下,频繁的元数据查询会显著增加访问延迟。更多可选参数,请参见ossfs 2.0挂载选项说明。
创建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
验证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