如果应用需要存储图片、音视频等非结构化数据,可以使用OSS作为持久化存储卷。本文介绍如何为应用静态挂载OSS存储卷,并验证OSS的共享存储和持久化存储。
注意事项
OSS是一个海量、安全、低成本、高可靠的存储空间,适合存储写入后较少修改的数据,以及非结构化数据(如图片、音视频等)。更多信息,请参见存储概述。
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存储卷
步骤一:创建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 alibabacloud.com/eci: "true" spec: containers: - name: nginx image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine 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
- 本页导读 (1)
- 注意事项
- 创建并获取OSS Bucket信息
- 静态挂载OSS存储卷
- 步骤一:创建PV
- 步骤二:创建PVC
- 步骤三:创建应用并挂载OSS
- 验证OSS的共享存储和持久化存储