全部產品
Search
文件中心

Container Service for Kubernetes:使用雲端硬碟靜態儲存卷

更新時間:Jul 30, 2024

雲端硬碟是阿里雲為Elastic Compute Service提供的資料區塊層級的Block Storage產品,具有低時延、高效能、持久性、高可靠等特點。叢集支援使用CSI外掛程式建立雲端硬碟靜態儲存卷和動態儲存裝置卷,您可以通過手動建立PV及PVC的方式掛載靜態儲存卷以實現應用的持久化儲存。

前提條件

  • 已建立叢集,並且在該叢集中安裝CSI外掛程式。具體操作,請參見建立ACK託管叢集建立叢集

    重要
    • 如果您的叢集中包含CentOS 7.9鏡像(或其他運行小於4.9版本Linux核心)的宿主機,並且在叢集中使用了XFS檔案系統(fstype參數設定為xfs)的儲存卷,請勿將CSI組件升級到v1.24.7及以上的版本。因為舊版核心與新版本組件不相容。如果誤升級,掛載XFS檔案系統的儲存卷的Pod將可能無法啟動,對其他檔案系統無影響,請提交工單處理。

    • 如需將CSI組件升級至v1.26.4版本,您需要將CSI provisioner和CSI plugin同時升級至該版本。

  • 已建立隨用隨付的雲端硬碟並記錄雲端硬碟ID為d-wz92s6d95go6ki9x****。具體操作,請參見建立雲端硬碟

    說明

    申請雲端硬碟時,請遵循如下容量限制:

    • 高效雲端硬碟:最小20 GiB。

    • SSD雲端硬碟:最小20 GiB。

    • ESSD雲端硬碟:最小1 GiB。

  • 已通過kubectl串連Kubernetes叢集。具體操作,請參見通過kubectl工具串連叢集

使用情境

雲端硬碟的使用情境包括:

  • 對磁碟I/O要求高的應用,且沒有共用資料的需求,如MySQL、Redis等資料存放區服務。

  • 高速寫日誌。

  • 持久化儲存資料,不會因Pod生命週期的結束而消失。

靜態雲端硬碟的使用情境:已經購買了雲端硬碟執行個體的情況。

靜態雲端硬碟使用方式:需手動建立PV及PVC。

使用限制

  • 雲端硬碟不支援跨可用性區域使用。

  • 未開啟多重掛載的雲端硬碟只能同時被一個Pod掛載。關於多重掛載更多資訊,請參見使用NVMe雲端硬碟多重掛載及Reservation

  • 雲端硬碟類型和ECS類型需要匹配才可以掛載,否則會導致Pod無法啟動。關於雲端硬碟類型和ECS類型的匹配關係,請參見執行個體規格類型系列

    重要

    當您將叢集中的ECS執行個體從隨用隨付轉換成訂用帳戶時,不能將雲端硬碟一起變成訂用帳戶,否則雲端硬碟將無法被掛載使用。您可以通過購買SCU的方式降低成本。關於SCU的更多資訊,請參見儲存容量單位包SCU概述

通過控制台的方式使用雲端硬碟靜態儲存卷

步驟一:建立PV

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存卷

  3. 儲存卷頁面,單擊右上方的建立

  4. 建立儲存卷對話方塊中配置參數。

    參數

    描述

    儲存卷類型

    本文中選擇為雲端硬碟

    • ACK叢集:支援雲端硬碟、NAS、OSS雲端儲存類型。

    • ACK Serverless叢集:支援雲端硬碟、NAS雲端儲存類型。

    訪問模式

    預設為ReadWriteOnce。

    雲端硬碟ID

    您可以選擇與叢集屬於相同地區和可用性區域下處於待掛載狀態的雲端硬碟。

    檔案系統類型

    您可以選擇以何種資料類型將資料存放區到雲端硬碟上,支援的類型包括ext4ext3xfsvfat。預設為ext4

  5. 參數配置完成後,單擊建立

步驟二:建立PVC

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

  2. 儲存聲明頁面,單擊右上方的建立

  3. 建立儲存聲明對話方塊中,配置參數。

    參數

    描述

    儲存宣告類型

    本文中選擇為雲端硬碟

    • ACK叢集:支援雲端硬碟、NAS、OSS雲端儲存類型。

    • ACK Serverless叢集:支援雲端硬碟、NAS雲端儲存類型。

    名稱

    建立的資料卷的名稱,資料卷名在命名空間內必須唯一。

    分配模式

    本文中選擇已有儲存卷。

    說明

    若未建立儲存卷,您可以設定分配模式建立儲存卷,配置建立儲存卷參數。具體操作,請參見建立PV

    已有儲存卷

    單擊已有儲存卷,在目標儲存卷右側操作列單擊選擇,選擇儲存卷。

    總量

    所建立儲存卷的容量。

    說明

    所建立的儲存卷容量不能超過雲端硬碟容量。

    訪問模式

    預設為ReadWriteOnce。

  4. 單擊建立

    建立成功後可以在列表中看到儲存聲明,並且已綁定相應的儲存卷。

步驟三:建立應用

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

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

  3. 配置建立應用的參數資訊。

    以下主要為您介紹資料卷的配置。關於其他參數的描述,請參見建立有狀態工作負載StatefulSet

  4. ACK資料卷支援配置本機存放區和雲端儲存,本樣本需要配置雲端儲存類型。配置了一個雲端硬碟類型的資料卷,將該雲端硬碟掛載到容器的/tmp路徑下,在該路徑下產生的容器資料會儲存到雲端硬碟中。資料卷

  5. 所有的資訊都配置完成後,單擊建立

    建立成功後,您就可以正常使用資料卷。

通過kubectl命令列的方式使用雲端硬碟靜態儲存卷

步驟一:建立PV

  1. 使用以下內容,建立pv-static.yaml檔案。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: csi-pv
      labels:
        alicloud-pvname: static-disk-pv
    spec:
      capacity:
        storage: 25Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: diskplugin.csi.alibabacloud.com
        volumeHandle: "<YOUR-DISK-ID>"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.diskplugin.csi.alibabacloud.com/zone
              operator: In
              values:
              - "<YOUR-NODE-ZONE-ID>"   # 替換為您待部署應用的節點所在的可用性區域,例如"cn-beijing-b"。

    參數

    說明

    name

    PV的名稱。

    labels

    設定PV的標籤。

    storage

    雲端硬碟的可使用量。

    accessModes

    設定訪問模式。

    persistentVolumeReclaimPolicy

    PV的回收策略。

    driver

    定義驅動類型。取值為diskplugin.csi.alibabacloud.com,表示使用阿里雲雲端硬碟CSI外掛程式。

    volumeHandle

    定義雲端硬碟ID。

    nodeAffinity

    定義PV和PVC所屬的地區資訊。

    通過定義該參數,可以將PV和PVC所在的Pod調度到對應的地區上。

  2. 執行以下命令,建立PV。

    kubectl create -f pv-static.yaml
  3. 查看建立的PV。

    1. 登入Container Service管理主控台

    2. 在控制台左側導覽列,單擊叢集

    3. 叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

    4. 在叢集管理頁左側導覽列選擇儲存 > 儲存卷

      儲存卷頁面可查看建立的PV。

步驟二:建立PVC

  1. 使用以下內容,建立pvc-static.yaml檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 25Gi
      selector:
        matchLabels:
          alicloud-pvname: static-disk-pv

    參數

    說明

    name

    PVC的名稱。

    accessModes

    設定訪問模式。

    storage

    聲明應用使用量,不能大於儲存卷的總量。

    matchLabels

    通過標籤關聯PV,與PV標籤保持一致。

  2. 執行以下命令,建立PVC。

    kubectl create -f pvc-static.yaml
  3. 在叢集管理頁左側導覽列選擇儲存 > 儲存聲明

    儲存聲明頁面可看到建立的PVC。

步驟三:建立應用

本文以MySQL應用為例,在應用中掛載PVC。

  1. 使用以下內容,建立mysql.yaml檔案。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 80
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: csi-pvc
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-pass
    type: Opaque
    data:
      username: dGVz****             # MySQL應用的使用者名稱,需替換為您實際的使用者名稱。
      password: dGVzdDEt****     # MySQL應用的使用者密碼,需替換為您實際的使用者密碼。
    • mountPath:雲端硬碟在容器中掛載的位置。

    • claimName:PVC的名稱,用於綁定PVC。

  2. 執行以下命令,建立一個掛載了雲端硬碟靜態儲存卷的應用並掛載PVC。

    kubectl apply -f mysql.yaml
  3. 在叢集管理頁左側導覽列選擇工作負載 > 有狀態

    有狀態頁面可看到建立的MySQL應用。

驗證靜態雲端硬碟的持久化儲存

  1. 查看部署MySQL應用的Pod和雲端硬碟檔案。

    1. 執行以下命令,查看部署的MySQL應用所在Pod的名稱。

      kubectl get pod | grep mysql

      預期輸出:

      mysql-1**** 1/1 Running 0 32s
    2. 執行以下命令,查看/data路徑下是否掛載了新的雲端硬碟。

      kubectl exec mysql-1**** -- df | grep data

      預期輸出:

      /dev/vdf 20511312 45080 20449848 1% /data
    3. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec mysql-1**** -- ls /data

      預期輸出:

      lost+found
  2. 執行以下命令,在/data路徑下建立檔案static

    kubectl exec mysql-1**** -- touch /data/static
  3. 執行以下命令,查看/data路徑下的檔案。

     kubectl exec mysql-1**** -- ls /data

    預期輸出:

    lost+found
    static
  4. 執行以下命令,刪除名稱為mysql-1****的Pod。

    kubectl delete pod mysql-1****

    預期輸出:

    pod "mysql-1****" deleted
  5. 驗證刪除Pod後,雲端硬碟裡建立的檔案是否還存在。

    1. 執行以下命令,查看重建的Pod名稱。

      kubectl get pod

      預期輸出:

      NAME       READY   STATUS    RESTARTS    AGE 
      mysql-2****  1/1     Running   0           14s
    2. 執行以下命令,查看/data路徑下的檔案。

      kubectl exec mysql-2**** -- ls /data

      預期輸出:

      lost+found
      static

      static檔案仍然存在,則說明靜態雲端硬碟的資料可持久化儲存。