全部產品
Search
文件中心

Container Service for Kubernetes:管理OSS生命週期

更新時間:Nov 22, 2024

Container ServiceACK使用CNFS(Container Network File System)對OSS Bucket全生命週期的管理,實現對Bucket層的獨立管理。本文介紹如何使用CNFS對OSS Bucket全生命週期的管理及CNFS在工作負載中的應用。

前提條件

功能介紹

您可以通過以下兩種方式使用CNFS對OSS全生命週期的管理:

  • 方式一:使用CNFS建立以cnfs-oss-為名稱的OSS Bucket

    使用CNFS建立叢集唯一的Object Storage Service桶,可以提供動態OSS PV能力。以cnfs-oss-<UUID e.g. clusterid>為名稱的OSS Bucket,使用OSS動態儲存裝置卷自動掛載建立的OSS Bucket,同時將OSS動態儲存裝置卷綁定到工作負載Deployment和StatefulSet中。

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

    使用CNFS指向已經存在的Bucket,可以通過建立一個CNFS CRD並指定Object Storage Service的桶名(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>的Object Storage Service,其中<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:Archive Storage。

    • ColdArchive:冷Archive Storage。

    說明

    使用Archive Storage和冷Archive Storage的檔案無法直接被讀寫訪問,需要解凍後再訪問。

    parameters.redundancyType

    儲存冗餘類型,預設為ZRS。取值:

    • LRS(本地備援儲存體):採用單可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一個可用性區域內多個設施的多個裝置上。本地備援儲存體能確保硬體失效時的資料持久性和可用性。

    • ZRS(同城冗餘儲存):採用多可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一地區(Region)的多個可用性區域。當某個可用性區域不可用時,同城冗餘儲存仍然能夠保障資料的正常訪問。

    重要
    • 僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。

    • 使用ZRS時,無法使用OSS冷Archive Storage和深度冷Archive Storage。

    • 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:Archive Storage。

    • ColdArchive:冷Archive Storage。

    說明

    使用Archive Storage和冷Archive Storage的檔案無法直接被讀寫訪問,需要解凍後再訪問。

    fsAttributes.redundancyType

    儲存冗餘類型,預設為ZRS。取值:

    • LRS(本地備援儲存體):採用單可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一個可用性區域內多個設施的多個裝置上。本地備援儲存體能確保硬體失效時的資料持久性和可用性。

    • ZRS(同城冗餘儲存):採用多可用性區域(AZ)內的資料冗餘儲存機制,將使用者的資料冗餘儲存在同一地區(Region)的多個可用性區域。當某個可用性區域不可用時,同城冗餘儲存仍然能夠保障資料的正常訪問。

    重要
    • 僅storage-operator組件為v1.26.2-1de13b6-aliyun或以上版本時,支援該參數設定。

    • 使用ZRS時,無法使用OSS冷Archive Storage和深度冷Archive Storage。

    • 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並指定Object Storage Service的桶名(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。