雲端硬碟是阿里雲為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
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在儲存卷頁面,單擊建立。
在建立儲存卷對話方塊中配置參數。
參數
描述
儲存卷類型
本文中選擇為雲端硬碟。
ACK叢集:支援雲端硬碟、NAS、OSS雲端儲存類型。
ACK Serverless叢集:支援雲端硬碟、NAS雲端儲存類型。
訪問模式
預設為ReadWriteOnce。
雲端硬碟ID
您可以選擇與叢集處於相同地區和可用性區域下的待掛載狀態的雲端硬碟。
檔案系統類型
您可以選擇以何種資料類型將資料存放區到雲端硬碟上,支援的類型包括ext4、ext3、xfs、vfat。預設為ext4。
參數配置完成後,單擊建立。
步驟二:建立PVC
在叢集管理頁左側導覽列,選擇 。
在儲存聲明頁面,單擊右上方的建立。
在建立儲存聲明對話方塊中,配置參數。
參數
描述
儲存宣告類型
本文中選擇為雲端硬碟。
ACK叢集:支援雲端硬碟、NAS、OSS雲端儲存類型。
ACK Serverless叢集:支援雲端硬碟、NAS雲端儲存類型。
名稱
建立的資料卷的名稱,資料卷名在命名空間內必須唯一。
分配模式
本文中選擇已有儲存卷。
說明若未建立儲存卷,您可以設定分配模式為建立儲存卷,配置建立儲存卷參數。具體操作,請參見建立PV。
已有儲存卷
單擊已有儲存卷,在目標儲存卷右側操作列單擊選擇,選擇儲存卷。
總量
所建立儲存卷的容量。
說明所建立的儲存卷容量不能超過雲端硬碟容量。
訪問模式
預設為ReadWriteOnce。
單擊建立。
建立成功後可以在列表中看到儲存聲明,並且已綁定相應的儲存卷。
步驟三:建立應用
在叢集管理頁左側導覽列,選擇 。
在有狀態頁面,單擊使用鏡像建立。
配置建立應用的參數資訊。
以下主要為您介紹資料卷的配置。關於其他參數的描述,請參見建立有狀態工作負載StatefulSet。
ACK資料卷支援配置本機存放區和雲端儲存,本樣本需要配置雲端儲存類型。配置了一個雲端硬碟類型的資料卷,將該雲端硬碟掛載到容器的/tmp路徑下,在該路徑下產生的容器資料會儲存到雲端硬碟中。
所有的資訊都配置完成後,單擊建立。
建立成功後,您就可以正常使用資料卷。
通過kubectl命令列的方式使用雲端硬碟靜態儲存卷
步驟一:建立PV和PVC
使用以下內容,建立disk-static.yaml檔案。請替換檔案中的如下內容:
<YOUR-DISK-ID>
:事先建立的雲端硬碟ID,例如d-wz92s6d95go6ki9x****
;<YOUR-DISK-SIZE>
:該雲端硬碟的大小,例如25Gi
;<YOUR-DISK-CATEGORY>
:該雲端硬碟的類型,例如cloud_essd
;<YOUR-DISK-ZONE-ID>
:該雲端硬碟所在的可用性區域,例如cn-beijing-i
。
--- apiVersion: v1 kind: PersistentVolume metadata: name: "<YOUR-DISK-ID>" annotations: csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc 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-DISK-ZONE-ID>" storageClassName: disk volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: "<YOUR-DISK-SIZE>" storageClassName: disk volumeName: "<YOUR-DISK-ID>"
參數
說明
accessModes
設定訪問模式。通常為
ReadWriteOnce
。PV和PVC的設定需保持一致。詳見動態儲存裝置卷中的說明。persistentVolumeReclaimPolicy
PV的回收策略。
Delete
:刪除PVC時,PV和雲端硬碟會一起刪除。Retain
:刪除PVC時,PV和雲端硬碟資料不會被刪除,需要您手動刪除。
driver
定義驅動類型。取值為
diskplugin.csi.alibabacloud.com
,表示使用阿里雲雲端硬碟CSI外掛程式。storageClassName
對靜態卷無意義,但PV和PVC的設定需保持一致,Storage Class對象無需事先存在。
nodeAffinity
定義PV所屬的可用性區域資訊。
通過定義該參數,可以確保使用該儲存卷的Pod調度到正確的可用性區域。
annotations["csi.alibabacloud.com/volume-topology"]
成功掛載該儲存卷所需的額外節點約束。推薦填寫雲端硬碟類型,以確保Pod調度到支援該類型雲端硬碟的節點。
claimRef
指定PV所能綁定的PVC,如希望PV可被任意PVC綁定請刪除該參數。
volumeName
指定PVC所能綁定的PV,如希望PVC可綁定任意PV請刪除該參數。
執行以下命令,建立PV和PVC。
kubectl apply -f disk-static.yaml
執行以下命令查看建立的PV和PVC。
kubectl get pv <YOUR-DISK-ID> kubectl get pvc disk-pvc
預期輸出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE d-wz92s6d95go6ki9x**** 20Gi RWO Retain Bound default/disk-pvc disk <unset> 27s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-wz92s6d95go6ki9x**** 20Gi RWO disk <unset> 27s
PV和PVC應該在數秒內進入Bound狀態。
步驟二:建立應用
本文以MySQL應用為例,在應用中掛載PVC。
使用以下命令,建立Secret,用於設定MySQL應用的root帳號密碼。請注意,在生產環境中請更換密碼。
kubectl create secret generic mysql-pass --from-literal=password=mypassword
使用以下內容,建立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:8 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: pvc-disk mountPath: /var/lib/mysql volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
參數
說明
mountPath
雲端硬碟掛載的位置。
claimName
PVC的名稱,用於綁定PVC。
執行以下命令,建立應用並掛載PVC。
kubectl create -f mysql.yaml
查看已建立的應用。
在叢集管理頁左側導覽列,選擇
。您可以在有狀態頁面看到已建立的應用。
驗證靜態雲端硬碟儲存卷的持久化儲存
當某個Pod被刪除時,重新部署的Pod將保留之前Pod在儲存卷中寫入的所有資料。您可以通過以下樣本驗證靜態雲端硬碟儲存卷的持久化儲存特性。
確認MySQL應用中已掛載雲端硬碟:執行以下命令,查看
/var/lib/mysql
路徑下是否掛載了新的雲端硬碟。kubectl exec mysql-0 -- df -h /var/lib/mysql
預期輸出:
Filesystem Size Used Avail Use% Mounted on /dev/vdd 25G 213M 25G 1% /var/lib/mysql
在雲端硬碟裡建立檔案。
執行以下命令,在
/var/lib/mysql
路徑下建立檔案test-persistent
。kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
執行以下命令,確認檔案已建立。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
預期輸出:
/var/lib/mysql/test-persistent
執行以下命令,刪除名為
mysql-0
的Pod。kubectl delete pod mysql-0
預期輸出:
pod "mysql-0" deleted
驗證刪除Pod後,雲端硬碟中建立的檔案是否仍然存在。
執行以下命令,確認重建後的Pod已正常運行。
kubectl get pod mysql-0
預期輸出:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 12s
執行以下命令,查看之前建立的檔案。
kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent
預期輸出:
/var/lib/mysql/test-persistent
test-persistent
檔案仍然存在,說明靜態雲端硬碟儲存卷的資料可以持久儲存。