本文介绍在ACS集群中使用云盘存储卷的最佳实践,包括StorageClass配置建议,以及挂载云盘作为临时存储或者持久化存储的应用配置建议。
云盘存储卷介绍
阿里云块存储服务(Elastic Block Service, EBS)为计算实例提供高吞吐、低延迟的持久化存储解决方案,是支撑高性能计算(HPC)、人工智能(AI)、大数据分析等算力密集型场景的核心基础设施。更多信息,请参见块存储概述
ACS支持使用以下类型的云盘作为存储卷:
cloud_essd_entry
:ESSD Entry云盘cloud_auto
:ESSD AutoPL云盘cloud_essd
(默认值):ESSD云盘cloud_ssd
:SSD云盘cloud_efficiency
:高效云盘
SSD云盘、高效云盘等属于上一代云盘产品,已在部分地域及可用区逐步停止售卖。并且ACS GPU算力不支持这类云盘,推荐您优先使用ESSD系列云盘以保持兼容性。
StorageClass配置建议
通过StorageClass可以实现存储资源的动态供应与拓扑感知调度。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-essd
parameters:
type: cloud_auto,cloud_essd
fstype: xfs
provisioner: diskplugin.csi.alibabacloud.com
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
StorageClass的核心参数设计需遵循以下原则:
存储类型绑定:通过
parameters.type
明确指定云盘类型。示例中的cloud_auto,cloud_essd
表示优先使用cloud_auto
(ESSD AutoPL云盘),其次使用cloud_essd
(ESSD云盘)。其中,ESSD云盘支持通过performanceLevel
参数定义性能等级(PL0~PL3),以匹配HPC、AI训练等场景的I/O需求。绑定模式优化:建议将
volumeBindingMode
配置为WaitForFirstConsumer
(先调度Pod,再根据Pod的可用区信息创建云盘),结合阿里云弹性供应机制,可以实现存储卷与Pod的拓扑亲和性调度, 避免Pod和PVC/PV分布在不同的可用区。文件系统选择:通过
parameters.fstype
明确文件系统类型。推荐采用XFS文件系统,其支持大元数据块和延迟日志,可提升大规模并行I/O性能。
ACS使用云盘方式
方式对比与选型
特性 | 临时存储 | 持久化存储 |
数据生命周期 | 与Pod绑定,删除即销毁 | 独立于Pod,需手动删除PVC和PV |
数据恢复能力 | 无(数据丢失不可逆) | 支持(PVC保留,可重建Pod) |
存储成本 | 按需创建,Pod存活期间计费 | 持续计费,直至存储资源释放 |
适用场景 | 临时缓存、中间计算结果 | 数据库、日志系统、有状态应用 |
ACK 1.24及以下版本的集群不支持临时存储。
基于上述特性,选型建议如下:
优先选择临时存储:若业务数据可容忍丢失,且需快速弹性扩缩容(如无状态Web应用)。
强制选择持久化存储:对于需要数据持久化、跨Pod数据共享或高可用的场景(如Kubernetes集群中的MySQL集群)。
通过合理选择存储方案,您可以在ACS集群中实现资源利用效率与数据可靠性的平衡,同时借助阿里云存储服务的能力(如云盘快照、跨可用区复制等),进一步增强系统的容灾能力。
临时存储
临时存储(Ephemeral Storage)是Kubernetes中一种轻量级的存储方案,通过ephemeral
类型的Volume实现。其核心特性是存储生命周期与Pod完全绑定:当Pod被删除时,关联的PVC和PV将自动销毁,且数据不可恢复。这种机制适用于需要短暂存储的场景,例如临时缓存、日志缓冲、中间计算结果、临时数据处理等。
该类存储还具备以下优势:
资源隔离:每个Pod独立拥有存储资源,避免共享存储导致的性能竞争或数据污染。
声明式配置简化:通过
volumeClaimTemplate
直接内嵌在Pod模板中,无需预先创建PVC和PV,简化了资源管理流程。
以下是一个Deployment挂载云盘存储卷作为临时存储的YAML示例:
在YAML示例中,请注意以下关键配置:
volumes:
- name: scratch-volume
ephemeral: # 声明当前存储为临时存储
volumeClaimTemplate:
metadata:
labels:
type: scratch-volume
spec:
accessModes: [ "ReadWriteOncePod" ]
storageClassName: alicloud-essd
resources:
requests:
storage: 30Gi
选择StorageClass:通过
StorageClassName
选择预先创建好的StorageClass。配置访问模式:建议将
accessModes
配置为ReadWriteOncePod
(RWXO)。RWXO是Ephemeral Volume的推荐模式,表示仅允许单个Pod以读写方式挂载,确保数据一致性。规划存储容量:请根据Pod实际需求调整
storage
,过小可能导致存储空间不足,过大会浪费资源。建议监控Pod的ephemeral-storage
使用情况(如通过Prometheus或云监控服务)进行动态调整。
持久化存储
持久化存储通过StatefulSet控制器实现,其核心是PVC和PV的生命周期独立于Pod。即使Pod因缩容、故障或手动删除而终止,PVC和PV仍保留数据,可被新Pod重新绑定。这种机制适用于有状态应用(如数据库、消息队列)或需要跨Pod数据共享的场景。
StatefulSet通过以下机制确保存储的持久性:
独立PVC管理:每个Pod由独立的PVC关联,通过
volumeClaimTemplates
自动生成PVC,但PVC的生命周期与Pod解耦。有序恢复:StatefulSet控制器在Pod重建时优先恢复存储卷,确保数据一致性。
以下是一个StatefulSet挂载云盘存储卷作为持久化存储的YAML示例:
在YAML示例中,请注意以下关键配置:
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: alicloud-essd
resources:
requests:
storage: 50Gi
选择StorageClass:通过
StorageClassName
选择预先创建好的StorageClass。配置访问模式:建议将
accessModes
配置为ReadWriteOnce
(RWO),确保存储卷仅被单个节点挂载,符合数据库单实例访问需求。数据持久性保障:PVC在Pod删除后仍保留。通过
kubectl delete pod -n <namespace> <pod-name>
强制重建Pod,新Pod将重新绑定原PVC。