ossfs 1.0 支持以静态存储卷的方式,通过PV/PVC 将已有的 OSS Bucket 挂载为持久化存储。该方式适用于并发读、少量随机写以及需要修改文件权限的通用场景,如挂载配置文件、图片或视频资源等。
适用范围
集群和CSI组件(csi-plugin和csi-provisioner)版本需符合要求:
通过RRSA鉴权方式挂载时:集群版本为1.26及以上,CSI版本为v1.30.4及以上。
若在1.30.4之前的版本中使用了RRSA功能,需参见【产品变更】CSI ossfs版本升级与挂载流程优化增加RAM角色授权配置。
通过AccessKey鉴权方式挂载时:为确保挂载稳定性,CSI版本建议不低于 v1.18.8.45。
如需升级集群,请参见手动升级集群;如需升级组件,请参见升级csi-plugin和csi-provisioner。
自CSI v1.30.4-*版本起,OSS静态卷挂载已依赖csi-provisioner组件。
步骤一:选择鉴权方式(RRSA或AccessKey)并准备访问凭证
为确保集群能够安全、合规地访问OSS Bucket资源,需先配置一种鉴权机制。
RRSA鉴权方式:为 Pod 动态授予临时、自动轮换的 RAM 角色,实现应用级别的精细化权限隔离,安全性较高。
AccessKey鉴权方式:将静态、长期的密钥存储在 Secret 中。配置简单,但安全性较低。
在1.26及以上版本的集群中,为避免因AccessKey轮转导致的ossfs重挂载和业务重启,建议使用RRSA鉴权方式。
本示例中集群与OSS Bucket处于同一阿里云账号下。如需跨账号挂载OSS Bucket,建议使用RRSA鉴权方式。
RRSA方式
1. 在集群中启用RRSA
在ACK集群列表页面,单击目标集群名称,选择集群信息。
在基本信息页签的安全与审计区域,单击RRSA OIDC右侧的开启,按照页面提示在业务低峰期完成RRSA的启用。
当集群状态由更新中变为运行中,表明RRSA已成功启用。
重要启用RRSA功能后,集群内新创建的ServiceAccount Token的最大有效期将限制为12小时。
2. 创建RAM角色并授权
创建一个供 Pod 扮演的 RAM 角色,以通过 RRSA 鉴权来访问 OSS 存储卷。
AccessKey方式
创建具有OSS访问权限的RAM用户并获取其AccessKey,使其拥有OSS Bucket的操作权限。
创建RAM用户(如有,可跳过)。
访问RAM控制台-创建用户页面,按照页面提示完成RAM用户的创建,如登录名称、密码等。
创建权限策略。
本示例遵循最小权限原则,创建一个自定义权限策略,授予访问目标OSS Bucket的权限(OSS只读权限或OSS读写权限)。
访问RAM控制台-创建权限策略页面,切换为脚本编辑,按照页面提示配置策略脚本。
OSS只读权限策略
替换
<myBucketName>为实际Bucket名称。{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": [ "acs:oss:*:*:<myBucketName>", "acs:oss:*:*:<myBucketName>/*" ] } ], "Version": "1" }OSS读写权限策略
替换
mybucket为实际Bucket名称。{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:<myBucketName>", "acs:oss:*:*:<myBucketName>/*" ] } ], "Version": "1" }使用控制台创建PV时,还需拥有
oss:ListBuckets权限。{ "Effect": "Allow", "Action": "oss:ListBuckets", "Resource": "*" }(可选)使用KMS托管的指定CMK ID加密OSS Object时,还需为该RAM用户配置KMS权限,详见使用KMS托管的指定CMK ID加密。
将该策略授权给RAM用户。
访问RAM控制台-用户页面,在RAM用户列表的操作列,单击目标用户对应的添加权限。
在权限策略区域,按照页面提示搜索并选择上一步创建的权限策略,并完成授权的新增。
为RAM用户创建AccessKey,以便后续将其存储为Secret,供PV使用。
访问RAM控制台-用户页面,在RAM用户列表单击目标用户,然后在AccessKey区域,单击创建 AccessKey。
按照页面提示,在对话框进行AccessKey的创建,获取并妥善保管其AccessKey ID和AccessKey Secret。
步骤二:创建PV
创建PV,在集群中“注册”已有的OSS Bucket。
RRSA方式
创建
pv-oss-rrsa.yaml。apiVersion: v1 kind: PersistentVolume metadata: # PV名称 name: pv-oss # PV标签 labels: alicloud-pvname: pv-oss spec: capacity: # 定义存储卷容量 storage: 10Gi # 访问模式 accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com # 与PV名称(metadata.name)一致 volumeHandle: pv-oss volumeAttributes: # 替换为实际Bucket名称 bucket: "your-bucket-name" # 挂载Bucket的根目录或指定子目录 path: / # Bucket所在地域的Endpoint url: "http://oss-cn-hangzhou-internal.aliyuncs.com" otherOpts: "-o umask=022 -o max_stat_cache_size=100000 -o allow_other" authType: "rrsa" # 此前创建或修改的RAM角色 roleName: "demo-role-for-rrsa" # OSS请求签名版本 sigVersion: "v4"参数
描述
storage定义OSS存储卷容量。此值仅用于匹配PVC。
accessModes配置访问模式,支持
ReadOnlyMany和ReadWriteMany。选择
ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。persistentVolumeReclaimPolicyPV回收策略。当前OSS存储卷仅支持
Retain,即删除PVC时,PV和OSS Bucket中的数据不会随之删除。driver定义驱动类型。使用阿里云OSS CSI插件固定为
ossplugin.csi.alibabacloud.com。volumeHandle需与PV名称(
metadata.name)保持一致。bucket待挂载的OSS Bucket。
pathCSI组件版本需为v1.14.8.32-c77e277b-aliyun及以上。
指定挂载点相对于 Bucket 根目录的路径。默认为
/,即挂载整个 Bucket。ossfs版本小于1.91时,指定的
path必须在 OSS Bucket 中预先存在。详见ossfs 1.91及以上版本新增功能说明url待挂载OSS的访问域名(Endpoint)。
挂载节点和Bucket处于相同地域,或已打通VPC网络时,使用内网地址。
挂载节点和Bucket不同地域时,使用外网地址。
不同访问端口的常见填写格式如下:
内网格式:
http://oss-{{regionName}}-internal.aliyuncs.com或https://oss-{{regionName}}-internal.aliyuncs.com。内网访问端口格式
vpc100-oss-{{regionName}}.aliyuncs.com已废弃,请及时切换。外网格式:
http://oss-{{regionName}}.aliyuncs.com或https://oss-{{regionName}}.aliyuncs.com。
otherOpts为OSS存储卷输入定制化参数,格式为
-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=100000 -o allow_other。authType配置为
rrsa,使用RRSA方式鉴权。roleName配置为此前创建或修改的RAM角色。
如需为不同PV配置不同权限,可创建不同的RAM角色,并在PV中配置不同的
roleName。sigVersion请求OSS服务端的请求签名版本。
若默认的RRSA鉴权不满足需求(如使用非默认ServiceAccount或第三方OIDC),可通过修改PV配置来指定具体的ARN或ServiceAccount,详见如何在RRSA鉴权方式中使用指定的ARNs或ServiceAccount?。
创建PV。
kubectl create -f pv-oss-rrsa.yaml
AccessKey方式
kubectl
创建
oss-secret.yaml,将步骤一获取的AccessKey存储为Secret,供PV使用。apiVersion: v1 kind: Secret metadata: name: oss-secret # 需与应用所在的命令空间保持一致 namespace: default stringData: # 替换为此前获取的AccessKey ID akId: <your AccessKey ID> # 替换为此前获取的AccessKey Secret akSecret: <your AccessKey Secret>创建Secret。
kubectl create -f oss-secret.yaml创建
pv-oss-ram.yaml。apiVersion: v1 kind: PersistentVolume metadata: # PV 名称 name: pv-oss # PV 标签 labels: alicloud-pvname: pv-oss spec: capacity: storage: 10Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com # 需与PV名称(metadata.name)保持一致 volumeHandle: pv-oss # 指定通过Secret对象来获取AccessKey信息 nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: # 替换为实际Bucket名称 bucket: "your-bucket-name" url: "http://oss-cn-hangzhou-internal.aliyuncs.com" otherOpts: "-o umask=022 -o max_stat_cache_size=100000 -o allow_other" path: "/"参数
描述
storage定义OSS存储卷容量。此值仅用于匹配PVC。
accessModes配置访问模式,支持
ReadOnlyMany和ReadWriteMany。选择
ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。persistentVolumeReclaimPolicyPV回收策略。当前OSS存储卷仅支持
Retain,即删除PVC时,PV和OSS Bucket中的数据不会随之删除。driver定义驱动类型。使用阿里云OSS CSI插件固定为
ossplugin.csi.alibabacloud.com。nodePublishSecretRef指定Secret,以在挂载PV时提供AccessKey信息。
volumeHandle需与PV名称(
metadata.name)保持一致。bucket待挂载的OSS Bucket。
url待挂载OSS的访问域名(Endpoint)。
挂载节点和Bucket处于相同地域,或已打通VPC网络时,使用内网地址。
挂载节点和Bucket不同地域时,使用外网地址。
不同访问端口的常见填写格式如下:
内网格式:
http://oss-{{regionName}}-internal.aliyuncs.com或https://oss-{{regionName}}-internal.aliyuncs.com。内网访问端口格式
vpc100-oss-{{regionName}}.aliyuncs.com已废弃,请及时切换。外网格式:
http://oss-{{regionName}}.aliyuncs.com或https://oss-{{regionName}}.aliyuncs.com。
otherOpts为OSS存储卷输入定制化参数,格式为
-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=100000 -o allow_other。pathCSI组件版本需为v1.14.8.32-c77e277b-aliyun及以上。
指定挂载点相对于 Bucket 根目录的路径。默认为
/,即挂载整个 Bucket。ossfs版本小于1.91时,指定的
path必须在 OSS Bucket 中预先存在。详见ossfs 1.91及以上版本新增功能说明sigVersion请求OSS服务端的请求签名版本。
创建PV。
kubectl create -f pv-oss-ram.yaml
控制台
将步骤一获取的AccessKey存储为Secret,供PV使用。
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
单击使用YAML创建资源,按照页面提示,完成Secret的创建。
apiVersion: v1 kind: Secret metadata: name: oss-secret # 需与应用所在的命令空间保持一致 namespace: default stringData: # 替换为此前获取的AccessKey ID akId: <your AccessKey ID> # 替换为此前获取的AccessKey Secret akSecret: <your AccessKey Secret>
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在存储卷页面,单击创建,选择存储卷类型为OSS,按照页面配置并提交参数。
关键参数如下。
配置项
说明
总量
所创建存储卷的容量。
访问模式
配置访问模式,支持
ReadOnlyMany和ReadWriteMany。选择
ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。访问证书
配置访问OSS所需的保密字典,即步骤一获取的AccessKey ID和AccessKey Secret。
可选参数
为OSS存储卷输入定制化参数,格式为
-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=100000 -o allow_other。Bucket ID
待使用的OSS Bucket。
此处仅展示配置AccessKey后可获取到的Bucket。
OSS Path
CSI组件版本需为v1.14.8.32-c77e277b-aliyun及以上。
指定挂载点相对于 Bucket 根目录的路径。默认为
/,即挂载整个 Bucket。ossfs版本小于1.91时,指定的
path必须在 OSS Bucket 中预先存在。详见ossfs 1.91及以上版本新增功能说明访问域名
待挂载OSS的访问域名(Endpoint)。
挂载节点和Bucket处于相同地域,或已打通VPC网络时,使用内网地址。
挂载节点和Bucket不同地域时,使用外网地址。
不同访问端口的常见填写格式如下:
内网格式:
http://oss-{{regionName}}-internal.aliyuncs.com或https://oss-{{regionName}}-internal.aliyuncs.com。内网访问端口格式
vpc100-oss-{{regionName}}.aliyuncs.com已废弃,请及时切换。外网格式:
http://oss-{{regionName}}.aliyuncs.com或https://oss-{{regionName}}.aliyuncs.com。
通过私网访问时默认使用HTTP协议。如需使用HTTPS,请使用kubectl方式。
步骤三:创建PVC
创建PVC,为应用声明其所需的持久化存储容量。
kubectl
创建
pvc-oss.yaml。apiVersion: v1 kind: PersistentVolumeClaim metadata: # PVC 名称 name: pvc-oss namespace: default spec: # 配置访问模式。ReadOnlyMany表明ossfs将以只读模式挂载OSS Bucket accessModes: - ReadOnlyMany resources: requests: # 声明存储容量,不能大于存储卷总量 storage: 10Gi selector: matchLabels: # 通过PV标签精确匹配PV alicloud-pvname: pv-oss创建PVC。
kubectl create -f pvc-oss.yaml确认PVC状态。
kubectl get pvc pvc-oss输出中,PVC已绑定(Bound)PV。
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-oss Bound pv-oss 10Gi ROX <unset> 6s
控制台
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在存储声明页面,单击创建,选择存储声明类型为OSS,按照页面提示完成参数的配置和提交。
关键参数如下。
配置项
说明
分配模式
选择已有存储卷。
若未创建存储卷,可设置分配模式为创建存储卷,配置创建存储卷参数。
总量
所创建存储卷的容量,不超过存储卷容量。
步骤四:创建应用并挂载存储卷
在应用中引用PVC,完成挂载。
kubectl
创建
oss-static.yaml。apiVersion: apps/v1 kind: Deployment metadata: name: oss-static labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: # 容器内的挂载路径 - name: pvc-oss mountPath: "/data" # 配置健康检查 livenessProbe: exec: command: - ls - /data initialDelaySeconds: 30 periodSeconds: 30 volumes: - name: pvc-oss persistentVolumeClaim: # 引用此前创建的PVC claimName: pvc-oss创建应用。
kubectl create -f oss-static.yaml验证挂载结果。
确认Pod处于Running状态。
kubectl get pod -l app=nginx进入Pod,查看挂载点。
kubectl exec -it <pod-name> -- ls /data输出中,可查看OSS挂载路径下的数据。
控制台
在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在无状态页面,单击使用镜像创建。
单击使用镜像创建,按照页面提示配置应用参数。
关键参数如下,其他参数保持默认即可。详见创建无状态工作负载Deployment。
配置页
参数
说明
应用基本信息
副本数量
Deployment副本数量。
容器配置
镜像名称
用于部署应用的镜像地址,如
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6。所需资源
所需的vCPU和内存资源。
数据卷
单击增加云存储声明,然后完成参数配置。
挂载源:选择之前创建的PVC。
容器路径:输入OSS要挂载到的容器路径,如
/data。
标签和注解
Pod标签
如名称为app,值为nginx。
查看应用部署状态。
在无状态页面,单击应用名称,在容器组页签下,确认Pod已正常运行(状态为Running)。
步骤五:验证共享存储和持久化存储
验证共享存储
在一个Pod中创建文件,然后在另一个Pod中查看,以验证共享存储特性。
查看Pod信息,在输出中获取Pod名称。
kubectl get pod -l app=nginx在一个Pod中创建tmpfile文件。 以名为
oss-static-66fbb85b67-d****的Pod为例:在另一个Pod挂载路径下查看文件。
以名为
oss-static-66fbb85b67-l****、挂载路径为data的Pod为例。kubectl exec oss-static-66fbb85b67-l**** -- ls /data | grep tmpfile预期输出如下,Pod挂载路径下均存在此文件,表明两个Pod可共享数据。
tmpfile若无预期输出,请确认CSI组件版本是否为v1.20.7及以上版本。
验证持久化存储
删除并重建Pod,在新建的Pod中查看文件是否存在,验证数据的持久化存储。
删除一个应用Pod以触发重建。
kubectl delete pod oss-static-66fbb85b67-d****查看Pod,等待新Pod启动并进入Running状态。
kubectl get pod -l app=nginx查看
/data路径下的文件。以名为
oss-static-66fbb85b67-z****、挂载路径为data的Pod为例。kubectl exec oss-static-66fbb85b67-z**** -- ls /data | grep tmpfile预期输出如下,tmpfile文件仍存在,表明数据可持久化存储。
tmpfile
功能已知影响
数据完整性风险
应用稳定性风险
OOM风险:初次对大量文件(如超10万,具体取决于节点内存)进行
readdir操作时(如Shell脚本中的ls命令),ossfs会因一次性加载全部元信息而消耗大量内存,可能导致进程OOM Killed,并引发挂载点不可用。建议挂载OSS Bucket子目录或优化目录层级来规避此风险。
挂载时间延长:在应用中配置
securityContext.fsgroup会导致kubelet在挂载存储卷时递归修改文件权限(chmod/chown)。若文件数量庞大,将显著延长挂载时间,可能导致 Pod 启动严重延迟。配置此参数时,如需减少挂载时间,请参见OSS存储卷挂载时间延长。
密钥失效风险(AccessKey鉴权方式):若PV引用的AccessKey失效或权限变更,关联应用会立即失去访问权限。
恢复访问需更新Secret中的凭证,并重启应用Pod以强制重新挂载(将导致业务中断),请在维护窗口期执行。详见解决方案。
成本风险
碎片成本:当传输文件大于10 MB时,ossfs会将文件分片上传。若上传因业务自身重启等特殊原因意外中断,请手动删除碎片或通过生命周期规则删除碎片,避免碎片占用存储空间并产生费用。
相关文档
可通过CNFS托管OSS存储卷,以提升其性能和QoS控制,请参见管理OSS生命周期。
为保护OSS中的静态敏感数据,建议开启服务端加密,请参见加密ossfs 1.0存储卷。
关于ossfs和OSS的常见问题,请参见ossfs 1.0、ossfs 1.0存储卷FAQ。
启用容器存储监控配置告警,及时发现存储卷的异常或性能瓶颈。
与ossfs 2.0相比,ossfs 1.0在随机写和并发写场景下能提供更可靠的数据一致性保障。但对于顺序读写场景,ossfs 2.0性能更优。