管理OSS生命周期

容器服务ACK使用CNFS(Container Network File System)对OSS Bucket全生命周期的管理,实现对Bucket层的独立管理。本文介绍如何使用CNFS对OSS Bucket全生命周期的管理及CNFS在工作负载中的应用。

前提条件

功能介绍

您可以通过以下两种方式使用CNFS对OSS全生命周期的管理:

  • 方式一:使用CNFS创建以cnfs-oss-为名称的OSS Bucket

    使用CNFS创建集群唯一的对象存储桶,可以提供动态OSS PV能力。以cnfs-oss-<UUID e.g. clusterid>为名称的OSS Bucket,使用OSS动态存储卷自动挂载创建的OSS Bucket,同时将OSS动态存储卷绑定到工作负载Deployment和StatefulSet中。

  • 方式二:使用已有的OSS Bucket创建CNFS

    使用CNFS指向已经存在的Bucket,可以通过创建一个CNFS CRD并指定对象存储的桶名(BucketName)来完成创建。然后使用OSS静态存储卷或OSS动态存储卷挂载已有的OSS Bucket,同时将创建的OSS静态存储卷或OSS动态存储卷绑定到工作负载Deployment中。

说明

BucketNamecnfs-oss-<UUID e.g. clusterid>说明如下:

  • 如果BucketName已存在,使用Bucket作为ContainerNetworkFileSystem对应的目标Bucket。

  • 如果BucketName不存在,则会创建名称为指定名称的Bucket,并创建相应的ContainerNetworkFileSystem。比如:指定名称为cnfs-oss-<clusterid>,系统会创建Bucket名称为cnfs-oss-<clusterid>的对象存储,其中<clusterid>为ACK集群的ClusterID,保证BucketName全局唯一。

方式一:使用CNFS创建以cnfs-oss-<UUID e.g. clusterid>为名称的OSS Bucket

  1. 执行以下内容,使用CNFS创建以cnfs-oss-<UUID e.g. clusterid>为名称的OSS Bucket,并通过动态存储卷的方式,将OSS Bucket绑定到工作负载Deployment和StatefulSet中。

    替换以下<clusterid>为您的集群ID。

    # 创建CNFS、StorageClass和Deployment、StatefulSet对象。
    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
    stringData:
      akId: "xxxx"     #OSS Bucket挂载时必需的AKSK。
      akSecret: "xxxx"
    ---
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-oss-<clusterid>   #建议CNFS的名称与BucketName一致。
    spec:
      description: "cnfs-oss"
      type: oss
      reclaimPolicy: Retain        #只支持Retain策略,删除CNFS时并不会删除OSS Bucket。
      parameters:
        bucketName: cnfs-oss-<clusterid>  #如果Bucket已存在,会读取Bucket信息。如果Bucket不存在,则会创建名称为cnfs-oss-clusterid的Bucket,ClusterId需要填写为ACK集群的clusterid,来保证BucketName全局唯一。
        encryptType: "AES256"   #如果Bucket已存在,会将Bucket加密方式修改为AES256。如果Bucket不存在,会使用AES256作为加密方式。
        storageType: "Standard"  #OSS Bucket使用标准存储类型。
        aclType: "private"       #OSS Bucket的拥有者和授权用户有该Bucket内的文件的读写权限。
    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-cnfs-oss
    parameters:
      containerNetworkFileSystem: cnfs-oss-<clusterid>   #创建StorageClass时,使用名称为cnfs-oss-clusterid的CNFS的Bucket信息。
      otherOpts: -o max_stat_cache_size=0 -o allow_other #缓存相关操作。
      path: /
      # volumeAs: subpath 在path路径下为自动为每个PV创建子路径
      csi.storage.k8s.io/node-publish-secret-name: oss-secret      #使用oss-secret作为挂载的Secret。
      csi.storage.k8s.io/node-publish-secret-namespace: default    #oss-secret所在的命名空间。
    provisioner: ossplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: cnfs-oss-pvc
    spec:
      accessModes:
        - ReadOnlyMany
      storageClassName: alibabacloud-cnfs-oss   #创建PVC时,使用名称为alibabacloud-cnfs-oss的StoragClass。
      resources:
        requests:
          storage: 100Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cnfs-oss-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: "/data"
              name: cnfs-oss-pvc
          volumes:
          - name: cnfs-oss-pvc   #创建Deployment时,使用名称为cnfs-oss-pvc的PVC。
            persistentVolumeClaim:
              claimName: cnfs-oss-pvc
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cnfs-oss-sts
      labels:
        app: nginx
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: "/data"
              name: www
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadOnlyMany" ]
          storageClassName: "alibabacloud-cnfs-oss"   #创建StatefulSet时,使用名称为cnfs-oss-pvc的PVC。
          resources:
            requests:
              storage: 100Gi
    EOF

    CNFS输入参数说明:

    参数

    说明

    description

    当前文件系统的简单描述。

    type

    需要创建的存储卷类型。

    reclaimPolicy

    回收策略,目前仅支持Retain策略,删除CNFS时并不会删除OSS Bucket。

    parameters.bucketName

    OSS Bucket的名称。

    parameters.storageType

    存储类型,默认为Standard。取值:

    • Standard:标准存储。

    • IA:低频访问。

    • Archive:归档存储。

    • ColdArchive:冷归档存储。

    说明

    使用归档存储和冷归档存储的文件无法直接被读写访问,需要解冻后再访问。

    parameters.redundancyType

    存储冗余类型,默认为ZRS。取值:

    • LRS(本地冗余存储):采用单可用区(AZ)内的数据冗余存储机制,将用户的数据冗余存储在同一个可用区内多个设施的多个设备上。本地冗余存储能确保硬件失效时的数据持久性和可用性。

    • ZRS(同城冗余存储):采用多可用区(AZ)内的数据冗余存储机制,将用户的数据冗余存储在同一地域(Region)的多个可用区。当某个可用区不可用时,同城冗余存储仍然能够保障数据的正常访问。

    重要
    • 仅storage-operator组件为v1.26.2-1de13b6-aliyun或以上版本时,支持该参数设置。

    • 使用ZRS时,无法使用OSS冷归档存储和深度冷归档存储。

    • storageType和redundancyType的相关计费说明,请参见计费项

    parameters.encryptType

    加密方式。

    • None:不加密。

    • AES256:使用OSS服务端的AES256加密。

    • SM4:使用OSS服务端的SM4加密。

    parameters.aclType

    指定Bucket的访问权限ACL,默认为private。取值:

    • public-read-write(公共读写):所有用户都有该Bucket内文件的读写权限。请谨慎使用该访问权限。

    • public-read(公共读):Bucket的拥有者和授权用户有该Bucket内文件的读写权限,其他用户只有该Bucket内文件的读权限。请谨慎使用该访问权限。

    • private(私有):Bucket的拥有者和授权用户有该Bucket内文件的读写权限,其他用户没有权限操作该Bucket内的文件。

    parameters.enableVersioning

    Bucket版本控制状态,默认为Enabled。取值:

    • Enabled:开启版本控制。

    • Suspended:暂停版本控制。

    • None:不开启版本控制。

    重要
    • 仅storage-operator组件为v1.26.2-1de13b6-aliyun或以上版本时,支持该参数设置。

    • Bucket版本控制,与合规保留策略以及OSS-HDFS服务无法同时配置,若您后续计划开通这两项服务,请配置enableVersioning为None

    • 如果Bucket处于Enabled开启版本状态,将无法返回至None未开启状态。此时,您可以暂停Bucket的版本控制状态。

    • 版本控制功能本身不收取任何费用,但对当前版本和所有历史版本的文件都会收取存储费用。您可以通过配置生命周期回收历史版本。更多信息,请参见生命周期概述

  2. 执行以下命令,查看创建的OSS Bucket。

    kubectl get cnfs/cnfs-oss-<clusterid> -o yaml

    预期输出:

    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"storage.alibabacloud.com/v1beta1","kind":"ContainerNetworkFileSystem","metadata":{"annotations":{},"name":"cnfs-oss-xxxxxxxxxx"},"spec":{"description":"cnfs-oss","parameters":{"aclType":"private","bucketName":"cnfs-oss-clusterid","encryptType":"AES256","storageType":"Standard"},"reclaimPolicy":"Retain","type":"oss"}}
      creationTimestamp: "2022-09-18T07:02:34Z"
      finalizers:
      - protection.alibabacloud.com/cnfs
      generation: 6
      name: cnfs-oss-****
      resourceVersion: "8091291"
      uid: ca187b2a-3bfa-4a5f-82d8-ca1b1f69****
    spec:
      description: cnfs-oss
      parameters:
        aclType: private
        bucketName: cnfs-oss-****
        encryptType: AES256
        storageType: Standard
      reclaimPolicy: Retain
      type: oss
    status:
      conditions:
      - lastProbeTime: "2022-09-18 15:02:39"
        reason: The oss bucket is complete initialization.
        status: Ready
      fsAttributes:
        accessGroupName: DEFAULT_VPC_GROUP_NAME
        aclType: private
        bucketName: cnfs-oss-****
        encryptType: AES256
        endPoint:
          extranet: oss-****.aliyuncs.com
          internal: oss-****-internal.aliyuncs.com
        regionId: ****
        storageType: Standard
      status: Available

    CNFS输出参数说明:

    参数

    说明

    status

    CNFS的当前状态,包括以下状态:

    • Pending:等待。

    • Creating:创建中。

    • Initialization:创建文件系统中。

    • Available:可用。

    • Unavailable:暂时不可用,可以恢复为可用状态。

    • Fatal:不可用,无法恢复。

    • Terminating:删除中。

    conditions.lastProbeTime

    最后探活的时间。

    conditions.reason

    处于当前状态的原因。

    conditions.status

    当前状态是否可用。

    • Ready:可用状态。

    • NotReady:不可用状态。

    fsAttributes.accessGroupName

    挂载点所应用的权限组名称,目前仅支持DEFAULT_VPC_GROUP_NAME(专有网络默认权限组)。

    fsAttributes.encryptType

    加密方式。

    • None:不加密。

    • AES256:使用OSS服务端的AES256加密。

    • SM4:使用OSS服务端的SM4加密。

    fsAttributes.regionId

    ACK集群所在的地域。

    fsAttributes.storageType

    存储类型,默认为Standard。

    • Standard:标准存储。

    • IA:低频访问。

    • Archive:归档存储。

    • ColdArchive:冷归档存储。

    说明

    使用归档存储和冷归档存储的文件无法直接被读写访问,需要解冻后再访问。

    fsAttributes.redundancyType

    存储冗余类型,默认为ZRS。取值:

    • LRS(本地冗余存储):采用单可用区(AZ)内的数据冗余存储机制,将用户的数据冗余存储在同一个可用区内多个设施的多个设备上。本地冗余存储能确保硬件失效时的数据持久性和可用性。

    • ZRS(同城冗余存储):采用多可用区(AZ)内的数据冗余存储机制,将用户的数据冗余存储在同一地域(Region)的多个可用区。当某个可用区不可用时,同城冗余存储仍然能够保障数据的正常访问。

    重要
    • 仅storage-operator组件为v1.26.2-1de13b6-aliyun或以上版本时,支持该参数设置。

    • 使用ZRS时,无法使用OSS冷归档存储和深度冷归档存储。

    • storageType和redundancyType的相关计费说明,请参见计费项

    fsAttributes.aclType

    CNFS指定Bucket的访问权限ACL,默认为private。

    fsAttributes.endPoint

    CNFS的端点地址。

    • extranet:公网端点地址。

    • internal:内网端点地址。

    fsAttributes.enableVersioning

    Bucket版本控制状态,默认为Enabled。取值:

    • Enabled:开启版本控制。

    • Suspended:暂停版本控制。

    • None:不开启版本控制。

    重要
    • 仅storage-operator组件为v1.26.2-1de13b6-aliyun或以上版本时,支持该参数设置。

    • Bucket版本控制,与合规保留策略以及OSS-HDFS服务无法同时配置,若您后续计划开通这两项服务,请配置enableVersioning为None

    • 如果Bucket处于Enabled开启版本状态,将无法返回至None未开启状态。此时,您可以暂停Bucket的版本控制状态。

    • 版本控制功能本身不收取任何费用,但对当前版本和所有历史版本的文件都会收取存储费用。您可以通过配置生命周期回收历史版本。更多信息,请参见生命周期概述

  3. 执行以下命令,查看已创建应用的状态。

    kubectl get pod

    预期输出:

    NAME                                   READY   STATUS    RESTARTS   AGE
    cnfs-oss-deployment-5864fd8d98-4****   1/1     Running   0          2m21s
    cnfs-oss-sts-0                         1/1     Running   0          2m21s
    cnfs-oss-sts-1                         1/1     Running   0          2m16s

    由预期输出可得,所创建的Deployment、StatefulSet为Running状态,表示该Deployment已正常使用CNFS。

方式二:使用已有的OSS Bucket创建CNFS

使用CNFS指向已经存在的Bucket,可以通过创建一个CNFS CRD并指定对象存储的桶名(BucketName)来完成创建。然后使用OSS静态存储卷或OSS动态存储卷挂载已有的OSS Bucket,同时将创建的OSS静态存储卷或OSS动态存储卷绑定到工作负载Deployment中。

  1. 执行以下命令,使用已有的OSS Bucket创建CNFS。

    cat <<EOF | kubectl apply -f -
    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      name: cnfs-oss-exist-bucket-name
    spec:
      description: "cnfs-oss"
      type: oss
      reclaimPolicy: Retain
      parameters:
        bucketName: bucket-name #已经存在的OSS Bucket名称。
    EOF
  2. 执行以下命令,查看OSS Bucket的详细信息。

    kubectl get cnfs/cnfs-oss-exist-bucket-name -o yaml

    预期输出:

    apiVersion: storage.alibabacloud.com/v1beta1
    kind: ContainerNetworkFileSystem
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"storage.alibabacloud.com/v1beta1","kind":"ContainerNetworkFileSystem","metadata":{"annotations":{},"name":"cnfs-oss-xxxx"},"spec":{"description":"cnfs-oss","parameters":{"bucketName":"exist-bucket-name"},"reclaimPolicy":"Retain","type":"oss"}}
      creationTimestamp: "2022-09-14T09:21:10Z"
      finalizers:
      - protection.alibabacloud.com/cnfs
      generation: 7
      name: cnfs-oss-exist-bucket-name
      resourceVersion: "6504134"
      uid: 921564ac-0cd8-4a89-997d-c2393afd****
    spec:
      description: cnfs-oss
      parameters:
        bucketName: exist-bucket-name
      reclaimPolicy: Retain
      type: oss
    status:
      conditions:
      - lastProbeTime: "2022-09-14 17:00:21"
        reason: The oss bucket is complete initialization.
        status: Ready
      fsAttributes:
        accessGroupName: DEFAULT_VPC_GROUP_NAME
        aclType: private
        bucketName: exist-bucket-name
        encryptType: AES256
        endPoint:
          extranet: oss-****.aliyuncs.com           
          internal: oss-****-internal.aliyuncs.com
        regionId: ****
        storageType: Standard
      status: Available
  3. 在OSS存储卷中应用CNFS。

    具体操作,请参见方式一:使用CNFS创建以cnfs-oss-为名称的OSS Bucket,通过动态存储卷的方式应用CNFS。