使用ossfs 2.0存储卷

挂载ossfs 2.0存储卷后,业务容器能向访问本地文件一样通过POSIX操作访问OSS数据。ossfs 2.0在顺序读写能力上实现了性能提升(相较于ossfs 1.0),可充分发挥OSS的高带宽优势。本文将介绍如何在ACK集群挂载ossfs 2.0存储卷。

前提条件

注意事项

  • ossfs 2.0适用于只读及顺序追加写场景。若有更多数据写需求,请使用ossfs 1.0

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

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

  • 建议为挂载OSS存储卷的Pod配置健康检查,当容器内OSS目录不可用时,可自动重启Pod重新挂载OSS。

    说明

    ACK集群升级时会重启kubelet,导致ossfs驱动随之重启,继而造成OSS目录不可用。v1.18.8.45及以上版本的csi-plugincsi-provisioner组件已修复此问题。请及时升级csi-plugincsi-provisioner

  • 当传输的文件大于10 MB时,可以将文件切成碎片,分片上传。分片上传过程中断后,如您不再需要这些碎片,可以手动删除碎片通过生命周期规则删除碎片

准备工作

  1. 创建RAM用户并授权。

    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权限。具体操作,请参见加密操作

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

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

  2. 创建存放鉴权信息的Secret,用于访问OSS数据。

    命令示例如下,请替换akIdakSecret为实际使用的AccessKey。

    kubectl create -n default secret generic oss-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'

步骤一:创建ossfs 2.0存储卷

使用ossfs 2.0静态存储卷

  1. 创建PV。

    1. 修改以下YAML,保存为ossfs2-pv.yaml。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ossfs2
      spec:
        capacity:
          storage: 20Gi
        accessModes:
          - ReadOnlyMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: pv-ossfs2 # 需要和PV名字一致。
          # 使用准备工作中创建的Secret。
          nodePublishSecretRef:
            name: oss-secret
            namespace: default
          volumeAttributes:
            fuseType: ossfs2
            bucket: cnfs-oss-test
            path: /subpath
            url: oss-cn-hangzhou-internal.aliyuncs.com
            otherOpts: "-o close_to_open=false"
      • nodePublishSecretRef参数说明

        参数

        是否必选

        说明

        name

        必选

        存储AccessKey信息的Secret名称。

        namespace

        必选

        存储AccessKey信息的Secret所在的命名空间。

      • volumeAttributes参数说明

        参数

        是否必选

        说明

        fuseType

        必选

        使用ossfs 2.0客户端时,固定为ossfs2

        bucket

        必选

        需要挂载的OSS Bucket。

        path

        可选

        OSS Bucket挂载路径表示挂载时相对Bucket根文件的目录结构。

        url

        必选

        挂载OSSEndpoint,EndpointOSS控制台Bucket概览页为准。

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

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

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

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

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

        重要

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

        otherOpts

        可选

        您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o close_to_open=false

        说明

        close-to-open:默认为关闭。开启后,每次打开文件时,系统会主动向OSS发送GetObjectMeta请求,以获取文件在OSS中的最新元数据信息,从而确保元数据的实时性。但在需要大量读取小文件的场景下,频繁的元数据查询会显著增加访问延迟。

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

    2. 创建PV。

      kubectl create -f ossfs2-pv.yaml
    3. 确认PV状态。

      kubectl get pv pv-ossfs2

      预期返回如下,确认PV的状态为Available

      NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
      pv-ossfs2   20Gi       ROX            Retain           Available                          <unset>                          15s
  2. 创建PVC。

    1. 修改以下YAML,保存为ossfs2-pvc-static.yaml。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-ossfs2
        namespace: default
      spec:
        # 以下配置需要与PV一致
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 20Gi
        volumeName: pv-ossfs2
    2. 创建PVC。

      kubectl create -f ossfs2-pvc-static.yaml
    3. 确认PVC状态。

      kubectl get pvc pvc-ossfs2

      预期返回如下,可以看到PVC已绑定PV。

      NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-ossfs2   Bound    pv-ossfs2   20Gi       ROX                           <unset>                 6s

使用ossfs 2.0动态存储卷

  1. 创建StorageClass。

    1. 修改以下YAML,保存为ossfs2-sc.yaml。

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: ossfs2-test
      parameters:
        # 使用准备工作中创建的Secret。
        csi.storage.k8s.io/node-publish-secret-name: oss-secret  
        csi.storage.k8s.io/node-publish-secret-namespace: default
        fuseType: ossfs2
        bucket: cnfs-oss-test 
        path: /subpath
        url: oss-cn-hangzhou-internal.aliyuncs.com 
        otherOpts: "-o close_to_open=false"
      provisioner: ossplugin.csi.alibabacloud.com
      reclaimPolicy: Retain
      volumeBindingMode: Immediate

      parameters中的相关参数说明如下:

      • 配置Secret

        参数

        是否必选

        说明

        csi.storage.k8s.io/node-publish-secret-name

        必选

        存储AccessKey信息的Secret名称。

        csi.storage.k8s.io/node-publish-secret-namespace

        必选

        存储AccessKey信息的Secret所在的命名空间。

      • 配置存储卷

        参数

        是否必选

        说明

        fuseType

        必选

        使用ossfs 2.0客户端时,固定为ossfs2

        bucket

        必选

        需要挂载的OSS Bucket。

        path

        可选

        OSS Bucket挂载路径表示挂载时相对Bucket根文件的目录结构。

        url

        必选

        挂载OSSEndpoint,EndpointOSS控制台Bucket概览页为准。

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

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

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

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

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

        重要

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

        otherOpts

        可选

        您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***,例如-o close_to_open=false

        说明

        close-to-open:默认为关闭。开启后,每次打开文件时,系统会主动向OSS发送GetObjectMeta请求,以获取文件在OSS中的最新元数据信息,从而确保元数据的实时性。但在需要大量读取小文件的场景下,频繁的元数据查询会显著增加访问延迟。

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

    2. 创建StorageClass。

      kubectl create -f ossfs2-sc.yaml
  2. 创建PVC。

    1. 修改以下YAML,保存为ossfs2-pvc-dynamic.yaml。

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: pvc-ossfs2
        namespace: default
      spec:
        # 仅支持ReadOnlyMany访问模式
        accessModes:
          - ReadOnlyMany
        # 指定StorageClass
        storageClassName: ossfs2-test
        resources:
          requests:
            storage: 20Gi
    2. 创建PVC。

      kubectl create -f ossfs2-pvc-dynamic.yaml
    3. 确认PVC状态。

      kubectl get pvc pvc-ossfs2

      预期返回如下,可以看到PVC已绑定CSI自动创建的PV。

      NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      pvc-ossfs2   Bound    oss-169da564-d720-4819-b765-4653d45a01dc   20Gi       ROX            ossfs2-test    <unset>                 3s

步骤二:创建应用并挂载ossfs2.0 存储卷

  1. 使用以下YAML,创建ossfs2-test.yaml。

    以下YAML示例可以创建包含1PodStatefulSet,Pod通过名为pvc-ossfs2PVC申请存储资源,挂载路径为/data

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: ossfs2-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ossfs2-test
      template:
        metadata:
          labels:
            app: ossfs2-test
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-ossfs2
              mountPath: /data
          volumes:
            - name: pvc-ossfs2
              persistentVolumeClaim:
                claimName: pvc-ossfs2
  2. 创建StatefulSet并挂载ossfs2.0存储卷。

    kubectl create -f ossfs2-test.yaml
  3. 查看StatefulSetPod的部署情况。

    kubectl get pod -l app=strmvol-test

    预期返回:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          12m
  4. 验证应用能正常访问OSS数据。

    kubectl exec -it ossfs2-test-0 -- ls /data

    预期可以看到OSS挂载路径下的数据。

相关文档