云盘是阿里云提供的数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点。部署阿里云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
。