如果应用需要存储图片、音视频等非结构化数据,可以使用OSS作为持久化存储卷。本文介绍如何为应用挂载OSS静态存储卷,并验证OSS的共享存储和持久化存储。
注意事项
OSS是一个海量、安全、低成本、高可靠的存储空间,适合存储写入后较少修改的数据,以及非结构化数据(如图片、音视频等)。更多信息,请参见存储概述。
-
ACS仅支持OSS静态存储卷,暂不支持OSS动态存储卷。
-
随机或者追加写文件实际为在本地生成新文件重新上传至OSS服务端,由于OSS存储特性,请注意以下事项:
-
文件、文件夹的rename操作非原子。
-
请尽量避免并发多写,或直接在挂载路径下进行压缩、解压缩等操作。
重要多写场景依赖用户自行协调各个客户端的行为。对于写操作导致的元数据和数据的不一致性问题,ACS不承诺保障。
-
创建并获取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 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 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
-