OSS是阿里云提供的一个海量、安全、低成本、高可靠的存储空间,适合存储非结构化数据(如图片、音视频等)。部署阿里云CSI插件后,您可以在自建的Kubernetes集群使用阿里云OSS作为Volume。挂载OSS时,仅支持静态数据卷,本文为您介绍如何使用PVC方式,静态挂载OSS到ECI Pod上。
前提条件
自建Kubernetes集群中已部署VNode。
集群版本为1.16及以上版本,且已部署CSI-Provisioner组件。
重要关于如何部署CSI-Provisioner组件,请参见alibaba-cloud-csi-driver。如果部署过程中出现问题,请在GitHub提交issue。
如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。
注意事项
OSS为共享存储,一个OSS可以挂载到多个Pod上。
不支持动态挂载OSS,即OSS不支持动态创建PV。
挂载目录中建议存放的文件数不要超过1000个。文件数量过多时,OSSFS会占用大量内存,可能会导致Pod发生OOM(Out Of Memory)事件。
操作步骤
OSS类型的存储卷目前仅支持静态挂载。
创建OSS Bucket。
选择授权方式。
使用RAM角色授权。
请创建RAM角色并为该角色授权。创建时,可信实体类型为阿里云服务,角色类型为普通服务角色,受信服务为云服务器;为角色授权时,请选择AliyunOSSFullAccess权限策略。
(不推荐)使用AccessKey直接授权。
请获取AccessKey ID和AccessKey Secret。具体操作,请参见获取AccessKey。
创建PV。
将以下内容保存为oss-pv.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv labels: alicloud-pvname: oss-pv spec: capacity: storage: 25Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv volumeAttributes: bucket: "oss-test" url: "oss-cn-beijing-internal.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other" path: "/" ramRole: "<your RAM Role Name>"
上述示例采用RAM角色来授权。如果您想要使用AccessKey直接授权,请将
ramRole: "<your RAM Role Name>"
替换为以下YAML:akId: "<your AccessKey ID>" akSecret: "<your AccessKey Secret>"
相关参数说明如下表所示:
参数
描述
driver
驱动类型。此处配置为
ossplugin.csi.alibabacloud.com
,表示使用阿里云OSS CSI插件。volumeHandle
PV的唯一标识符,与metadata中定义的name保持一致。
bucket
OSS Bucket的名称。
目前只支持挂载Bucket,不支持挂载Bucket下的子目录或者文件。
url
OSS的接入域名(Endpoint)。
挂载节点(即VNode)和Bucket相同地域时,请使用私网地址。
挂载节点(即VNode)和Bucket不同地域时,请使用公网地址。
otherOpts
挂载OSS时支持输入定制化参数,格式为
-o *** -o ***
,例如:-o max_stat_cache_size=0 -o allow_other
。path
挂载时相对Bucket根文件的目录结构,默认为
/
。ramRole
使用RAM角色授权时,对应的RAM角色。
akId和akSecret
使用AccessKey直接授权时,对应的AccessKey ID和AccessKey Secret。
执行以下命令创建PV。
kubectl create -f oss-pv.yaml
创建PVC。
将以下内容保存为oss-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 25Gi selector: matchLabels: alicloud-pvname: oss-pv
执行以下命令创建PVC。
kubectl create -f oss-pvc.yaml
将OSS挂载到ECI实例。
将以下内容保存为oss-test.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: oss-test labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: k8s.aliyun.com/vnode: "true" tolerations: - key: k8s.aliyun.com/vnode operator: "Equal" value: "true" effect: "NoSchedule" containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 volumeMounts: - name: pvc-oss mountPath: "/data" volumes: - name: pvc-oss persistentVolumeClaim: claimName: oss-pvc
执行以下命令创建Deployment。
kubectl create -f oss-test.yaml
查看结果。
kubectl get pods -o wide
预期返回:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES oss-test-647bf5d6b-ms9fx 1/1 Running 0 21s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none> oss-test-647bf5d6b-rsxrd 1/1 Running 0 21s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none>
查看Pod中的文件目录,可以看到已生成OSS对应的挂载目录
/data
,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用OSS存储。