对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。本文为您介绍如何通过命令行及控制台的方式使用OSS静态存储卷。

前提条件

背景信息

阿里云对象存储服务(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存储卷挂载时间延长
  • 挂载目录path中建议最多存放1000个文件。否则,在文件数量过多时OSSFS会占用大量内存,将导致Pod发生OOM(Out Of Memory)事件。
  • OSSFS PVC和PV适用于并发读场景,不允许作为并发写场景。否则,无法保证数据写入的一致性。
  • 当传输的文件大于10 MB时,可以将文件切成碎片,分片上传。分片上传过程中断后,如您不再需要这些Part,可通过以下方式删除,以免产生额外存储费用。

通过控制台的方式使用OSS静态存储卷

步骤一:创建PV

  1. 登录容器服务管理控制台,在左侧导航栏选择集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷
  3. 存储卷页面单击右上角的创建
  4. 创建存储卷对话框中配置参数。
    配置项说明
    存储卷类型支持云盘/NAS/OSS三种云存储类型。本文中选择为OSS
    名称创建的数据卷的名称。数据卷名在集群内必须唯一。本例为pv-oss
    存储驱动支持Flexvolume和CSI。本文中选择为 CSI
    说明 Flexvolume存储插件已弃用,版本为1.20及以后的集群不支持使用Flexvolume插件。
    总量所创建存储卷的容量。
    访问模式默认为ReadWriteMany。
    访问证书选择访问OSS所需的保密字典。
    • 选择已有保密字典:选择命名空间保密字典
    • 新建保密字典:配置命名空间名称AccessKey IDAccessKey Secret
    可选参数您可以为OSS存储卷输入定制化参数,格式为-o *** -o ***
    Bucket ID您要使用的OSS bucket的名称。单击选择 Bucket,在弹出的对话框中选择所需的bucket并单击选择
    访问域名您可以参考以下情况选择需要的访问域名。
    • 如果Bucket和ECS实例位于不同地域(Region),请选择公网域名
    • 如果Bucket和ECS实例位于相同地域,请选择私网域名
    标签为该存储卷添加标签。
  5. 参数配置完成后,单击创建

步骤二:创建PVC

  1. 登录容器服务管理控制台,在左侧导航栏选择集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储声明
  3. 存储声明页面,单击右上角的创建
  4. 创建存储声明页面中,填写界面参数。
    配置项说明
    存储声明类型支持云盘、NAS、OSS三种云存储类型。本文中选择OSS
    名称创建的数据卷的名称,数据卷名在集群内必须唯一。
    分配模式选择已有存储卷。
    说明 若未创建存储卷,您可以设置分配模式创建存储卷,配置创建存储卷参数。具体操作,请参见步骤一:创建PV
    已有存储卷单击选择已有存储类,在目标存储卷右侧操作列单击选择,选择存储卷。
    总量所创建存储卷的容量。
    说明 所创建的存储卷容量不能超过存储空间容量。
  5. 单击创建
    创建成功后可以在列表中看到csi-oss-pvc,并且已绑定相应的存储卷。

步骤三:创建应用

  1. 登录容器服务管理控制台,在左侧导航栏选择集群
  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态
  3. 无状态页面,单击使用镜像创建
  4. 配置创建应用的参数信息。
    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建无状态工作负载Deployment
    ACK数据卷支持配置本地存储和云存储。
    • 本地存储:支持主机目录(HostPath)、配置项(ConfigMap)、保密字典(Secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息参见volumes
    • 云存储:支持云存储类型。
    本例中配置了一个OSS类型的数据卷,将该OSS存储卷挂载到容器中/tmp 路径下。 数据卷
  5. 所有的信息都配置完成后,单击创建
    创建成功后,您就可以正常使用数据卷。

通过kubectl命令行的方式使用OSS静态存储卷

步骤一:创建静态PV及PVC

您有三种方式配置静态PV及PVC。

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

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

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

    直接在PV中配置AccessKey信息。

  • 方式三:配置PV及PVC的STS权限

    在PV中配置STS进行权限认证。

方式一:使用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:
        - ReadWriteMany
      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 max_stat_cache_size=0 -o allow_other"
          path: "/"
    参数描述
    namePV的名称。
    labels配置PV的标签。
    storageOSS的可使用量。
    accessModes配置访问模式。
    persistentVolumeReclaimPolicyPV回收策略。
    driver定义驱动类型。取值为ossplugin.csi.alibabacloud.com,表示使用OSS CSI插件。
    nodePublishSecretRef定义挂载PV时通过Secret对象来获取AccessKey信息。
    volumeHandle配置PV的名称。
    bucket需要挂载的OSS Bucket。
    url挂载OSS的接入域名。
    • 挂载节点和Bucket相同地域时,请使用私网地址。
    • 挂载节点和Bucket不同地域时,请使用公网地址。
    • 禁止使用VPC网络。

    不同域名访问格式如下:

    • 内网访问域名格式:oss-{{regionName}}-internal.aliyuncs.com
    • 外网访问域名格式:oss-{{regionName}}.aliyuncs.com
    otherOpts挂载OSS时支持输入定制化参数,格式为:-o *** -o ***
    path表示挂载时相对Bucket根文件的目录结构,默认为/(v1.14.8.32-c77e277b-aliyun及之后版本支持)。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏选择存储 > 存储卷。可以在存储卷页面查看到创建的PV。
  3. 执行以下命令创建静态卷PVC。
    kubectl create -f pvc-oss.yaml

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-oss
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-oss
    参数说明
    namePVC的名称。
    accessModes配置访问模式。
    storage声明应用使用量,不能大于存储卷的总量。
    alicloud-pvname通过标签关联PV,与PV标签保持一致。
    在集群管理页左侧导航栏选择存储 > 存储声明,在存储声明页面可以看到创建的PVC。

方式二:配置PV及PVC的AccessKey

方式一:使用Secret创建静态卷PV及PVC是通过Secret为CSI插件提供AccessKey信息,您也可以执行以下命令直接在PV中配置AccessKey信息。

kubectl create -f pv-accesskey.yaml

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

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

方式三:配置PV及PVC的STS权限

除了方式一:使用Secret创建静态卷PV及PVC方式二:配置PV及PVC的AccessKey中使用Secret和使用AccessKey两种方式进行权限认证外。

您还可以在PV中执行以下命令配置STS进行权限认证。

kubectl create -f pv-sts.yaml

以下为配置STS权限认证的pv-sts.yaml示例文件。

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

步骤二:创建应用

创建一个名为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: 1
  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
    2. 执行以下命令,查看/data路径下的文件。
       kubectl exec oss-static-66fbb85b67-d**** ls /data | grep tmpfile
      无返回结果,说明/data路径下无文件。
  2. 执行以下命令,在/data路径下创建文件static
    kubectl exec oss-static-66fbb85b67-d**** touch /data/tmpfile
  3. 执行以下命令,查看/data路径下的文件。
    kubectl exec oss-static-66fbb85b67-d**** ls /data | grep tmpfile

    预期输出:

    tmpfile
  4. 执行以下命令,删除名称为oss-static-66fbb85b67-d****的Pod。
    kubectl delete pod oss-static-66fbb85b67-d****

    预期输出:

    pod "oss-static-66fbb85b67-d****" deleted
  5. 同时在另一个窗口中,执行以下命令,查看Pod删除及重建Pod的过程。
    kubectl get pod -w -l app=nginx

    预期输出:

    NAME                            READY   STATUS            RESTARTS   AGE
    nginx-static-78c7dcb9d7-g****   2/2     Running           0          50s
    nginx-static-78c7dcb9d7-g****   2/2     Terminating       0          72s
    nginx-static-78c7dcb9d7-h****   0/2     Pending           0          0s
    nginx-static-78c7dcb9d7-h****   0/2     Pending           0          0s
    nginx-static-78c7dcb9d7-h****   0/2     Init:0/1          0          0s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          73s
    nginx-static-78c7dcb9d7-h****   0/2     Init:0/1          0          5s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          78s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          78s
    nginx-static-78c7dcb9d7-h****   0/2     PodInitializing   0          6s
    nginx-static-78c7dcb9d7-h****   2/2     Running           0          8s
  6. 验证删除Pod后,存储空间里创建的文件是否还存在。
    1. 执行以下命令,查看重建的Pod名称。
      kubectl get pod

      预期输出:

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

      预期输出:

      tmpfile
      temfile文件仍然存在,说明OSS的数据可持久化保存。