云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。ASK支持使用CSI插件创建云盘动态存储卷。本文介绍如何使用云盘动态存储卷,及如何验证云盘动态存储卷的持久化存储特性。
前提条件
- 已创建ASK集群。具体操作,请参见创建ASK集群。
- 已通过Kubectl工具连接ASK集群。具体操作,请参见通过kubectl连接Kubernetes集群。
- 已手动安装CSI存储插件。具体操作,请参见安装与升级csi-provisioner组件。
背景信息
有关StorageClass的详细说明,请参见存储类(StorageClass)。通过控制台的方式使用云盘动态存储卷
步骤一:创建StorageClass
- 登录容器服务管理控制台。
- 在控制台左侧导航栏,单击集群。
- 在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏,选择 。
- 在存储类页面,单击右上角的创建。
- 在创建对话框,配置StorageClass的相关参数。部分参数的说明如下所示:
参数 说明 名称 StorageClass的名称。 名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和短划线(-)。
存储卷类型 选择云盘。 存储驱动 选择CSI。 参数 默认参数type,其值为cloud_essd。表示云盘类型,支持cloud_efficiency、cloud_ssd、cloud_essd、available四种参数及除available外其他三种参数的任意组合。例如, type: cloud_efficiency, cloud_ssd, cloud_essd
,这种配置方式支持对指定类型云盘的依次创建,直到创建成功。其中available会对SSD、高效依次尝试创建,直到创建成功。说明 部分ECS机型不支持ESSD云盘挂载。更多信息,请参见块存储FAQ。可添加自定义参数。例如,配置zoneId,表示自动创建云盘所在的区域。单可用区集群,与集群所在区域相同。例如,
cn-beijing-a
;多可用区集群,zoneId可同时配置多个。例如,cn-beijing-a, cn-beijing-b
。回收策略 云盘的回收策略,默认为Delete,支持Retain。 - Delete模式:删除PVC的时候,PV和云盘会一起删除。
- Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain模式以免误删数据。
绑定模式 云盘的绑定模式。默认为Immediate:表示先创建云盘再创建Pod。 - 参数配置完成后,单击创建。创建成功后在存储类列表中可看到刚创建的StorageClass。
步骤二:创建PVC
- 在集群管理页左侧导航栏,选择 。
- 在存储声明页面,单击右上角的创建。
- 在创建存储声明对话框中,配置参数。
参数 描述 存储声明类型 支持云盘、NAS两种云存储类型。本文中选择云盘。 名称 创建的存储声明名称在命名空间内必须唯一。 分配模式 本文中选择使用存储类动态创建。 已有存储类 单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择。 总量 所创建存储卷的容量。 访问模式 默认为ReadWriteOnce。 - 单击创建。创建成功后在存储声明列表中可看到创建的存储声明,并且已绑定相应的存储卷。
步骤三:创建应用
- 在集群管理页左侧导航栏,选择 。
- 在有状态页面,单击使用镜像创建。
- 配置创建应用的参数信息。以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet。
ASK数据卷支持配置本地存储和云存储,本示例需要配置云存储类型。
本例中配置了一个云盘类型的数据卷,将该云盘挂载到容器中/tmp路径下,在该路径下生成的容器数据会存储到云盘中。 - 所有的信息都配置完成后,单击创建。创建成功后,您就可以正常使用数据卷。
通过kubectl命令行的方式使用云盘动态存储卷
步骤一:创建StorageClass
在多可用区集群场景下,您可以用先创建云盘再创建Pod的方式创建StorageClass。
- 使用以下内容,创建storage-class-csi.yaml文件。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-disk-ssd-b provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_ssd regionId: cn-beijing zoneId: cn-beijing-b encrypted: false reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: Immediate
参数 说明 provisioner 配置为 diskplugin.csi.alibabacloud.com
。表示使用阿里云云盘Provisioner插件创建StorageClass。type 表示云盘类型,支持cloud_efficiency、cloud_ssd、cloud_essd、available四种参数及除available外其他三种参数的任意组合。例如, type: cloud_efficiency, cloud_ssd, cloud_essd
,这种配置方式支持对指定类型云盘的依次创建,直到创建成功。其中available会对SSD、高效依次尝试创建,直到创建成功。说明 部分ECS机型不支持ESSD云盘挂载。更多信息,请参见块存储FAQ。regionId 可选,期望创建云盘的区域。 zoneId 可选,期望创建云盘的可用区。 encrypted 可选,标识创建的云盘是否加密。默认情况是false,创建的云盘不加密。 reclaimPolicy 云盘的回收策略,默认为Delete,支持Retain。 - Delete模式:删除PVC的时候,PV和云盘会一起删除。
- Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
allowVolumeExpansion 配置为true时,可以实现云盘的自动扩容。 volumeBindingMode 云盘的绑定模式。默认为Immediate:表示先创建云盘再创建Pod。 - 执行以下命令,创建StorageClass。
kubectl apply -f storage-class-csi.yaml
- 查看创建的StorageClass。
步骤二:创建PVC
- 使用以下内容,创建pvc-ssd.yaml文件。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 25Gi storageClassName: alicloud-disk-ssd-b
参数 说明 name PVC的名称。 accessModes 配置访问模式。 volumeMode 可选,挂载云盘的格式,为Filesystem或Block。 默认为文件系统挂载。 storageClassName StorageClass的名称,用于绑定StorageClass。 storage 申请的云盘大小,最小为20 GiB。 - 执行以下命令,创建PVC。
kubectl create -f pvc-ssd.yaml
- 查看创建的PVC。在集群管理页左侧导航栏选择存储声明页面可以看到创建的PVC。。可以在
步骤三:创建应用
- 创建pvc-dynamic.yaml文件。
创建一个名为nginx-dynamic的应用,并挂载PVC。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-dynamic spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 name: web volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc
参数 说明 mountPath 云盘挂载的位置。 claimName PVC的名称,用于绑定PVC。 - 执行以下命令,创建应用并挂载PVC。
kubectl create -f pvc-dynamic.yaml
- 查看创建的应用。在集群管理页左侧导航栏选择有状态页面看到创建的应用。。您可以在
验证动态云盘的持久化存储
云盘提供了持久化存储服务,当某个Pod删除时,重新部署的Pod将自动同步之前Pod的所有数据。
根据以下示例,验证动态云盘的持久化存储特性。
- 查看nginx-dynamic应用所在的Pod和云盘文件。
- 在云盘里创建文件。
- 执行以下命令,删除名为
nginx-dynamic-1****
的Pod。kubectl delete pod nginx-dynamic-1****
预期输出:
pod "nginx-dynamic-1****" deleted
- 验证删除Pod后,云盘中创建的文件是否还存在。