云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。ACS支持使用CSI插件创建云盘动态存储卷。本文介绍如何使用云盘动态存储卷,以及如何验证云盘动态存储卷的持久化存储特性。
使用说明
类别 | 说明 |
适用场景 | 没有提前购买云盘,在应用部署时自动购买云盘的情况。 |
使用方式 |
|
前提条件
已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
环境准备
创建自定义存储类
ACS 默认提供了名为 alicloud-disk-topology-alltype
的存储类, 该存储类里面支持依次创建 cloud_essd
,cloud_ssd
,cloud_efficiency
类型的存储。 如果默认提供的存储类无法满足需求,您可以手动使用kubectl 创建存储类。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alibaba-cloud-custom
parameters:
type: cloud_essd,cloud_ssd
provisioner: diskplugin.csi.alibabacloud.com
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters
部分相关参数说明如下:
字段 | 说明 | 举例 |
| 云盘类型。默认参数名为
以上参数可任意组合。此配置方式会支持对指定类型的云盘依次创建,直到创建成功。 | |
| 可选,自动创建云盘所使用的文件系统,默认为 |
|
| 可选,ESSD云盘的性能级别,取值 |
|
操作步骤
您可以通过以下两种方式使用云盘动态存储卷。
通过控制台的方式创建并使用云盘动态存储卷
步骤一:创建PVC
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储声明。
在存储声明页面,单击右上角的创建。
在创建存储声明对话框中,配置参数。
配置项
说明
存储声明类型
支持云盘、NAS和OSS三种云存储类型。本示例选择云盘。
名称
创建的存储声明名称在命名空间内必须唯一。
分配模式
目前仅支持使用存储类动态创建。
已有存储类
单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择。
总量
所创建存储卷的容量。
访问模式
仅支持ReadWriteOncePod。
单击创建。
创建成功后,在存储声明列表中可以看到创建的存储声明,其状态为Pending,表示当前存储声明还未绑定到存储卷。这是因为对应存储类的volumeBindingMode
字段为WaitForFirstConsumer
,即在该存储声明被工作负载消费后,才会创建存储卷并与之绑定。
步骤二:创建应用
在集群管理页左侧导航栏,选择工作负载 > 有状态。
在有状态页面,点击使用镜像创建。
配置创建应用的参数信息。
参数名
值
应用名称
mysql
副本数量
1
类型
有状态(StatefulSet)
实例类型
通用型
QoS类型
default
镜像名称
mysql:5.7
端口
80
环境变量
类型:保密字典
变量名称:
MYSQL_ROOT_PASSWORD
变量/变量引用:
mysql-pass password
数据卷
增加云存储声明(PersistentVolumeClaim):
挂载源:
disk-pvc
容器路径:
/data
以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet。
ACS数据卷支持配置本地存储和云存储声明,本例中需要配置云存储类型。在下图中,存储卷类型选择云存储,挂载源选择之前创建的存储声明,将云盘挂载到容器中的
/tmp
路径下,在该路径下生成的容器数据会存储到云盘中。所有的信息都配置完成后,单击创建。
创建成功后,在集群管理页左侧导航栏选择存储 > 存储卷,可以看到创建了一个新的存储卷,并且已经和之前的存储声明绑定。在导航栏选择存储 > 存储声明,也可以看到之前创建的存储声明状态已经变成了Bound
。
通过kubectl命令行的方式创建并使用云盘动态存储卷
步骤一:创建PVC
使用以下内容,创建pvc-disk.yaml文件。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOncePod volumeMode: Filesystem resources: requests: storage: 25Gi storageClassName: alicloud-disk-topology-alltype
参数
说明
name
PVC的名称。
accessModes
配置访问模式。
volumeMode
可选,挂载云盘的格式,为Filesystem或Block。 默认为文件系统挂载。
storageClassName
StorageClass的名称,用于绑定StorageClass。
storage
申请的云盘大小
执行以下命令,创建PVC。
kubectl create -f pvc-disk.yaml
查看创建的PVC。
在集群管理页左侧导航栏,选择
。可以在存储声明页面看到创建的PVC,其状态为Pending,等待应用消费。
步骤二:创建应用
使用以下内容,创建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:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 80 name: mysql volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvc --- apiVersion: v1 kind: Secret metadata: name: mysql-pass type: Opaque data: username: dGVz**** password: dGVzdDEt****
参数
说明
mountPath
云盘挂载的位置。
claimName
PVC的名称,用于绑定PVC。
执行以下命令,创建应用并挂载PVC。
kubectl create -f mysql.yaml
查看已创建的应用。
在集群管理页左侧导航栏,选择
。您可以在有状态页面看到已创建的应用。在左侧导航栏选择 ,可以看到创建的PVC状态已经变为Bound。
验证动态云盘的持久化存储
云盘提供了持久化存储服务,当某个Pod删除时,重新部署的Pod将自动同步之前Pod的所有数据。
根据以下示例,验证动态云盘的持久化存储特性。
查看MySQL应用所在的Pod和云盘文件。
执行以下命令,查看MySQL应用所在Pod的名称。
kubectl get pod | grep mysql
预期输出:
mysql-0 1/1 Running 0 3m
执行以下命令,查看/data路径下是否挂载了新的云盘。
kubectl exec mysql-0 -- df | grep data
预期输出:
/dev/vdb 25626852 24 25610444 1% /data
执行以下命令,查看/data路径下的文件。
kubectl exec mysql-0 -- ls /data
预期输出:
lost+found
在云盘里创建文件。
执行以下命令,在/data路径下创建文件MySQL。
kubectl exec mysql-0 -- touch /data/mysql
执行以下命令,查看/data路径下的文件。
kubectl exec mysql-0 -- ls /data
预期输出:
lost+found mysql
执行以下命令,删除名为
mysql-0
的Pod,等待其被重建。kubectl delete pod mysql-0
预期输出:
pod "mysql-0" deleted
验证删除Pod后,云盘中创建的文件是否还存在。
执行以下命令,等待mysql-0被重建,状态变为Running。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE mysql-0 1/1 Running 0 1m
执行以下命令,查看/data路径下的文件。
kubectl exec mysql-0 -- ls /data
预期输出:
lost+found mysql
MySQL文件仍然存在,说明动态云盘的数据可持久保存。