云盤是阿里云為云服務器ECS提供的數據塊級別的塊存儲產品,具有低時延、高性能、持久性、高可靠等特點。集群支持使用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
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在存儲卷頁面,單擊創建。
在創建存儲卷對話框中配置參數。
參數
描述
存儲卷類型
本文中選擇為云盤。
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
文件仍然存在,說明靜態云盤存儲卷的數據可以持久保存。