云盤是阿里云提供的數據塊級別的存儲產品,具有低時延、高性能、持久性、高可靠等特點。部署阿里云CSI插件后,您可以在自建的Kubernetes集群使用阿里云云盤作為Volume。使用PVC方式掛載云盤時,支持靜態數據卷和動態數據卷,本文為您介紹如何使用PVC方式,掛載云盤到ECI Pod上。
前提條件
自建Kubernetes集群中已部署VNode。
集群版本為1.16及以上版本,且已部署CSI-Provisioner組件。
重要關于如何部署CSI-Provisioner組件,請參見alibaba-cloud-csi-driver。如果部署過程中出現問題,請在GitHub提交issue。
如果您的Kubernetes集群部署在線下IDC,請確保已打通IDC與阿里云的網絡。
注意事項
掛載云盤時,請注意以下事項:
云盤為非共享存儲,一個云盤只能掛載到一個Pod。
云盤只能掛載到相同可用區的VNode節點下的ECI Pod,不支持跨可用區掛載。
靜態掛載云盤
創建云盤。
創建PV。
參考參數說明表修改以下YAML內容,并保存為static-disk-pv.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: static-disk-pv labels: alicloud-pvname: static-disk-pv spec: capacity: storage: 25Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com volumeHandle: "<your disk-id>" #替換為云盤ID nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: - "<your-node-zone-id>" #替換為VNode所在可用區
相關參數說明如下表所示:
參數
描述
driver
驅動類型。此處配置為
diskplugin.csi.alibabacloud.com
,表示使用阿里云云盤CSI插件。volumeHandle
云盤ID。
執行以下命令創建PV。
kubectl create -f static-disk-pv.yaml
創建PVC。
將以下內容保存為static-disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: static-disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 25Gi selector: matchLabels: alicloud-pvname: static-disk-pv
執行以下命令創建PVC。
kubectl create -f static-disk-pvc.yaml
將云盤掛載到ECI Pod。
將以下內容保存為static-disk-test.yaml。
apiVersion: v1 kind: Pod metadata: name: static-disk-test labels: alibabacloud.com/eci: "true" spec: nodeSelector: k8s.aliyun.com/vnode: "true" tolerations: - key: k8s.aliyun.com/vnode operator: "Equal" value: "true" effect: "NoSchedule" containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 name: web volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: static-disk-pvc
執行以下命令創建Pod。
kubectl create -f static-disk-test.yaml
查看結果。
kubectl get pods -o wide
預期返回:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES static-disk-test 1/1 Running 0 44s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none>
查看Pod中的文件目錄,可以看到已生成云盤對應的掛載目錄
/data
。
動態掛載云盤
創建StorageClass。
參考參數說明表修改以下YAML內容,并保存為disk-sc.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-essd provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_essd regionId: cn-beijing zoneId: cn-beijing-l fstype: ext4 readonly: "true" mkfsOptions: "-O project,quota" diskTags: "key1:value1,key2:value2" encrypted: "false" performanceLevel: PL1 volumeBindingMode: Immediate reclaimPolicy: Delete allowVolumeExpansion: true
相關參數說明如下表所示:
參數
描述
provisioner
驅動類型。此處配置為
diskplugin.csi.alibabacloud.com
,表示使用阿里云云盤CSI插件。type
云盤類型。取值:
cloud_essd:ESSD云盤。
cloud_ssd:SSD云盤。
cloud_efficiency:高效云盤。
available:優先創建SSD云盤,若可用區內SSD云盤沒有資源,則創建高效云盤。
說明除available外,支持任意組合其它三種參數,例如:
type: cloud_efficiency, cloud_ssd, cloud_essd
,此時將依次嘗試創建指定類型的云盤,直到創建成功。regionId、zoneId
云盤所屬的地域和可用區,需與VNode相同。
fstype
云盤的文件系統,默認為ext4。
readonly
掛載自動創建云盤的權限是否為可讀。默認為false。
true:云盤具有只讀權限。
false:云盤具有可讀可寫權限。
mkfsOptions
云盤格式化所用的參數。例如:
mkfsOptions: "-O project,quota"
。diskTags
云盤綁定的標簽。格式為
key1:value1,key2:value2
。encrypted
云盤是否加密。默認為false,表示創建的云盤不加密。
performanceLevel
ESSD云盤的性能級別。可選值:PL0、PL1、PL2或PL3。更多信息,請參見ESSD云盤。
volumeBindingMode
云盤的綁定模式。默認為Immediate,表示先創建云盤再創建Pod。
reclaimPolicy
云盤的回收策略,默認為Delete,支持Retain。
Delete:刪除PVC時,PV和云盤會一起刪除。
Retain:刪除PVC時,PV和云盤不會被刪除,需要您手動刪除。
如果數據安全性要求高,推薦使用Retain方式以免誤刪數據。
allowVolumeExpansion
是否自動擴容云盤。
創建StorageClass。
kubectl create -f disk-sc.yaml
創建PVC。
將以下內容保存為disk-pvc.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 25Gi storageClassName: alicloud-disk-essd
執行以下命令創建PVC。
kubectl create -f disk-pvc.yaml
此時,系統將根據StorageClass的配置自動創建云盤,以及對應的PV。
將云盤掛載到ECI Pod。
將以下內容保存為disk-test.yaml。
說明建議使用StatefulSet來掛載云盤,不建議使用Deployment。Deployment是無狀態服務,重啟Pod時,無法保證新Pod啟動時間和舊Pod結束時間之間的時間疊加,且Deployment多副本模式不能為每個Pod配置獨立的Volume。
apiVersion: apps/v1 kind: StatefulSet metadata: name: disk-test spec: selector: matchLabels: app: nginx serviceName: "nginx" template: metadata: labels: app: nginx spec: nodeSelector: k8s.aliyun.com/vnode: "true" tolerations: - key: k8s.aliyun.com/vnode operator: "Equal" value: "true" effect: "NoSchedule" containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 name: web volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
執行以下命令創建Statueful。
kubectl create -f disk-test.yaml
查看結果。
kubectl get pods -o wide
預期返回:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES disk-test-0 1/1 Running 0 3m58s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none>
查看Pod中的文件目錄,可以看到已生成云盤對應的掛載目錄
/data
。