全部產品
Search
文件中心

Container Compute Service:靜態掛載OSS儲存卷

更新時間:Dec 11, 2024

如果應用需要儲存圖片、音視頻等非結構化資料,可以使用OSS作為持久化儲存卷。本文介紹如何為應用靜態掛載OSS儲存卷,並驗證OSS的共用儲存和持久化儲存。

背景資訊

OSS是一個海量、安全、低成本、高可靠的儲存空間,適合儲存寫入後較少修改的資料,以及非結構化資料(如圖片、音視頻等)。更多資訊,請參見儲存概述

說明

ACS僅支援靜態掛載OSS儲存卷,暫不支援動態掛載OSS儲存卷。

前提條件

ACS叢集中已安裝managed-csiprovisioner組件。

說明

您可以在ACS叢集管理頁的左側導覽列選擇營運管理 > 組件管理,在儲存頁簽下查看managed-csiprovisioner組件的安裝情況。

注意事項

  • OSS為共用儲存,一個OSS儲存卷可以掛載到多個Pod上。

  • 掛載目錄中建議存放的檔案數不要超過1000個。

    通過ossfs進行ls等操作時,將發起HTTP請求到OSS擷取檔案的Meta資訊,如果ls的目標目錄下檔案較多,ossfs將消耗大量系統記憶體,可能會導致Pod發生OOM(Out Of Memory)事件。您可以通過掛載OSS Bucket的子目錄,或對檔案較多的目錄進行目錄分級來避免此問題。

建立並擷取OSS Bucket資訊

  1. 建立OSS Bucket。

    1. 登入OSS管理主控台,在左側導覽列單擊Bucket列表

    2. 單擊建立Bucket

    3. 在彈出面板完成OSS Bucket相關參數配置,然後單擊完成建立,並完成後續操作。

      需要注意的參數如下。更多資訊,請參見建立儲存空間

      參數

      說明

      Bucket 名稱

      自訂輸入,在OSS範圍內全域唯一,建立成功後不允許修改。格式要求請參考介面提示。

      地區

      建議選擇有地區屬性,並選擇ACS叢集所屬地區,使得後續ACS叢集中的Pod可以通過內網訪問OSS Bucket。

  2. (可選)如果需要掛載OSS Bucket的子目錄,按需建立子目錄。

    1. Bucket列表頁面,單擊目標Bucket名稱。

    2. 在Bucket詳情頁面的左側導覽列,選擇檔案管理 > 檔案清單

    3. 根據需要單擊建立目錄,對OSS Bucket進行目錄分級。

  3. 擷取OSS Bucket的Endpoint。

    1. Bucket列表頁面,單擊目標Bucket名稱。

    2. 在Bucket詳情頁面,單擊概覽頁簽,然後在訪問連接埠地區,複製目標Endpoint。

      • OSS Bucket和ACS叢集屬於相同地區時,請複製VPC內網的Endpoint。

      • OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,請複製外網的Endpoint。

  4. 擷取AccessKey ID和AccessKey Secret,用於OSS授權訪問。具體操作,請參見擷取AccessKey

    說明

    如果需要跨帳號掛載OSS Bucket,請擷取OSS Bucket所屬帳號的AccessKey。

靜態掛載OSS儲存卷

通過kubectl命令

步驟一:建立PV

  1. 串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集在CloudShell上通過kubectl管理Kubernetes叢集

  2. 將以下YAML內容儲存為oss-pv.yaml。

    apiVersion: v1
    kind: Secret
    metadata:
      name: oss-secret
      namespace: default
    stringData:
      akId: <your AccessKey ID>
      akSecret: <your AccessKey Secret>
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: oss-pv
      labels:
        alicloud-pvname: oss-pv
    spec:
      storageClassName: test 
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: oss-pv
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: "<your OSS Bucket Name>"
          url: "<your OSS Bucket Endpoint>"
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"
    說明

    以上YAML可以建立一個Secret和一個PV。Secret用於儲存AccessKey,以便在PV中可以安全使用。請使用實際的AccessKey ID和AccessKey Secret替換akIdakSecret的取值。

    PV的相關參數說明如下:

    參數

    說明

    alicloud-pvname

    PV的標籤。用於綁定PVC。

    storageClassName

    該配置僅用於綁定PVC,無需關聯實際的StorageClass。

    storage

    OSS儲存卷的容量大小。

    說明

    OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。

    accessModes

    訪問模式。

    persistentVolumeReclaimPolicy

    回收策略。

    driver

    驅動類型。此處配置為ossplugin.csi.alibabacloud.com,表示使用阿里雲OSS CSI外掛程式。

    volumeHandle

    PV的唯一識別碼,與metadata.name保持一致。

    nodePublishSecretRef

    從指定的Secret中擷取AccessKey,用於授權認證。

    bucket

    OSS Bucket的名稱。請使用實際的OSS Bucket名稱替換bucket的取值。

    url

    OSS Bucket的接入網域名稱(Endpoint)。請使用實際的OSS Bucket的Endpoint替換url的取值。

    • OSS Bucket和ACS叢集屬於相同地區時,使用VPC內網的Endpoint。例如oss-cn-shanghai-internal.aliyuncs.com

    • OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,使用外網的Endpoint。例如oss-cn-shanghai.aliyuncs.com

    otherOpts

    掛載參數。格式為-o *** -o ***,例如:-o max_stat_cache_size=0 -o allow_other

  3. 建立Secret和PV。

    kubectl create -f oss-pv.yaml
  4. 查看PV。

    kubectl get pv

    預期返回:

    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    oss-pv   20Gi       RWX            Retain           Available           test           <unset>                          9s

步驟二:建立PVC

  1. 將以下YAML內容儲存為oss-pvc.yaml。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: oss-pvc
    spec:
      storageClassName: test
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      selector:
        matchLabels:
          alicloud-pvname: oss-pv

    相關參數說明如下:

    參數

    說明

    storageClassName

    該配置僅用於綁定PV,無需關聯實際的StorageClass。與PV的spec.storageClassName保持一致。

    accessModes

    訪問模式。

    storage

    分配給Pod的儲存容量。不能高於OSS儲存卷的容量。

    alicloud-pvname

    要綁定的PV的標籤。與PV的metadata.labels.alicloud-pvname保持一致。

  2. 建立PVC。

    kubectl create -f oss-pvc.yaml
  3. 查看PVC。

    kubectl get pvc

    預期返回如下,此時PVC已綁定步驟一建立的PV。

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

步驟三:建立應用並掛載OSS

  1. 使用以下YAML內容,建立oss-test.yaml檔案。

    以下YAML樣本可以建立包含2個Pod的Deployment,2個Pod均通過名為oss-pvc的PVC申請儲存資源,掛載路徑均為/data

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: oss-test
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-oss
                mountPath: /data
          volumes:
            - name: pvc-oss
              persistentVolumeClaim:
                claimName: oss-pvc
  2. 建立Deployment並掛載OSS。

    kubectl create -f oss-test.yaml
  3. 查看Deployment中Pod的部署情況。

    kubectl get pod | grep oss-test

    返回樣本如下,已建立2個Pod。

    oss-test-****-***a   1/1     Running   0          28s
    oss-test-****-***b   1/1     Running   0          28s
  4. 查看掛載路徑。

    命令樣本如下,預期會返回OSS Bucket掛載目錄下的資料,預設為空白。

    kubectl exec oss-test-****-***a -- ls /data

通過控制台

步驟一:建立PV

  1. 登入容器計算服務控制台

  2. 叢集頁面,單擊目的地組群ID,進入該叢集的管理頁面。

  3. 在叢集管理頁面的左側導覽列,選擇儲存 > 儲存卷

  4. 儲存卷頁面,單擊建立

  5. 在彈出的對話方塊中,完成參數配置,然後單擊建立

    參數

    說明

    樣本

    儲存卷類型

    選擇OSS

    OSS

    名稱

    PV名稱,自訂輸入。格式要求請參考介面提示。

    oss-pv

    總量

    OSS儲存卷的容量大小。

    說明

    OSS靜態卷的容量僅起聲明效果,實際容量不受限制,可使用量以OSS控制台顯示為準。

    20Gi

    訪問模式

    按需選擇以下配置:

    • ReadOnlyMany:卷可以被多個Pod以唯讀方式掛載。

    • ReadWriteMany:卷可以被多個Pod以讀寫方式掛載。

    ReadWriteMany

    訪問認證

    為保證安全性,將AccessKey資訊儲存到Secret中。本文以建立保密字典為例。

    • 建立保密字典

    • 命名空間:default

    • 名稱:oss-secret

    • AccessKey ID:********

    • AccessKey Secret:********

    Bucket ID

    選擇OSS Bucket。

    oss-acs-***

    OSS Path

    要掛載的目錄。預設掛載根目錄(/),可按需掛載子目錄(如/dir),需確保該子目錄已存在。

    /

    訪問網域名稱

    OSS Bucket的接入網域名稱(Endpoint)。

    • OSS Bucket和ACS叢集屬於相同地區時,選擇私網網域名稱

    • OSS Bucket沒有地區屬性,或者和ACS叢集屬於不同地區時,選擇公網網域名稱

    私網網域名稱

    建立完成後,在儲存卷頁面可以看到新建立的PV資訊,當前PV還沒綁定PVC。

步驟二:建立PVC

  1. 在叢集管理頁面的左側導覽列,選擇儲存 > 儲存聲明

  2. 儲存聲明頁面,單擊建立

  3. 在彈出的對話方塊中,完成參數配置,然後單擊建立

    參數

    說明

    樣本

    儲存宣告類型

    選擇OSS

    OSS

    名稱

    PVC名稱,自訂輸入。格式要求請參考介面提示。

    oss-pvc

    分配模式

    選擇已有儲存卷

    已有儲存卷

    已有儲存卷

    選擇之前建立的PV。

    oss-pv

    總量

    分配給Pod的儲存容量。不能高於OSS儲存卷的容量。

    20Gi

    建立完成後,在儲存聲明頁面可以看到新建立的PVC,該PVC已綁定PV(即OSS儲存卷)。

步驟三:建立應用並掛載OSS

  1. 在叢集管理頁面的左側導覽列,選擇工作負載 > 無狀態

  2. 無狀態頁面,單擊使用鏡像建立

  3. 完成Deployment的參數配置,單擊建立

    需要注意的參數如下,其他參數保持預設即可。更多資訊,請參見建立無狀態工作負載Deployment

    配置頁

    參數

    說明

    樣本

    應用基本資料

    應用程式名稱

    Deployment名稱,自訂輸入。格式要求請參考介面提示。

    oss-test

    副本數量

    配置Deployment的副本數量。

    2

    容器配置

    鏡像名稱

    輸入用於部署應用的鏡像地址。

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    所需資源

    設定所需的vCPU和記憶體資源。

    0.25 vCPU,0.5 GiB

    資料卷

    單擊增加雲端儲存聲明,然後完成參數配置。

    • 掛載源:選擇之前建立的PVC。

    • 容器路徑:輸入OSS Bucket要掛載到的容器路徑。

    • 掛載源:oss-pvc

    • 容器路徑:/data

  4. 查看應用部署情況。

    1. 無狀態頁面,單擊應用程式名稱。

    2. 容器組頁簽下,確認Pod已正常運行(狀態為Running)。

驗證OSS的共用儲存和持久化儲存

按照上文樣本建立的Deployment中含有2個Pod,2個Pod同時掛載了同一OSS Bucket。您可以通過以下方式進行驗證:

  • 在一個Pod中建立檔案,然後另一個Pod中查看檔案,以此來驗證共用儲存。

  • 重建Deployment,然後在新建立的Pod中查看OSS Bucket中的資料是否存在,以此來驗證持久化儲存。

  1. 查看Pod資訊。

    kubectl get pod | grep oss-test

    返回樣本如下:

    oss-test-****-***a   1/1     Running   0          40s
    oss-test-****-***b   1/1     Running   0          40s
  2. 驗證共用儲存。

    1. 在一個Pod中建立檔案。

      以名為oss-test-****-***a的Pod作為樣本:

      kubectl exec oss-test-****-***a -- touch /data/test.txt
    2. 在另一個Pod中查看檔案。

      以名為oss-test-****-***b的Pod作為樣本:

      kubectl exec oss-test-****-***b -- ls /data

      預期返回如下,可以看到已共用建立的檔案test.txt

      test.txt
  3. 驗證持久化儲存。

    1. 重建Deployment。

      kubectl rollout restart deploy oss-test
    2. 查看Pod,等待新Pod建立成功。

      kubectl get pod | grep oss-test

      返回樣本如下:

      oss-test-****-***c   1/1     Running   0          67s
      oss-test-****-***d   1/1     Running   0          49s
    3. 在新Pod中查看檔案系統中的資料是否存在。

      以名為oss-test-c***的Pod作為樣本:

      kubectl exec oss-test-****-***c -- ls /data

      預期返回如下,可以看到OSS Bucket中的資料依然存在,在新Pod的掛載目錄下可以重新擷取。

      test.txt