阿里云首页 弹性容器实例 相关技术圈

挂载OSS

OSS是阿里云提供的一个海量、安全、低成本、高可靠的存储空间,适合存储非结构化数据(如图片、音视频等),您可以通过FlexVolume在自建的Kubernetes集群使用阿里云OSS作为Volume。挂载OSS时,仅支持静态数据卷,本文为您介绍如何静态挂载OSS到ECI Pod上。

前提条件

  • 自建Kubernetes集群中已部署VNode。

  • 如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。

注意事项

  • OSS为共享存储,一个OSS可以挂载到多个Pod上。

  • 不支持动态挂载OSS,即OSS不支持动态创建PV。

  • 挂载目录中建议存放的文件数不要超过1000个。文件数量过多时,OSSFS会占用大量内存,可能会导致Pod发生OOM(Out Of Memory)事件。

操作步骤

OSS类型的存储卷目前仅支持静态挂载。

  1. 创建OSS Bucket。

    1. 登录OSS管理控制台

    2. 创建OSS Bucket。

      关于如何创建OSS Bucket,请参见创建存储空间

  2. 选择授权方式。

    • 使用RAM角色授权。

      请创建RAM角色并为该角色授权。创建时,可信实体类型为阿里云服务,角色类型为普通服务角色,受信服务为云服务器;为角色授权时,请选择AliyunOSSFullAccess权限策略。

      具体操作,请参见创建RAM角色为RAM角色授权

    • (不推荐)使用AccessKey直接授权。

      请获取AccessKey ID和AccessKey Secret。具体操作,请参见获取AccessKey

  3. 选择挂载方式,将OSS挂载到ECI实例。

    挂载时,可以采用PVC的方式进行挂载,也可以直接通过FlexVolume进行挂载。

    • 使用PVC挂载

      1. 创建PV。

        将以下内容保存为pv-oss.yaml。

        apiVersion: v1
        kind: PersistentVolume
        metadata:
          name: pv-oss
          labels:
            alicloud-pvname: pv-oss
        spec:
          capacity:
            storage: 20Gi
          accessModes:
            - ReadWriteMany
          persistentVolumeReclaimPolicy: Retain
          flexVolume:
            driver: "alicloud/oss"
            options:
              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

        驱动类型。此处配置为alicloud/oss,表示使用阿里云OSS FlexVolume插件。

        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-oss.yaml后,执行以下命令创建PV。

        kubectl create -f pv-oss.yaml
      2. 创建PVC。

        将以下内容保存为pvc-oss.yaml,然后执行kubectl create命令来创建PVC。

        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: pvc-oss
        spec:
          accessModes:
            - ReadWriteMany
          resources:
            requests:
              storage: 20Gi
          selector:
            matchLabels:
              alicloud-pvname: pv-oss
        kubectl create -f pvc-oss.yaml
      3. 将OSS挂载到ECI实例。

        将以下内容保存为test-oss.yaml,然后执行kubectl create命令来创建Deployment。

        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:
              nodeSelector:    
                k8s.aliyun.com/vnode: "true"
              tolerations:     
              - key: k8s.aliyun.com/vnode
                operator: "Equal"
                value: "true"
                effect: "NoSchedule"
              containers:
              - name: nginx
                image: nginx
                ports:
                - containerPort: 80
                volumeMounts:
                  - name: pvc-oss
                    mountPath: "/data"
              volumes:
                - name: pvc-oss
                  persistentVolumeClaim:
                    claimName: pvc-oss
        kubectl create -f test-oss.yaml
    • 直接挂载

      将以下内容保存为test-oss.yaml,然后执行kubectl create命令来创建Deployment。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test-oss
        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:alpine
              ports:
              - containerPort: 80
              volumeMounts:
                - name: oss
                  mountPath: "/data"
            volumes:
              - name: oss
                flexVolume:
                  driver: "alicloud/oss"
                  options:
                    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>"
  4. 查看结果。

    kubectl get pods -o wide

    预期返回:

    NAME                               READY   STATUS    RESTARTS   AGE     IP              NODE                                  NOMINATED NODE   READINESS GATES
    
    test-oss-6bb586ff5-fx9l4           1/1     Running   0          20s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>
    test-oss-6bb586ff5-lkk8l           1/1     Running   0          22s     172.16.XX.XX    cn-beijing.vnd-2ze8nd8xcl33t4pa****   <none>           <none>

    查看Pod中的文件目录,可以看到已生成OSS对应的挂载目录/data,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用OSS存储。

    fv静态oss