如果应用需要存储图片、音视频等非结构化数据,可以使用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-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挂载参数。格式为
-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/compute-class: general-purpose alibabacloud.com/compute-qos: default alibabacloud.com/acs: "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