全部產品
Search
文件中心

:使用雲端硬碟動態儲存裝置卷實現持久化儲存-Flexvolume

更新時間:Jun 19, 2024

當容器發生宕機故障時,具狀態服務容器儲存的業務資料存在著丟失和不可靠等風險。使用持久化儲存可以解決該問題。本文介紹如何使用雲端硬碟動態儲存裝置卷實現持久化儲存。

背景資訊

動態雲端硬碟的使用情境:

沒有購買雲端硬碟,在應用部署時自動購買雲端硬碟的情況。

動態雲端硬碟的使用方式:
  1. 手動建立PVC,在PVC中聲明StorageClass。
  2. 部署應用時通過StorageClass自動建立PV。

前提條件

Provisioner外掛程式

Container ServiceKubernetes版在建立叢集時,預設安裝Provisioner外掛程式。

建立StorageClass

阿里雲Container ServiceKubernetes在系統初始化的時候會預設建立4個StorageClass,且使用參數的預設情況。同時這4個StorageClass僅適用於單可用性區域叢集,若是多可用性區域叢集,則需要您建立StorageClass。這4個StorageClass分別為:
  • alicloud-disk-common:自動建立普通雲端硬碟。
  • alicloud-disk-efficiency:自動建立高效雲端硬碟。
  • alicloud-disk-ssd:自動建立SSD雲端硬碟。
  • alicloud-disk-available:提供高可用選項,先嘗試自動建立SSD雲端硬碟;如果相應可用性區域的SSD雲端硬碟資源售盡,再嘗試自動建立高效雲端硬碟。
  1. 建立storageclass.yaml檔案。
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: alicloud-disk-ssd-hangzhou-b
    provisioner: alicloud/disk
    reclaimPolicy: Retain
    parameters:
      type: cloud_ssd
      regionId: cn-hangzhou
      zoneId: cn-hangzhou-b
      fstype: "ext4"
      readonly: "false"
    參數描述
    provisioner動態雲端硬碟配置為alicloud/disk,標識使用provisioner外掛程式自動建立阿里雲雲端硬碟。
    reclaimPolicy雲端硬碟的回收策略。支援DeleteRetain,預設情況為Delete
    說明 如果配置為Delete,刪除PVC時,雲端硬碟會一起刪除,雲端硬碟上的資料不可恢複。
    type自動建立雲端硬碟的類型,支援cloudcloud_efficiencycloud_ssdavailable
    regionId(可選)自動建立雲端硬碟所在的地區,與叢集的地區相同。
    zoneId(可選)自動建立雲端硬碟所在的地區。
    • 單可用性區域叢集,與叢集所在地區相同。
    • 多可用性區域叢集,zoneid可同時配置多個,例如:
      zoneid: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c
    fstype(可選)自動建立雲端硬碟所使用的檔案系統,預設情況為ext4
    readonly(可選)掛載自動建立雲端硬碟的許可權是否為可讀,支援true:雲端硬碟具有隻讀許可權,false:雲端硬碟具有可讀可寫入權限,預設情況為false
    encrypted(可選)自動建立的雲端硬碟是否加密,支援true:加密,false:不加密,預設情況為false
  2. 執行以下命令,建立StorageClass。
    kubectl create -f storageclass.yaml

建立PVC

  1. 建立pvc-ssd.yaml檔案。
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-ssd
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: alicloud-disk-ssd-hangzhou-b
      resources:
        requests:
          storage: 20Gi
  2. 執行以下命令,建立PVC。
    kubectl create -f pvc-ssd.yaml

在目標叢集的頁面下單擊左側導覽列的儲存 > 儲存聲明,可以看到該PVC綁定的儲存類型為StorageClass中聲明的alicloud-disk-ssd-hangzhou-b,並且關聯儲存卷。

建立應用

  1. 建立pvc-dynamic.yaml檔案。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-dynamic
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
              - name: disk-pvc
                mountPath: "/data"
          volumes:
            - name: disk-pvc
              persistentVolumeClaim:
                claimName: disk-ssd
  2. 執行以下命令,建立Deployment。
    kubectl create -f nginx-dynamic.yaml
在目標叢集頁面下單擊左側導覽列的工作負載 > 無狀態,可以看到剛剛建立的Deployment。deployment

動態雲端硬碟的持久化儲存

  1. 執行以下命令,查看部署的Deployment所在Pod的名稱。
    kubectl get pod | grep dynamic

    預期輸出:

    nginx-dynamic-5c74594ccb-zl9pf     2/2     Running     0          3m
  2. 執行以下命令,查看/data路徑下是否掛載了新的雲端硬碟。
    kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- df | grep data

    預期輸出:

    /dev/vdh        20511312    45080  20449848   1% /data
  3. 執行以下命令,查看/data路徑下的檔案。
    kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data

    預期輸出:

    lost+found
  4. 執行以下命令,在/data路徑下建立檔案dynamic
    kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- touch /data/dynamic
  5. 執行以下命令,查看/data路徑下的檔案。
    kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data

    預期輸出:

    dynamic
    lost+found
  6. 執行以下命令,刪除名稱為nginx-dynamic-5c74594ccb-zl9pf的Pod。
    kubectl delete pod nginx-dynamic-5c74594ccb-zl9pf

    預期輸出:

    pod "nginx-dynamic-5c74594ccb-zl9pf" deleted
  7. 同時在另一個視窗中,執行以下命令,查看Pod刪除及Kubernetes重建Pod的過程。
    kubectl get pod -w -l app=nginx
    預期輸出:
    NAME                               READY   STATUS    RESTARTS   AGE
    nginx-dynamic-5c74594ccb-zl9pf     2/2     Running   0          6m48s
    nginx-dynamic-5c74594ccb-zl9pf   2/2   Terminating   0     7m32s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Pending   0     0s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Pending   0     0s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Init:0/1   0     0s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m32s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m33s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m33s
    nginx-dynamic-5c74594ccb-45sd4   0/2   PodInitializing   0     5s
    nginx-dynamic-5c74594ccb-45sd4   2/2   Running   0     22s
  8. 執行以下命令,查看Kubernetes重建的Pod名稱。
    kubectl get pod 

    預期輸出:

    NAME                               READY   STATUS      RESTARTS   AGE
    nginx-dynamic-5c74594ccb-45sd4     2/2     Running     0          2m
  9. 執行以下命令,查看/data路徑下的檔案,剛剛建立的檔案dynamic並沒有被刪除,說明動態雲端硬碟的資料可持久儲存。
    kubectl exec nginx-dynamic-5c74594ccb-45sd4 -- ls /data

    預期輸出:

    dynamic
    lost+found