當容器發生宕機故障時,具狀態服務容器儲存的業務資料存在著丟失和不可靠等風險。使用持久化儲存可以解決該問題。本文介紹如何使用雲端硬碟靜態儲存卷實現持久化儲存。
前提條件
請確保您已完成以下操作:
背景資訊
雲端硬碟的使用情境包括:
- 對磁碟I/O要求高的應用,且沒有共用資料的需求,如MySQL、Redis等資料存放區服務。
- 高速寫日誌。
- 持久化儲存資料,不因Pod生命週期的結束而消失。
靜態雲端硬碟的使用情境:已經購買了雲端硬碟執行個體的情況。
靜態雲端硬碟使用方式:需手動建立PV及PVC。請參見使用雲端硬碟靜態儲存卷。
使用限制
- 雲端硬碟為阿里雲儲存團隊提供的非共用儲存,只能同時被一個Pod掛載。
- 叢集中只有與雲端硬碟在同一個可用性區域(Zone)的節點才可以掛載雲端硬碟。
建立PV
- 建立pv-static.yaml檔案。
apiVersion: v1 kind: PersistentVolume metadata: name: <your-disk-id> labels: alicloud-pvname: <your-disk-id> failure-domain.beta.kubernetes.io/zone: <your-zone> failure-domain.beta.kubernetes.io/region: <your-region> spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce flexVolume: driver: "alicloud/disk" fsType: "ext4" options: volumeId: "<your-disk-id>"
說明alicloud-pvname: <your-disk-id>
:PV的名稱。需要與雲端硬碟ID一致。failure-domain.beta.kubernetes.io/zone: <your-zone>
:雲端硬碟所在的可用性區域。例如:cn-hangzhou-b。failure-domain.beta.kubernetes.io/region: <your-region>
:雲端硬碟所在的地區。例如:cn-hangzhou。
failure-domain.beta.kubernetes.io/zone
和failure-domain.beta.kubernetes.io/region
,在多可用性區域的情況下,必須配置,可保證您的Pod調度到雲端硬碟所在的可用性區域。 - 執行以下命令,建立PV。
kubectl create -f pv-static.yaml
驗證結果- 在控制台左側導覽列中,單擊叢集。
- 在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
- 在叢集管理頁左側導覽列中,單擊 ,可以看到剛剛建立的PV。
建立PVC
- 建立pvc-static.yaml檔案。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-disk spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: <your-disk-id>
- 執行以下命令,建立PVC。
kubectl create -f pvc-static.yaml
驗證結果- 在控制台左側導覽列中,單擊叢集。
- 在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
- 在叢集管理頁左側導覽列中,單擊 。
- 在儲存聲明頁面,可以看到剛剛建立的PVC。
建立應用
- 建立static.yaml檔案。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-static 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: pvc-disk
- 執行以下命令,建立靜態應用。
kubectl create -f static.yaml
驗證結果- 在控制台左側導覽列中,單擊叢集。
- 在叢集列表頁面中,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
- 在叢集管理頁左側導覽列中,選擇 。
- 在無狀態頁面,可以看到剛剛建立的靜態應用。
靜態雲端硬碟的持久化儲存
- 執行以下命令,查看部署的靜態應用所在Pod的名稱。
kubectl get pod | grep static
預期輸出:
nginx-static-78c7dcb9d7-g**** 2/2 Running 0 32s
- 執行以下命令,查看/data路徑下是否掛載了新的雲端硬碟。
kubectl exec nginx-static-78c7dcb9d7-g**** -- df | grep data
預期輸出:
/dev/vdf 20511312 45080 20449848 1% /data
- 執行以下命令,查看/data路徑下的檔案。
kubectl exec nginx-static-78c7dcb9d7-g**** -- ls /data
預期輸出:
lost+found
- 執行以下命令,在/data路徑下建立檔案static。
kubectl exec nginx-static-78c7dcb9d7-g**** -- touch /data/static
- 執行以下命令,查看/data路徑下的檔案。
kubectl exec nginx-static-78c7dcb9d7-g**** -- ls /data
預期輸出:
static lost+found
- 執行以下命令,刪除名稱為
nginx-static-78c7dcb9d7-g****
的Pod。kubectl delete pod nginx-static-78c7dcb9d7-g****
預期輸出:
pod "nginx-static-78c7dcb9d7-g****" deleted
- 同時在另一個視窗中,執行以下命令,查看Pod刪除及Kubernetes重建Pod的過程。
kubectl get pod -w -l app=nginx
預期輸出:
NAME READY STATUS RESTARTS AGE nginx-static-78c7dcb9d7-g**** 2/2 Running 0 50s nginx-static-78c7dcb9d7-g**** 2/2 Terminating 0 72s nginx-static-78c7dcb9d7-h**** 0/2 Pending 0 0s nginx-static-78c7dcb9d7-h**** 0/2 Pending 0 0s nginx-static-78c7dcb9d7-h**** 0/2 Init:0/1 0 0s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 73s nginx-static-78c7dcb9d7-h**** 0/2 Init:0/1 0 5s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 78s nginx-static-78c7dcb9d7-g**** 0/2 Terminating 0 78s nginx-static-78c7dcb9d7-h**** 0/2 PodInitializing 0 6s nginx-static-78c7dcb9d7-h**** 2/2 Running 0 8s
- 執行以下命令,查看Kubernetes重建的Pod名稱。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nginx-static-78c7dcb9d7-h**** 2/2 Running 0 14s
- 執行以下命令,查看/data路徑下的檔案,剛剛建立的檔案static並沒有被刪除,說明靜態雲端硬碟的資料可持久儲存。
kubectl exec nginx-static-78c7dcb9d7-h6brd -- ls /data
預期輸出:
static lost+found