使用OSS静态存储卷

对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。您可以通过RRSA鉴权或者RAM用户AccessKey鉴权的任一方式进行权限配置并挂载。

前提条件

使用场景

阿里云对象存储服务(OSS)提供海量、安全、低成本、高可靠的云存储服务。OSS支持同时被多个Pod挂载。以下为OSS的使用场景:

  • 对磁盘I/O要求低。

  • 配置文件、图片、小视频等共享业务。

注意事项

  • OSS不支持动态创建PV,也不建议跨账号使用。

  • 容器服务Kubernetes集群升级会重启kubelet,ossfs驱动跟随一起重启,导致OSS目录不可用。此时使用OSS的Pod需要重建,可在YAML文件中增加健康检查的配置,在容器内OSS目录不可用时自动重启Pod,重新挂载OSS。

    说明

    如果您使用的是v1.18.8.45及以上版本的csi-plugin和csi-provisioner插件,则不会出现上述问题。

  • 若您在应用模板中配置了securityContext.fsgroup参数,kubelet在存储卷挂载完成后会执行chmodchown操作,导致挂载时间延长。

    说明

    若您已配置securityContext.fsgroup参数,且需要减少挂载时间,请参见OSS存储卷挂载时间延长

  • 通过ossfs进行ls等操作时,将发起HTTP请求到OSS获取文件的meta信息,如果ls的目标目录下文件较多(超过100,000个,该数值与机器内存大小相关),ossfs将消耗大量系统内存,可能导致Pod发生OOM(Out Of Memory)事件。您可以通过挂载OSS Bucket的子目录,或对文件较多的目录进行目录分级解决此问题。

  • ossfs适用于并发读场景,建议您配置PVC和PV的访问模式为ReadOnlyMany。若需写入数据,建议您通过OSS SDK、ossutil工具等方式实现数据读写分离。具体操作,请参见OSS存储读写分离最佳实践

    说明

    配置OSS存储卷的访问模式为ReadWriteMany,通过ossfs进行写操作时需要注意以下事项:

    • 在并发写场景中,ossfs无法保证数据写入的一致性。

    • 挂载状态下,登录应用Pod或宿主机,在挂载路径下删除或变更文件,都会直接删除或变更OSS Bucket中对应的源文件。您可以通过开启OSS Bucket的版本控制,避免误删除重要数据,请参见版本控制概述

  • 当传输的文件大于10 MB时,可以将文件切成碎片,分片上传。分片上传过程中断后,如您不再需要这些Part,可通过以下方式删除,以免产生额外存储费用。

通过RRSA鉴权方式挂载

基于适用于服务账户的RAM角色(RAM Roles for Service Accounts,简称RRSA)功能,您可以在集群内实现PV维度的OpenAPI权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。更多RRSA的背景信息,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离

说明

RRSA功能目前仅支持1.26及以上版本的集群,即ACK集群基础版、ACK集群Pro版、ACK Serverless集群基础版和ACK Serverless集群Pro版,且集群使用的CSI组件版本为1.30.4及以上版本。若您在1.30.4版本之前使用了RRSA功能,请尽快参考【产品变更】CSI ossfs版本升级与挂载流程优化增加RAM角色授权配置。

(可选)步骤一:创建RAM角色

如果您在集群中首次使用RRSA功能,需要按照以下步骤操作,如果您已经在集群中使用过RRSA鉴权方式挂载OSS存储卷,则可以跳过本步骤。

  1. 容器服务管理控制台启用RRSA功能。具体操作,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离

  2. 为OSS存储卷RRSA鉴权新建RAM角色,即使用RRSA功能扮演的指定角色。

    创建可信实体类型为身份供应商的RAM角色,以demo-role-for-rrsa为例。

    1. 使用阿里云账号登录RAM控制台

    2. 在左侧导航栏,选择身份管理 > 角色,然后在角色页面,单击创建角色

    3. 创建角色面板,选择可信实体类型为身份提供商,然后单击下一步

    4. 配置角色页面,配置如下角色信息后,单击完成

      本示例配置如下。

      配置项

      描述

      角色名称

      demo-role-for-rrsa。

      备注

      选填有关该角色的备注信息。

      身份提供商类型

      OIDC

      选择身份提供商

      ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。

      限制条件

      • oidc:iss:保持默认。

      • oidc:aud:选择sts.aliyuncs.com

      • oidc:sub:条件判定方式选择StringEquals,此处需要填入system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs

步骤二:为demo-role-for-rrsa角色授权

  1. 创建如下OSS访问的自定义权限策略。具体操作,请参见创建自定义权限策略

    以下权限策略中,请替换mybucket为您实际创建的Bucket名称。

    • OSS只读权限策略

      展开查看OSS只读权限策略内容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS读写权限

      展开查看OSS读写权限策略内容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  2. (可选)若您使用KMS托管的指定CMK ID加密OSS Object,还需要为该RAM用户配置KMS权限。具体操作,请参见为OSS存储卷加密

  3. 为demo-role-for-rrsa角色授权。具体操作,请参见为RAM角色授权

    说明

    您也可以通过修改RAM角色信任策略的方式使用已有的授权了OSS权限的RAM角色。具体操作,请参见使用已存在的RAM角色并授权

步骤三:创建PV和PVC

  1. 配置PV使用RRSA鉴权。

    1. 使用以下内容,创建配置RRSA权限认证的pv-rrsa.yaml示例文件。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-oss
        labels:    
          alicloud-pvname: pv-oss
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadOnlyMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: pv-oss # 需要和PV名字一致。
          volumeAttributes:
            bucket: "oss"
            url: "oss-cn-hangzhou.aliyuncs.com"
            otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
            authType: "rrsa"
            roleName: "demo-role-for-rrsa"

      参数

      描述

      name

      PV的名称。

      labels

      配置PV的标签。

      storage

      OSS的可使用量。

      accessModes

      配置访问模式,支持ReadOnlyMany和ReadWriteMany。

      选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

      persistentVolumeReclaimPolicy

      PV回收策略。

      driver

      定义驱动类型。取值为ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。

      volumeHandle

      配置PV的名称。

      bucket

      需要挂载的OSS Bucket。

      url

      挂载OSS的Endpoint

      • 挂载节点和Bucket相同地域,或已打通VPC网络时,请使用内网地址。

      • 挂载节点和Bucket不同地域时,请使用外网地址。

      不同访问端口的常见填写格式如下:

      • 内网格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

      • 外网格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

      重要
      • 实际Endpoint以OSS控制台Bucket概述页为准。

      • vpc100-oss-{{regionName}}.aliyuncs.com的内网访问端口格式已废弃,请及时切换。

      otherOpts

      您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

      umask:用于更改ossfs读文件的权限。例如,设置umask=022后,ossfs文件的权限都会变更为755。通过SDK、OSS控制台等其他方式上传的文件在ossfs中默认权限均为640。因此,建议您在读写分离场景中配置umask权限。

      max_stat_cache_size:用于指定文件元数据的缓存空间,可缓存多少个文件的元数据。元数据缓存可加快ls操作速度。但若通过OSS、SDK、控制台、ossutil等方式修改文件,可能会导致元数据未被及时更新。

      allow_other:赋予计算机上其他用户访问挂载目录的权限,但不包含目录内的文件。

      更多可选参数,请参见ossfs挂载选项说明

      path

      表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。

      ossfs 1.91版本前,该路径需在OSS侧预先创建,详情请参考ossfs 1.91及以上版本新功能介绍及性能压测

      authType

      配置为rrsa,声明使用RRSA方式鉴权。

      roleName

      配置为以上(可选)步骤一:创建RAM角色中已创建或修改的RAM角色名称。若您需要为不同的PV配置不同的权限,可以创建不同的RAM角色,在PV中配置不同的roleName。

      说明

      如果您需要在RRSA鉴权方式中使用指定的ARNs或ServiceAccount,相关操作,请参见如何在RRSA鉴权方式中使用指定的ARNs或ServiceAccount?

    2. 执行以下命令,在PV中配置RRSA进行权限认证。

      kubectl create -f pv-rrsa.yaml
  2. 执行以下命令创建静态卷PVC。

    kubectl create -f pvc-oss.yaml

    以下为创建静态卷PVC的pvc-oss.yaml示例文件。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    参数

    说明

    name

    PVC的名称。

    accessModes

    配置访问模式,支持ReadOnlyMany和ReadWriteMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    storage

    声明应用使用量,不能大于存储卷的总量。

    alicloud-pvname

    通过标签关联PV,与PV标签保持一致。

    在集群管理页左侧导航栏选择存储 > 存储声明,在存储声明页面可以看到创建的PVC。

步骤四:创建应用

创建一个名为oss-static的应用并挂载PVC。

执行以下命令创建oss-static.yaml

kubectl create -f oss-static.yaml

以下为创建应用oss-static.yaml示例文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oss-static
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - name: pvc-oss
            mountPath: "/data"
          - name: pvc-oss
            mountPath: "/data1"
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - cd /data
          initialDelaySeconds: 30
          periodSeconds: 30
      volumes:
        - name: pvc-oss
          persistentVolumeClaim:
            claimName: pvc-oss
  • livenessProbe:配置健康检查。更多信息,请参见OSS存储卷概述

  • mountPath:OSS在容器中挂载的位置。

  • claimName:PVC的名称,用于绑定PVC。

通过RAM用户AccessKey鉴权方式挂载

通过控制台方式使用

步骤一:创建具有OSS访问权限的RAM用户并获取AccessKey

  1. 创建RAM用户。具体操作,请参见创建RAM用户

  2. 创建如下OSS访问的自定义权限策略。具体操作,请参见创建自定义权限策略

    以下权限策略中,请替换mybucket为您实际创建的Bucket名称。

    • OSS只读权限策略

      展开查看OSS只读权限策略内容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS读写权限

      展开查看OSS读写权限策略内容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  3. (可选)若您使用KMS托管的指定CMK ID加密OSS Object,还需要为该RAM用户配置KMS权限。具体操作,请参见为OSS存储卷加密

  4. 为RAM用户添加OSS权限。具体操作,请参见为RAM用户授权

  5. 为RAM用户创建AccessKey。具体操作,请参见获取AccessKey

重要
  • 通过控制台方式仅支持使用AccessKey鉴权,如果OSS存储卷引用的AccessKey失效,或授权被取消,已经挂载该卷的应用将无权访问OSS并报权限错误。为修复权限错误,您需要修改secret中的AccessKey信息并重新挂载,此操作将导致应用重启。AccessKey吊销后ossfs重挂载流程,请参见OSS存储挂载权限问题中场景4的解决方案。

  • 如您有定期轮转AccessKey的需求,请参见通过RRSA鉴权方式挂载

步骤二:创建PV

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  3. 存储卷页面,单击右上角的创建

  4. 创建存储卷对话框中配置参数。

    配置项

    说明

    存储卷类型

    支持云盘、NAS、OSS三种云存储类型。本文中选择为OSS

    名称

    创建的数据卷的名称。数据卷名在集群内必须唯一。本例为pv-oss

    总量

    所创建存储卷的容量。

    访问模式

    支持ReadOnlyMany和ReadWriteMany,默认为ReadOnlyMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    访问证书

    选择访问OSS所需的保密字典,即步骤一获取的AccessKey ID和AccessKey Secret。

    • 选择已有保密字典:选择命名空间保密字典

    • 新建保密字典:配置命名空间名称AccessKey IDAccessKey Secret

    可选参数

    您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用于更改ossfs读文件的权限。例如,设置umask=022后,ossfs文件的权限都会变更为755。通过SDK、OSS控制台等其他方式上传的文件在ossfs中默认权限均为640。因此,建议您在读写分离场景中配置umask权限。

    max_stat_cache_size:用于指定文件元数据的缓存空间,可缓存多少个文件的元数据。元数据缓存可加快ls操作速度。但若通过OSS、SDK、控制台、ossutil等方式修改文件,可能会导致元数据未被及时更新。

    allow_other:赋予计算机上其他用户访问挂载目录的权限,但不包含目录内的文件。

    更多可选参数,请参见ossfs挂载选项说明

    Bucket ID

    您要使用的OSS Bucket的名称。单击选择 Bucket,在弹出的对话框中选择所需的bucket并单击选择

    访问域名

    您可以参考以下情况选择需要的访问域名。

    • 如果Bucket和ECS实例位于不同地域(Region),请选择公网域名

    • 如果Bucket和ECS实例位于相同地域,请选择私网域名

      说明

      通过私网访问时,默认使用HTTP协议。若您需要指定网络传输协议为HTTPS,可使用kubectl命令行方式创建静态PV。

    标签

    为该存储卷添加标签。

  5. 参数配置完成后,单击创建

步骤三:创建PVC

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击右上角的创建

  3. 创建存储声明页面中,填写界面参数。

    配置项

    说明

    存储声明类型

    支持云盘、NAS、OSS三种云存储类型。本文选择OSS

    名称

    创建的数据卷的名称,在集群内必须唯一。

    分配模式

    选择已有存储卷。

    说明

    若未创建存储卷,您可以设置分配模式创建存储卷,配置创建存储卷参数。具体操作,请参见步骤二:创建PV

    已有存储卷

    单击选择已有存储类,在目标存储卷右侧操作列,单击选择,选择存储卷。

    总量

    所创建存储卷的容量。

    说明

    所创建的存储卷容量不能超过存储空间容量。

  4. 单击创建

    创建成功后可以在列表中看到csi-oss-pvc,并且已绑定相应的存储卷。

步骤四:创建应用

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  2. 无状态页面,单击使用镜像创建

  3. 配置创建应用的参数信息。

    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment

    ACK数据卷支持配置本地存储和云存储。

    • 本地存储:支持主机目录(HostPath)、配置项(ConfigMap)、保密字典(Secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息请参见volumes

    • 云存储:支持云存储类型。

    本例中配置了一个OSS类型的数据卷,将该OSS存储卷挂载到容器中/tmp 路径下。 数据卷

  4. 所有的信息都配置完成后,单击创建

    创建成功后,您就可以正常使用数据卷。

通过kubectl方式使用

步骤一:创建具有OSS访问权限的RAM用户并获取AccessKey

  1. 创建RAM用户。具体操作,请参见创建RAM用户

  2. 创建如下OSS访问的自定义权限策略。具体操作,请参见创建自定义权限策略

    以下权限策略中,请替换mybucket为您实际创建的Bucket名称。

    • OSS只读权限策略

      展开查看OSS只读权限策略内容

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
    • OSS读写权限

      展开查看OSS读写权限策略内容

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ],
              }
          ],
          "Version": "1"
      }
  3. (可选)若您使用KMS托管的指定CMK ID加密OSS Object,还需要为该RAM用户配置KMS权限。具体操作,请参见为OSS存储卷加密

  4. 为RAM用户添加OSS权限。具体操作,请参见为RAM用户授权

  5. 为RAM用户创建AccessKey。具体操作,请参见获取AccessKey

步骤二:创建PV和PVC

您可以通过以下方式创建PV和PVC。

  • 方式一:使用Secret创建PV及PVC

    通过Secret为CSI组件提供AccessKey信息。

    重要
    • 使用该方式挂载时,如果OSS存储卷引用的AccessKey被撤销或取消授权,已经挂载了存储卷的应用将无权访问OSS并报权限错误。您需要修改Secret中的AccessKey信息并重新挂载,此操作将导致应用重启。AccessKey吊销后ossfs重挂载流程,请参见OSS存储挂载权限问题中场景4的解决方案。

    • 如果有定期轮转AccessKey的需求建议您通过RRSA鉴权方式挂载

  • 方式二:配置PV及PVC的AccessKey

    直接在PV中配置AccessKey信息。

    重要
    • 使用该方式挂载时,如果OSS存储卷引用的AccessKey被撤销或取消授权,已经挂载了存储卷的应用将无权访问OSS并报权限错误。您需要重建PV中的AccessKey信息并重新部署应用。

    • 如果有定期轮转AccessKey的需求建议您通过RRSA鉴权方式挂载

方式一:使用Secret创建静态卷PV及PVC

  1. 创建Secret。

    以下为通过Secret配置AccessKey信息的YAML示例文件。

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
      namespace: default
    stringData:
      akId: <yourAccessKey ID>
      akSecret: <yourAccessKey Secret>
    说明

    创建Secret选择的Namespace需要和应用所在的Namespace一致。

    本示例中,akIdakSecret需要替换为步骤一获取的AccessKey ID和AccessKey Secret。

  2. 执行以下命令创建静态卷PV。

    kubectl create -f pv-oss.yaml

    以下为创建静态卷PV的pv-oss.yaml示例文件。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-oss
      labels:
        alicloud-pvname: pv-oss
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: pv-oss # 需要和PV名字一致。
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-hangzhou.aliyuncs.com"
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          path: "/"

    参数

    描述

    name

    PV的名称。

    labels

    配置PV的标签。

    storage

    OSS的可使用量。

    accessModes

    配置访问模式,支持ReadOnlyMany和ReadWriteMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    persistentVolumeReclaimPolicy

    PV回收策略。

    driver

    定义驱动类型。取值为ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。

    nodePublishSecretRef

    定义挂载PV时通过Secret对象来获取AccessKey信息。

    volumeHandle

    配置PV的名称。

    bucket

    需要挂载的OSS Bucket。

    url

    挂载OSS的Endpoint

    • 挂载节点和Bucket相同地域,或已打通VPC网络时,请使用内网地址。

    • 挂载节点和Bucket不同地域时,请使用外网地址。

    不同访问端口的常见填写格式如下:

    • 内网格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

    • 外网格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

    重要
    • 实际Endpoint以OSS控制台Bucket概述页为准。

    • vpc100-oss-{{regionName}}.aliyuncs.com的内网访问端口格式已废弃,请及时切换。

    otherOpts

    您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用于更改ossfs读文件的权限。例如,设置umask=022后,ossfs文件的权限都会变更为755。通过SDK、OSS控制台等其他方式上传的文件在ossfs中默认权限均为640。因此,建议您在读写分离场景中配置umask权限。

    max_stat_cache_size:用于指定文件元数据的缓存空间,可缓存多少个文件的元数据。元数据缓存可加快ls操作速度。但若通过OSS、SDK、控制台、ossutil等方式修改文件,可能会导致元数据未被及时更新。

    allow_other:赋予计算机上其他用户访问挂载目录的权限,但不包含目录内的文件。

    更多可选参数,请参见ossfs挂载选项说明

    path

    表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。

    ossfs 1.91版本前,该路径需在OSS侧预先创建,详情请参考ossfs 1.91及以上版本新功能介绍及性能压测

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

      存储卷页面,可查看已创建的PV。

  3. 执行以下命令创建静态卷PVC。

    kubectl create -f pvc-oss.yaml

    以下为创建静态卷PVC的pvc-oss.yaml示例文件。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    参数

    说明

    name

    PVC的名称。

    accessModes

    配置访问模式,支持ReadOnlyMany和ReadWriteMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    storage

    声明应用使用量,不能大于存储卷的总量。

    alicloud-pvname

    通过标签关联PV,与PV标签保持一致。

    在集群管理页左侧导航栏选择存储 > 存储声明,在存储声明页面可以看到创建的PVC。

方式二:配置PV及PVC的AccessKey

  1. 执行以下命令,直接在PV中配置AccessKey信息。

    kubectl create -f pv-accesskey.yaml

    以下为配置AccessKey信息的pv-accesskey.yaml示例文件。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-oss
      labels:
        alicloud-pvname: pv-oss
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: pv-oss # 需要和PV名字一致。
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-hangzhou.aliyuncs.com"
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          akId: "***"
          akSecret: "***"

    参数

    描述

    name

    PV的名称。

    labels

    配置PV的标签。

    storage

    OSS的可使用量。

    accessModes

    配置访问模式,支持ReadOnlyMany和ReadWriteMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    persistentVolumeReclaimPolicy

    PV回收策略。

    driver

    定义驱动类型。取值为ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。

    volumeHandle

    配置PV的名称。

    bucket

    需要挂载的OSS Bucket。

    url

    挂载OSS的Endpoint

    • 挂载节点和Bucket相同地域,或已打通VPC网络时,请使用内网地址。

    • 挂载节点和Bucket不同地域时,请使用外网地址。

    不同访问端口的常见填写格式如下:

    • 内网格式:http://oss-{{regionName}}-internal.aliyuncs.comhttps://oss-{{regionName}}-internal.aliyuncs.com

    • 外网格式:http://oss-{{regionName}}.aliyuncs.comhttps://oss-{{regionName}}.aliyuncs.com

    重要
    • 实际Endpoint以OSS控制台Bucket概述页为准。

    • vpc100-oss-{{regionName}}.aliyuncs.com的内网访问端口格式已废弃,请及时切换。

    otherOpts

    您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o umask=022 -o max_stat_cache_size=0 -o allow_other

    umask:用于更改ossfs读文件的权限。例如,设置umask=022后,ossfs文件的权限都会变更为755。通过SDK、OSS控制台等其他方式上传的文件在ossfs中默认权限均为640。因此,建议您在读写分离场景中配置umask权限。

    max_stat_cache_size:用于指定文件元数据的缓存空间,可缓存多少个文件的元数据。元数据缓存可加快ls操作速度。但若通过OSS、SDK、控制台、ossutil等方式修改文件,可能会导致元数据未被及时更新。

    allow_other:赋予计算机上其他用户访问挂载目录的权限,但不包含目录内的文件。

    更多可选参数,请参见ossfs挂载选项说明

    path

    表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。

    ossfs 1.91版本前,该路径需在OSS侧预先创建,详情请参考ossfs 1.91及以上版本新功能介绍及性能压测

    akId

    配置为上一步获取的AccessKey ID。

    akSecret

    配置为上一步获取的AccessKey Secret。

  2. 执行以下命令创建静态卷PVC。

    kubectl create -f pvc-oss.yaml

    以下为创建静态卷PVC的pvc-oss.yaml示例文件。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss

    参数

    说明

    name

    PVC的名称。

    accessModes

    配置访问模式,支持ReadOnlyMany和ReadWriteMany。

    选择ReadOnlyMany时,ossfs将以只读模式挂载OSS Bucket。

    storage

    声明应用使用量,不能大于存储卷的总量。

    alicloud-pvname

    通过标签关联PV,与PV标签保持一致。

    在集群管理页左侧导航栏选择存储 > 存储声明,在存储声明页面可以看到创建的PVC。

步骤三:创建应用

创建一个名为oss-static的应用并挂载PVC。

执行以下命令创建oss-static.yaml

kubectl create -f oss-static.yaml

以下为创建应用oss-static.yaml示例文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: oss-static
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
          - name: pvc-oss
            mountPath: "/data"
          - name: pvc-oss
            mountPath: "/data1"
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - cd /data
          initialDelaySeconds: 30
          periodSeconds: 30
      volumes:
        - name: pvc-oss
          persistentVolumeClaim:
            claimName: pvc-oss
  • livenessProbe:配置健康检查。更多信息,请参见OSS存储卷概述

  • mountPath:OSS在容器中挂载的位置。

  • claimName:PVC的名称,用于绑定PVC。

验证OSS的持久化存储和共享存储

  1. 查看部署oss-static应用的Pod和OSS文件。

    1. 执行以下命令,查看部署的oss-static应用所在Pod的名称。

      kubectl get pod

      预期输出:

      NAME                             READY   STATUS    RESTARTS   AGE
      oss-static-66fbb85b67-d****      1/1     Running   0          1h
      oss-static-66fbb85b67-l****      1/1     Running   0          1h
    2. 创建tmpfile文件。

      • 若以ReadWriteMany方式挂载,执行以下命令,在/data路径下创建tmpfile文件。

        kubectl exec oss-static-66fbb85b67-d**** -- touch /data/tmpfile
        kubectl exec oss-static-66fbb85b67-l**** -- touch /data/tmpfile
      • 若以ReadOnlyMany方式挂载,可通过OSS控制台cp(上传文件)等方式上传tmpfile文件至OSS Bucket对应路径。

  2. 执行以下命令,查看oss-static-66fbb85b67-d****中/data路径,以及oss-static-66fbb85b67-l****中/data1下的文件。

    kubectl exec oss-static-66fbb85b67-d**** -- ls /data | grep tmpfile
    kubectl exec oss-static-66fbb85b67-l**** -- ls /data1 | grep tmpfile

    预期输出:

    tmpfile

    预期输出表明,两个Pod的挂载路径下均存在此文件,说明两个Pod共享数据。

    说明

    若您无法看到预期输出,请确认CSI组件版本为v1.20.7及以上版本。更多信息,请参见csi-plugin

  3. 执行以下命令,删除名称为oss-static-66fbb85b67-d****的Pod。

    kubectl delete pod oss-static-66fbb85b67-d****

    预期输出:

    pod "oss-static-66fbb85b67-d****" deleted
  4. 验证Pod删除后,存储空间里创建的文件是否还存在。

    1. 执行以下命令,查看重建的Pod名称。

      kubectl get pod

      预期输出:

      NAME                             READY   STATUS    RESTARTS   AGE
      oss-static-66fbb85b67-l****      1/1     Running   0          1h
      oss-static-66fbb85b67-z****      1/1     Running   0          40s
    2. 执行以下命令,查看/data路径下的文件。

      kubectl exec oss-static-66fbb85b67-z**** -- ls /data | grep tmpfile

      预期输出:

      tmpfile

      预期输出表明,temfile文件仍然存在,说明OSS的数据可持久化保存。