使用静态存储卷挂载预先创建的云盘

云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。集群支持使用CSI插件创建云盘静态存储卷和动态存储卷,您可以通过手动创建PV及PVC的方式挂载静态存储卷以实现应用的持久化存储。

前提条件

  • 已创建集群,并且在该集群中安装CSI插件。具体操作,请参见创建ACK托管集群创建集群

    重要
    • 如果您的集群中包含CentOS 7.9镜像(或其他运行小于4.9版本Linux内核)的宿主机,并且在集群中使用了XFS文件系统(fstype参数设置为xfs)的存储卷,请勿将CSI组件升级到v1.24.7及以上的版本。因为旧版内核与新版本组件不兼容。如果误升级,挂载XFS文件系统的存储卷的Pod将可能无法启动,对其他文件系统无影响,请提交工单处理。

    • 如需将CSI组件升级至v1.26.4版本,您需要将CSI provisioner和CSI plugin同时升级至该版本。

  • 已创建按量付费的云盘并记录云盘ID为d-wz92s6d95go6ki9x****。请确保该云盘与集群在同一地域。具体操作,请参见创建空数据盘

    说明

    申请云盘时,请遵循如下容量限制:

    • 高效云盘:最小20 GiB。

    • SSD云盘:最小20 GiB。

    • ESSD云盘:最小1 GiB。

  • 已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群

使用场景

云盘的使用场景包括:

  • 对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。

  • 高速写日志。

  • 持久化存储数据,不会因Pod生命周期的结束而消失。

静态云盘的使用场景:已经购买了云盘实例的情况。

静态云盘使用方式:需手动创建PV及PVC。

使用限制

  • 云盘不支持跨可用区使用。

  • 未开启多重挂载的云盘只能同时被一个Pod挂载。关于多重挂载更多信息,请参见使用NVMe云盘多重挂载及Reservation

  • 云盘类型和ECS类型需要匹配才可以挂载,否则会导致Pod无法启动。关于云盘类型和ECS类型的匹配关系,请参见实例规格族

    重要

    当您将集群中的ECS实例从按量付费转换成包年包月时,不能将云盘一起变成包年包月,否则云盘将无法被挂载使用。您可以通过购买SCU的方式降低成本。关于SCU的更多信息,请参见存储容量单位包SCU概述

通过控制台的方式使用云盘静态存储卷

步骤一:创建PV

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  3. 存储卷页面,单击创建

  4. 创建存储卷对话框中配置参数。

    参数

    描述

    存储卷类型

    本文中选择为云盘

    • ACK集群:支持云盘、NAS、OSS云存储类型。

    • ACK Serverless集群:支持云盘、NAS云存储类型。

    访问模式

    默认为ReadWriteOnce。

    云盘ID

    您可以选择与集群处于相同地域和可用区下的待挂载状态的云盘。

    文件系统类型

    您可以选择以何种数据类型将数据存储到云盘上,支持的类型包括ext4ext3xfsvfat。默认为ext4

  5. 参数配置完成后,单击创建

步骤二:创建PVC

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击右上角的创建

  3. 创建存储声明对话框中,配置参数。

    参数

    描述

    存储声明类型

    本文中选择为云盘

    • ACK集群:支持云盘、NAS、OSS云存储类型。

    • ACK Serverless集群:支持云盘、NAS云存储类型。

    名称

    创建的数据卷的名称,数据卷名在命名空间内必须唯一。

    分配模式

    本文中选择已有存储卷。

    说明

    若未创建存储卷,您可以设置分配模式创建存储卷,配置创建存储卷参数。具体操作,请参见创建PV

    已有存储卷

    单击已有存储卷,在目标存储卷右侧操作列单击选择,选择存储卷。

    总量

    所创建存储卷的容量。

    说明

    所创建的存储卷容量不能超过云盘容量。

    访问模式

    默认为ReadWriteOnce。

  4. 单击创建

    创建成功后可以在列表中看到存储声明,并且已绑定相应的存储卷。

步骤三:创建应用

  1. 在集群管理页左侧导航栏,选择工作负载 > 有状态

  2. 有状态页面,单击使用镜像创建

  3. 配置创建应用的参数信息。

    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet

  4. ACK数据卷支持配置本地存储和云存储,本示例需要配置云存储类型。配置了一个云盘类型的数据卷,将该云盘挂载到容器的/tmp路径下,在该路径下生成的容器数据会存储到云盘中。数据卷

  5. 所有的信息都配置完成后,单击创建

    创建成功后,您就可以正常使用数据卷。

通过kubectl命令行的方式使用云盘静态存储卷

步骤一:创建PV和PVC

  1. 使用以下内容,创建disk-static.yaml文件。请替换文件中的如下内容:

    • <YOUR-DISK-ID>:事先创建的云盘ID,例如d-wz92s6d95go6ki9x****

    • <YOUR-DISK-SIZE>:该云盘的大小,例如25Gi

    • <YOUR-DISK-CATEGORY>:该云盘的类型,例如cloud_essd

    • <YOUR-DISK-ZONE-ID>:该云盘所在的可用区,例如cn-beijing-i

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "<YOUR-DISK-ID>"
      annotations:
        csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}'
    spec:
      capacity:
        storage: "<YOUR-DISK-SIZE>"
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        namespace: default
        name: disk-pvc
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: diskplugin.csi.alibabacloud.com
        volumeHandle: "<YOUR-DISK-ID>"
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.diskplugin.csi.alibabacloud.com/zone
              operator: In
              values:
              - "<YOUR-DISK-ZONE-ID>"
      storageClassName: disk
      volumeMode: Filesystem
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "<YOUR-DISK-SIZE>"
      storageClassName: disk
      volumeName: "<YOUR-DISK-ID>"

    参数

    说明

    accessModes

    设置访问模式。通常为ReadWriteOnce。PV和PVC的设置需保持一致。详见动态存储卷中的说明

    persistentVolumeReclaimPolicy

    PV的回收策略。

    • Delete:删除PVC时,PV和云盘会一起删除。

    • Retain:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。

    driver

    定义驱动类型。取值为diskplugin.csi.alibabacloud.com,表示使用阿里云云盘CSI插件。

    storageClassName

    对静态卷无意义,但PV和PVC的设置需保持一致,Storage Class对象无需事先存在。

    nodeAffinity

    定义PV所属的可用区信息。

    通过定义该参数,可以确保使用该存储卷的Pod调度到正确的可用区。

    annotations["csi.alibabacloud.com/volume-topology"]

    成功挂载该存储卷所需的额外节点约束。推荐填写云盘类型,以确保Pod调度到支持该类型云盘的节点。

    claimRef

    指定PV所能绑定的PVC,如希望PV可被任意PVC绑定请删除该参数。

    volumeName

    指定PVC所能绑定的PV,如希望PVC可绑定任意PV请删除该参数。

  2. 执行以下命令,创建PV和PVC。

    kubectl apply -f disk-static.yaml
  3. 执行以下命令查看创建的PV和PVC。

    kubectl get pv <YOUR-DISK-ID>
    kubectl get pvc disk-pvc

    预期输出:

    NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM              STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    d-wz92s6d95go6ki9x****   20Gi       RWO            Retain           Bound       default/disk-pvc   disk           <unset>                          27s
    
    NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Bound    d-wz92s6d95go6ki9x****   20Gi       RWO            disk           <unset>                 27s

    PV和PVC应该在数秒内进入Bound状态。

步骤二:创建应用

本文以MySQL应用为例,在应用中挂载PVC。

  1. 使用以下命令,创建Secret,用于设置MySQL应用的root账号密码。请注意,在生产环境中请更换密码。

    kubectl create secret generic mysql-pass --from-literal=password=mypassword
  2. 使用以下内容,创建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:8
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /var/lib/mysql
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc

    参数

    说明

    mountPath

    云盘挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

  3. 执行以下命令,创建应用并挂载PVC。

    kubectl create -f mysql.yaml
  4. 查看已创建的应用。

    在集群管理页左侧导航栏,选择工作负载 > 有状态。您可以在有状态页面看到已创建的应用。

验证静态云盘存储卷的持久化存储

当某个Pod被删除时,重新部署的Pod将保留之前Pod在存储卷中写入的所有数据。您可以通过以下示例验证静态云盘存储卷的持久化存储特性。

  1. 确认MySQL应用中已挂载云盘:执行以下命令,查看/var/lib/mysql路径下是否挂载了新的云盘。

    kubectl exec mysql-0 -- df -h /var/lib/mysql

    预期输出:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdd         25G  213M   25G   1% /var/lib/mysql
  2. 在云盘里创建文件。

    1. 执行以下命令,在/var/lib/mysql路径下创建文件test-persistent

      kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
    2. 执行以下命令,确认文件已创建。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      预期输出:

      /var/lib/mysql/test-persistent
  3. 执行以下命令,删除名为mysql-0的Pod。

    kubectl delete pod mysql-0

    预期输出:

    pod "mysql-0" deleted
  4. 验证删除Pod后,云盘中创建的文件是否仍然存在。

    1. 执行以下命令,确认重建后的Pod已正常运行。

      kubectl get pod mysql-0

      预期输出:

      NAME      READY   STATUS    RESTARTS   AGE
      mysql-0   1/1     Running   0          12s
    2. 执行以下命令,查看之前创建的文件。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      预期输出:

      /var/lib/mysql/test-persistent

      test-persistent文件仍然存在,说明静态云盘存储卷的数据可以持久保存。