ACS算力使用云盘存储卷最佳实践

本文介绍在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的拓扑亲和性调度, 避免PodPVC/PV分布在不同的可用区。

  • 文件系统选择:通过parameters.fstype明确文件系统类型。推荐采用XFS文件系统,其支持大元数据块和延迟日志,可提升大规模并行I/O性能。

ACS使用云盘方式

方式对比与选型

特性

临时存储

持久化存储

数据生命周期

Pod绑定,删除即销毁

独立于Pod,需手动删除PVCPV

数据恢复能力

无(数据丢失不可逆)

支持(PVC保留,可重建Pod)

存储成本

按需创建,Pod存活期间计费

持续计费,直至存储资源释放

适用场景

临时缓存、中间计算结果

数据库、日志系统、有状态应用

说明

ACK 1.24及以下版本的集群不支持临时存储。

基于上述特性,选型建议如下:

  • 优先选择临时存储:若业务数据可容忍丢失,且需快速弹性扩缩容(如无状态Web应用)。

  • 强制选择持久化存储:对于需要数据持久化、跨Pod数据共享或高可用的场景(如Kubernetes集群中的MySQL集群)。

通过合理选择存储方案,您可以在ACS集群中实现资源利用效率与数据可靠性的平衡,同时借助阿里云存储服务的能力(如云盘快照、跨可用区复制等),进一步增强系统的容灾能力。

临时存储

临时存储(Ephemeral Storage)是Kubernetes中一种轻量级的存储方案,通过ephemeral类型的Volume实现。其核心特性是存储生命周期与Pod完全绑定:当Pod被删除时,关联的PVCPV将自动销毁,且数据不可恢复。这种机制适用于需要短暂存储的场景,例如临时缓存、日志缓冲、中间计算结果、临时数据处理等。

该类存储还具备以下优势:

  • 资源隔离:每个Pod独立拥有存储资源,避免共享存储导致的性能竞争或数据污染。

  • 声明式配置简化:通过volumeClaimTemplate直接内嵌在Pod模板中,无需预先创建PVCPV,简化了资源管理流程。

以下是一个Deployment挂载云盘存储卷作为临时存储的YAML示例:

展开查看完整YAML示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ephemeral-example
  labels:
    a1libabacloud.com/compute-class: performance
spec:
  replicas: 2
  selector:
    matchLabels:
      pod: example-pod
  strategy:
    type: Recreate      
  template:
    metadata:
      labels:
        pod: example-pod
    spec:
      containers:
        - name: nginx
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          resources:
            requests:
              cpu: 500m
              memory: 2Gi
              ephemeral-storage: 2Gi
          volumeMounts:
          - mountPath: "/scratch"
            name: scratch-volume
      nodeSelector:
        kubernetes.io/hostname: virtual-kubelet-cn-hangzhou-j
      tolerations:
      - operator: Exists
        key: virtual-kubelet.io/provider
      volumes:
        - name: scratch-volume
          ephemeral:      # 声明当前存储为临时存储
            volumeClaimTemplate:
              metadata:
                labels:
                  type: scratch-volume
              spec:
                accessModes: [ "ReadWriteOncePod" ]
                storageClassName: alicloud-essd
                resources:
                  requests:
                    storage: 30Gi

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)。RWXOEphemeral Volume的推荐模式,表示仅允许单个Pod以读写方式挂载,确保数据一致性。

  • 规划存储容量:请根据Pod实际需求调整storage,过小可能导致存储空间不足,过大会浪费资源。建议监控Podephemeral-storage使用情况(如通过Prometheus或云监控服务)进行动态调整。

持久化存储

持久化存储通过StatefulSet控制器实现,其核心是PVCPV的生命周期独立于Pod。即使Pod因缩容、故障或手动删除而终止,PVCPV仍保留数据,可被新Pod重新绑定。这种机制适用于有状态应用(如数据库、消息队列)或需要跨Pod数据共享的场景。

StatefulSet通过以下机制确保存储的持久性:

  • 独立PVC管理:每个Pod由独立的PVC关联,通过volumeClaimTemplates自动生成PVC,但PVC的生命周期与Pod解耦。

  • 有序恢复:StatefulSet控制器在Pod重建时优先恢复存储卷,确保数据一致性。

以下是一个StatefulSet挂载云盘存储卷作为持久化存储的YAML示例:

展开查看完整YAML示例

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-statefulset
  labels:
    alibabacloud.com/compute-class: performance
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      nodeSelector:
        kubernetes.io/hostname: virtual-kubelet-cn-hangzhou-j
      tolerations:
      - operator: Exists
        key: virtual-kubelet.io/provider
      containers:
        - name: mysql
          image: mysql:5.7
          volumeMounts:
          - name: mysql-data
            mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: alicloud-essd
      resources:
        requests:
          storage: 50Gi

YAML示例中,请注意以下关键配置:

  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: alicloud-essd
      resources:
        requests:
          storage: 50Gi
  • 选择StorageClass:通过StorageClassName选择预先创建好的StorageClass。

  • 配置访问模式:建议将accessModes配置为ReadWriteOnce(RWO),确保存储卷仅被单个节点挂载,符合数据库单实例访问需求。

  • 数据持久性保障:PVCPod删除后仍保留。通过kubectl delete pod -n <namespace> <pod-name>强制重建Pod,新Pod将重新绑定原PVC。