當容器發生宕機故障時,具狀態服務容器儲存的業務資料存在著丟失和不可靠等風險。使用持久化儲存可以解決該問題。本文介紹如何使用雲端硬碟動態儲存裝置卷實現持久化儲存。
背景資訊
動態雲端硬碟的使用情境:
沒有購買雲端硬碟,在應用部署時自動購買雲端硬碟的情況。
動態雲端硬碟的使用方式:
- 手動建立PVC,在PVC中聲明StorageClass。
- 部署應用時通過StorageClass自動建立PV。
前提條件
- 已建立Kubernetes叢集,請參見建立Kubernetes託管版叢集。
- 已通過kubectl串連到Kubernetes叢集,請參見步驟二:選擇叢集憑證類型。
- 叢集中已安裝Provisioner外掛程式,該外掛程式可以根據StorageClass自動建立雲端硬碟。
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雲端硬碟資源售盡,再嘗試自動建立高效雲端硬碟。
- 建立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
雲端硬碟的回收策略。支援Delete和Retain,預設情況為Delete。 說明 如果配置為Delete,刪除PVC時,雲端硬碟會一起刪除,雲端硬碟上的資料不可恢複。type
自動建立雲端硬碟的類型,支援cloud、cloud_efficiency、cloud_ssd、available。 regionId
(可選)自動建立雲端硬碟所在的地區,與叢集的地區相同。 zoneId
(可選)自動建立雲端硬碟所在的地區。 - 單可用性區域叢集,與叢集所在地區相同。
- 多可用性區域叢集,zoneid可同時配置多個,例如:
zoneid: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c
fstype
(可選)自動建立雲端硬碟所使用的檔案系統,預設情況為ext4。 readonly
(可選)掛載自動建立雲端硬碟的許可權是否為可讀,支援true:雲端硬碟具有隻讀許可權,false:雲端硬碟具有可讀可寫入權限,預設情況為false。 encrypted
(可選)自動建立的雲端硬碟是否加密,支援true:加密,false:不加密,預設情況為false。 - 執行以下命令,建立StorageClass。
kubectl create -f storageclass.yaml
建立PVC
- 建立pvc-ssd.yaml檔案。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-ssd spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-ssd-hangzhou-b resources: requests: storage: 20Gi
- 執行以下命令,建立PVC。
kubectl create -f pvc-ssd.yaml
在目標叢集的頁面下單擊左側導覽列的StorageClass
中聲明的alicloud-disk-ssd-hangzhou-b,並且關聯儲存卷。
建立應用
- 建立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
- 執行以下命令,建立Deployment。
kubectl create -f nginx-dynamic.yaml
在目標叢集頁面下單擊左側導覽列的
,可以看到剛剛建立的Deployment。動態雲端硬碟的持久化儲存
- 執行以下命令,查看部署的Deployment所在Pod的名稱。
kubectl get pod | grep dynamic
預期輸出:
nginx-dynamic-5c74594ccb-zl9pf 2/2 Running 0 3m
- 執行以下命令,查看/data路徑下是否掛載了新的雲端硬碟。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- df | grep data
預期輸出:
/dev/vdh 20511312 45080 20449848 1% /data
- 執行以下命令,查看/data路徑下的檔案。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data
預期輸出:
lost+found
- 執行以下命令,在/data路徑下建立檔案dynamic。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- touch /data/dynamic
- 執行以下命令,查看/data路徑下的檔案。
kubectl exec nginx-dynamic-5c74594ccb-zl9pf -- ls /data
預期輸出:
dynamic lost+found
- 執行以下命令,刪除名稱為
nginx-dynamic-5c74594ccb-zl9pf
的Pod。kubectl delete pod nginx-dynamic-5c74594ccb-zl9pf
預期輸出:
pod "nginx-dynamic-5c74594ccb-zl9pf" deleted
- 同時在另一個視窗中,執行以下命令,查看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
- 執行以下命令,查看Kubernetes重建的Pod名稱。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nginx-dynamic-5c74594ccb-45sd4 2/2 Running 0 2m
- 執行以下命令,查看/data路徑下的檔案,剛剛建立的檔案dynamic並沒有被刪除,說明動態雲端硬碟的資料可持久儲存。
kubectl exec nginx-dynamic-5c74594ccb-45sd4 -- ls /data
預期輸出:
dynamic lost+found