如果应用需要存储图片、音视频等非结构化数据,可以使用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倍。
顺序读取性能
在单线程大文件顺序读取场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了约8.5倍。
在多线程(4线程)大文件顺序读取场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了5倍以上。
小文件并发读取性能:在高并发(128线程)读取小文件的场景下,ossfs 2.0的带宽相较于ossfs 1.0提升了280倍以上。
如遇读写性能(如时延、吞吐)未达到预期的情况,请参见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
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的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