对于需要持久化存储或在多Pod间共享数据的应用,可通过动态PV将OSS Bucket挂载为 ossfs 2.0 存储卷。该方式通过 StorageClass 作为模板自动创建并绑定PV,不仅简化了存储管理,还让应用能像访问本地文件一样,通过标准的POSIX接口读写OSS数据。
相较于ossfs 1.0,ossfs 2.0在顺序读写性能上表现优异,可以更好地利用OSS的高带宽优势。
ossfs 2.0的性能说明,请参见ossfs 2.0客户端压测性能。
流程指引
在ACK集群中挂载ossfs 2.0动态存储卷主要流程如下。
|
注意事项
读写场景:ossfs 2.0 主要适用于只读和顺序追加写场景。对于需要随机写或并发写的场景,无法保证数据一致性,建议使用 ossfs 1.0。
数据安全:通过ossfs挂载后,在应用Pod或宿主机上对挂载目录内文件的修改或删除均会同步至源OSS Bucket。为防止数据误删,建议为Bucket开启版本控制。
应用健康检查:建议为使用OSS存储卷的Pod配置健康检查(Liveness Probe),例如检查挂载目录是否可用。当挂载异常时,可自动重启Pod以恢复。
分片管理:当上传大文件(>10MB)时,ossfs会自动分片。若上传中断,产生的碎片文件会残留在Bucket中,可手动删除碎片或通过生命周期规则删除碎片,以节省存储成本。
方式一:通过RRSA鉴权方式挂载
基于适用于服务账户的RAM角色(RAM Roles for Service Accounts,简称RRSA),可在集群内实现PV维度的OpenAPI权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
前提条件
已创建1.26及以上版本的集群。如需升级,请参见手动升级集群。
CSI组件版本为v1.33.1及以上。如需升级,请参见升级csi-plugin和csi-provisioner。
如在1.30.4之前的版本中使用了RRSA功能,请及时参见【产品变更】CSI ossfs版本升级与挂载流程优化增加RAM角色授权配置。
已创建OSS Bucket,且Bucket与集群属于同一阿里云账号。
如需跨账号挂载OSS Bucket,建议通过RRSA鉴权方式实现,请参见如何跨账号挂载OSS Bucket?。
步骤一:创建RAM角色
若集群已通过 RRSA 挂载过 OSS,可跳过此步。首次配置时请按以下步骤操作。
为OSS存储卷RRSA鉴权新建RAM角色,即使用RRSA功能扮演的指定角色,请参见创建OIDC身份提供商的RAM角色。
以demo-role-for-rrsa为例,主要参数说明如下。
配置项
描述
身份提供商类型
OIDC。
身份提供商
选择ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。
条件
oidc:iss:保持默认。
oidc:aud:保持默认。
oidc:sub:需手动添加该条件。
条件键:选择oidc:sub。
运算符:选择StringEquals。
条件值:默认输入
system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs
。其中,
ack-csi-fuse
为ossfs客户端所在的命名空间,无法自定义。csi-fuse-ossfs
为服务账户名称,可修改为指定的服务账户名称。关于如何修改服务账户名称,如何在RRSA鉴权方式中使用指定的ARNs或ServiceAccount?
角色名称
demo-role-for-rrsa。
步骤二:为demo-role-for-rrsa角色授权
创建如下OSS访问的自定义权限策略。具体操作,请参见创建自定义权限策略。
以下只读和读写权限策略请根据使用需求选择,并替换
mybucket
为您实际创建的Bucket名称。OSS只读权限策略
OSS读写权限
(可选)若您使用KMS托管的指定CMK ID加密OSS Object,还需要为该RAM用户配置KMS权限。具体操作,请参见加密操作。
为demo-role-for-rrsa角色授权。具体操作,请参见为RAM角色授权。
说明您也可以通过修改RAM角色信任策略的方式使用已有的授权了OSS权限的RAM角色。具体操作,请参见使用已存在的RAM角色并授权。
步骤三:创建StorageClass
创建StorageClass,作为动态生成PV的模板。
修改以下YAML,保存为
ossfs2-sc-rrsa.yaml
。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc # StorageClass名称 parameters: bucket: cnfs-oss-test # Bucket名称 path: /subpath # 待挂载的子目录,留空则挂载根目录 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS Bucket所在地域的Endpoint authType: rrsa roleName: demo-role-for-rrsa # 此前创建的RAM角色 fuseType: ossfs2 volumeAs: sharepath otherOpts: "-o close_to_open=false" provisioner: ossplugin.csi.alibabacloud.com # 固定为此值 reclaimPolicy: Retain # 动态创建PV的回收策略,当前仅支持Retain,即删除PVC时,PV和OSS Bucket中的数据不会被删除 volumeBindingMode: Immediate # 卷绑定模式。OSS存储卷无需考虑可用区间节点亲和,使用默认值Immediate即可
parameters
参数说明:参数
是否必选
说明
bucket
必选
待挂载的OSS Bucket。
path
必选
Bucket内的基础路径。当
volumeAs
配置为sharepath
时,每个动态创建的PV都会在此路径下被分配一个唯一的子目录(例如/ack/<pv-name>
)。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
。
fuseType
必选
使用ossfs 2.0客户端时,固定为
ossfs2
。authType
必选
配置为
rrsa
,声明使用RRSA方式鉴权。roleName
必选
配置为此前创建或修改的RAM角色名称。
如需为不同PV配置不同权限,可创建不同的RAM角色,并在PV中配置不同的
roleName
。volumeAs
可选
定义PV的供应方式。
sharepath
表示每个PV都将在path
指定的目录下创建一个独立的子目录。otherOpts
可选
为OSS存储卷输入定制化参数,格式为
-o *** -o ***
,例如-o close_to_open=false
。close-to-open
:默认为关闭。开启后,每次打开文件时,系统会主动向OSS发送GetObjectMeta请求,以获取文件在OSS中的最新元数据信息,从而确保元数据的实时性。但在需要大量读取小文件的场景下,频繁的元数据查询会显著增加访问延迟。更多可选参数,请参见ossfs 2.0挂载选项说明。
创建StorageClass。
kubectl create -f ossfs2-sc-rrsa.yaml
确认StorageClass状态。
kubectl get sc ossfs2-sc
预期输出:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ossfs2-sc ossplugin.csi.alibabacloud.com Retain Immediate 10s
步骤四:创建PVC
创建PVC,从StorageClass申请存储资源。此操作将触发底层PV的自动创建。
修改以下YAML,保存为ossfs2-pvc-dynamic.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC名称 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc # 此前创建的StorageClass
创建PVC。
kubectl create -f ossfs2-pvc-dynamic.yaml
确认PVC和PV状态。
kubectl get pvc pvc-ossfs2
预期输出中,PVC的状态为
Bound
,表明已成功绑定到自动创建的PV。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-ossfs2 Bound d-bp17y03tpy2b8x****** 20Gi RWX ossfs2-sc 25s
步骤五:创建应用并挂载存储卷
PVC创建后,可将其绑定的存储资源挂载到应用中。
使用以下YAML,创建
ossfs2-test.yaml
。以下YAML示例创建包含1个Pod的StatefulSet,Pod通过名为
pvc-ossfs2
的PVC申请存储资源,挂载路径为/data
。创建StatefulSet并挂载存储卷。
kubectl create -f ossfs2-test.yaml
查看Pod部署情况。
kubectl get pod -l app=ossfs2-test
预期输出:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m
验证应用是否能正常访问OSS数据。
# 向挂载点写入一个测试文件 kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # 查看挂载点内容 kubectl exec -it ossfs2-test-0 -- ls /data
预期输出中,可以看到刚刚创建的
test.txt
文件,表明挂载成功且具备写权限。
方式二:通过RAM用户AccessKey鉴权方式挂载
ACK也支持通过创建包含静态AccessKey的Secret,来为应用挂载OSS存储卷进行授权。此方式适用于为特定应用授予长期、固定OSS访问权限的业务场景。
如果PV所引用的AccessKey被撤销或权限变更,正在使用该存储卷的应用将失去访问权限并报权限错误。恢复访问时,需先更新Secret中的凭证,然后重启应用Pod来强制重新挂载。此过程将导致业务服务短暂中断,请在维护窗口操作。
为避免由于AccessKey轮转导致业务中断,建议通过RRSA鉴权方式挂载。
前提条件
集群的存储组件为CSI,且CSI组件版本为v1.33.1及以上。如需升级,请参见升级csi-plugin和csi-provisioner。
已创建OSS Bucket,且Bucket与集群属于同一阿里云账号。
如需跨账号挂载OSS Bucket,建议通过RRSA鉴权方式实现,请参见如何跨账号挂载OSS Bucket?。
步骤一:创建具有OSS访问权限的RAM用户并获取AccessKey
创建RAM用户并授权
创建RAM用户,如已创建可跳过。具体操作,请参见创建RAM用户。
创建如下OSS访问的自定义权限策略。具体操作,请参见创建自定义权限策略。
以下只读和读写权限策略请根据使用需求选择,并替换
mybucket
为您实际创建的Bucket名称。OSS只读权限策略
OSS读写权限
(可选)若您使用KMS托管的指定CMK ID加密OSS Object,还需要为该RAM用户配置KMS权限。具体操作,请参见加密操作。
为RAM用户添加OSS权限。具体操作,请参见为RAM用户授权。
为RAM用户创建AccessKey。具体操作,请参见获取AccessKey。
使用 AccessKey 创建 Secret
使用以下命令创建用于 OSS 鉴权的 Secret。将 akId
和akSecret
替换为真实凭证。
kubectl create -n default secret generic oss-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'
步骤二:创建StorageClass
修改以下YAML,保存为ossfs2-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc parameters: # 使用准备工作中创建的Secret。 csi.storage.k8s.io/node-publish-secret-name: oss-secret csi.storage.k8s.io/node-publish-secret-namespace: default fuseType: ossfs2 bucket: cnfs-oss-test # Bucket名称 path: /subpath # 待挂载的子目录,留空则挂载根目录 url: oss-cn-hangzhou-internal.aliyuncs.com # OSS Bucket所在地域的Endpoint otherOpts: "-o close_to_open=false" provisioner: ossplugin.csi.alibabacloud.com # 固定为此值 reclaimPolicy: Retain # 动态创建PV的回收策略,当前仅支持Retain,即删除PVC时,PV和OSS Bucket中的数据不会被删除 volumeBindingMode: Immediate # 卷绑定模式。OSS存储卷无需考虑可用区间节点亲和,使用默认值Immediate即可
parameters
参数说明:配置Secret
参数
是否必选
说明
csi.storage.k8s.io/node-publish-secret-name
必选
存储AccessKey信息的Secret名称。
csi.storage.k8s.io/node-publish-secret-namespace
必选
存储AccessKey信息的Secret所在的命名空间。
配置存储卷
参数
是否必选
说明
fuseType
必选
使用ossfs 2.0客户端时,固定为
ossfs2
。bucket
必选
需要挂载的OSS Bucket。
path
可选
OSS Bucket挂载路径,表示挂载时相对Bucket根文件的目录结构。
url
必选
挂载OSS的Endpoint,Endpoint以OSS控制台Bucket概览页为准。
挂载节点和Bucket相同地域,或已打通VPC网络时,请使用内网地址。
挂载节点和Bucket不同地域时,请使用外网地址。
不同访问端口的常见填写格式如下:
内网格式:
http://oss-{{regionName}}-internal.aliyuncs.com
或https://oss-{{regionName}}-internal.aliyuncs.com
。外网格式:
http://oss-{{regionName}}.aliyuncs.com
或https://oss-{{regionName}}.aliyuncs.com
。
重要vpc100-oss-{{regionName}}.aliyuncs.com
的内网访问端口格式已废弃,请及时切换。otherOpts
可选
为OSS存储卷输入定制化参数,格式为
-o *** -o ***
,例如-o close_to_open=false
。close-to-open:默认为关闭。开启后,每次打开文件时,系统会主动向OSS发送GetObjectMeta请求,以获取文件在OSS中的最新元数据信息,从而确保元数据的实时性。但在需要大量读取小文件的场景下,频繁的元数据查询会显著增加访问延迟。
更多可选参数,请参见ossfs 2.0挂载选项说明。
创建StorageClass。
kubectl create -f ossfs2-sc.yaml
步骤三:创建PVC
创建PVC,从StorageClass申请存储资源。此操作将触发底层PV的自动创建。
修改以下YAML,保存为ossfs2-pvc-dynamic.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 # PVC名称 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc # 此前创建的StorageClass
创建PVC。
kubectl create -f ossfs2-pvc-dynamic.yaml
确认PVC和PV状态。
kubectl get pvc pvc-ossfs2
预期输出中,PVC的状态为
Bound
,表明已成功绑定到自动创建的PV。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-ossfs2 Bound d-bp17y03tpy2b8x****** 20Gi RWX ossfs2-sc 25s
步骤四:创建应用并挂载存储卷
PVC创建后,可将其绑定的存储资源挂载到应用中。
使用以下YAML,创建
ossfs2-test.yaml
。以下YAML示例创建包含1个Pod的StatefulSet,Pod通过名为
pvc-ossfs2
的PVC申请存储资源,挂载路径为/data
。创建StatefulSet并挂载存储卷。
kubectl create -f ossfs2-test.yaml
查看Pod部署情况。
kubectl get pod -l app=ossfs2-test
预期输出:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m
验证应用是否能正常访问OSS数据。
# 向挂载点写入一个测试文件 kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # 查看挂载点内容 kubectl exec -it ossfs2-test-0 -- ls /data
预期输出中,可以看到刚刚创建的
test.txt
文件,表明挂载成功且具备写权限。
生产环境使用建议
维度 | 说明 |
安全与权限管理 |
|
性能与成本优化 |
|
运维管理 |