挂载云盘数据卷

云盘是阿里云提供的数据块级别的存储产品,具有低时延、高性能、持久性、高可靠等特点。通过FlexVolume插件,ECI支持挂载云盘作为数据卷。本文介绍如何挂载云盘到ECI实例上。

注意事项

  • 待挂载的云盘必须是按量付费。更多信息,请参见块存储计费

  • 云盘为非共享存储,一个云盘只能挂载到一个实例上。

  • 一个ECI实例最多可以挂载6个云盘数据卷。

  • 云盘只能挂载到相同可用区的实例上,不支持跨可用区挂载。

  • 不支持挂载开启多重挂载功能的云盘(即NVMe共享盘)。

配置说明

调用CreateContainerGroup接口创建ECI实例时,您可以通过Volume相关参数声明数据卷,然后通过Container.VolumeMount相关参数为容器挂载数据卷。相关参数说明如下,更多信息,请参见CreateContainerGroup

声明数据卷

通过Volume相关参数声明数据卷时,需要先明确Volume的名称和类型。再根据Volume.N.Type的取值,进一步配置该类型数据卷的相关参数。

名称

类型

示例值

描述

Volume.N.Name

String

disk-demo

数据卷名称。

Volume.N.Type

String

FlexVolume

取值为FlexVolume,表示创建一个通过FlexVolume插件挂载的数据卷。

Volume.N.FlexVolume.Driver

alicloud/disk

alicloud/disk

使用FlexVolume插件挂载数据卷时的驱动类型。目前支持alicloud/disk,表示挂载阿里云云盘。

Volume.N.FlexVolume.FsType

String

ext4

文件系统类型。您可以选择以哪种数据类型将数据存储到云盘上,支持的类型包括ext4、ext3、xfs、vfat。默认为ext4。

Volume.N.FlexVolume.Options

String

{"volumeSize":"50","tags":"test:eci"}

FlexVolume对象选项列表。为KV形式,采用JSON传递。

通过FlexVolume挂载云盘时,Options表示云盘数据卷的配置参数,可配置的参数如下:

  • 静态指定已有云盘

    • volumeId:已有云盘ID。

  • 动态创建新的云盘

    • volumeSize:云盘大小,单位为GiB。取值范围为20~32768。

    • performanceLevel:云盘性能等级。更多信息,请参见ESSD云盘

    • deleteWithInstance:是否随实例释放,默认为true。

    • encrypted:是否加密云盘,默认为false。更多信息,请参见加密概述

    • kmsKeyId:加密云盘时,云盘使用的KMS密钥ID。

    • tags:云盘要绑定的标签,最多可以绑定20个。格式为"tagkey1:tagvalue1,tagkey2:tagvalue2"

重要
  • 动态创建的云盘默认采用ESSD云盘,暂不支持指定云盘类型。

  • 当volumeId为空,volumeSize字段为必填;当2个字段都有值,则volumeSize将被忽略。

挂载数据卷

声明数据卷后,可以通过VolumeMount相关参数将数据卷挂载到容器中。

名称

类型

示例值

描述

Container.N.VolumeMount.N.Name

String

test-volume

要挂载到容器的数据卷的名称,对应Volume.N.Name的值。

Container.N.VolumeMount.N.MountPath

String

/usr/share

挂载目录。

容器挂载目录下的内容会被数据卷的内容直接覆盖,请准确填写。

Container.N.VolumeMount.N.SubPath

String

/usr/sub

数据卷下的子目录。方便实例将同一个数据卷下的不同目录挂载到容器的不同目录。

Container.N.VolumeMount.N.ReadOnly

Boolean

false

挂载目录是否只读。默认为false。

Container.N.VolumeMount.N.MountPropagation

String

None

数据卷的挂载传播设置。挂载传播允许将容器挂载的卷共享到同一ECI实例中的其他容器,甚至可以共享到同一宿主机上的其他ECI实例。取值范围:

  • None:该卷不感知任何后续在此卷或其子目录上执行的挂载操作。

  • HostToContainer:该卷将会感知到后续在此卷或其子目录上的挂载操作。

  • Bidirectional:和HostToContainer类似,能感知挂载操作。另外,该卷将被传播回宿主机和使用同一卷的所有ECI实例的所有容器。

默认值:None。

说明

Init容器也支持挂载数据卷,参数与上表类似,只需要将Container改为InitContainer。

配置示例

  • OpenAPI

    调用CreateContainerGroup接口创建ECI实例,并为其挂载云盘数据卷。所采用的参数示例如下,更多信息,请参见CreateContainerGroup

    • 示例一:静态

      ContainerGroupName=test-disk1
      SecurityGroupId=sg-bp1daxpbz9lzpvvc****
      VSwitchId=vsw-bp1gds63lmlm7ib05****
      #声明数据卷
      Volume.1.Name=disk-demo
      Volume.1.Type=FlexVolume
      Volume.1.FlexVolume.Driver=alicloud/disk
      Volume.1.FlexVolume.FsType=ext4
      Volume.1.FlexVolume.Options={"volumeId":"d-2zebuamrpar7xnj****"}
      #为容器挂载数据卷
      Container.1.Name=nginx
      Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
      Container.1.VolumeMount.1.Name=disk-demo
      Container.1.VolumeMount.1.MountPath=/data
      说明

      静态挂载时,指定的云盘必须处于待挂载状态,且与待创建的ECI实例处于同一可用区。

    • 实例二:动态

      ContainerGroupName=test-disk2
      #声明数据卷
      Volume.1.Name=disk-demo
      Volume.1.Type=FlexVolume
      Volume.1.FlexVolume.Driver=alicloud/disk
      Volume.1.FlexVolume.FsType=ext4
      Volume.1.FlexVolume.Options={"volumeSize":"50","tags":"test:eci"}
      #为容器挂载数据卷
      Container.1.Name=nginx
      Container.1.Image=registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2
      Container.1.VolumeMount.1.Name=disk-demo
      Container.1.VolumeMount.1.MountPath=/data
  • Python SDK

    通过Python SDK(版本高于1.0.8)创建MySQL应用,其中数据文件保存在云盘中,云盘ID为d-2zefzudpm3649e****。示例代码如下:

    from aliyunsdkeci.request.v20180808.CreateContainerGroupRequest import CreateContainerGroupRequest
    request = CreateContainerGroupRequest()
    request.set_SecurityGroupId(secureGroup-xxx)
    request.set_VSwitchId(vSwitch-xxx)
    request.set_ContainerGroupName(name-xxx)
    request.set_EipInstanceId(eip-xxx)
    request.set_RestartPolicy('Always')
    #volume1为云盘数据卷,用于保存MySQL数据文件
    volume1 = {
        'Name': 'mysql-data-volume',
        'Type': 'FlexVolume',
        'FlexVolume.Driver': 'alicloud/disk'
        'FlexVolume.FsType': 'ext4',
        'FlexVolume.Options': '{\"volumeId\": \"d-2zefzudpm3649e****\"}',
    }
    #volume2为ConfigFile数据卷,用于注入配置数据;Content需要进行Base64编码
    configFileToPath = {
        'Path': 'my.cnf',
        'Content': 'aGVsbG8gd29ybGQ=',
    }
    volume2 = {
        'Name': 'mysql-config-volume',
        'Type': 'ConfigFileVolume',
        'ConfigFileVolume.ConfigFileToPaths': [configFileToPath],
    }
    #安装volume到containerGroup
    request.set_Volumes([volume1, volume2])
    #volumeMounts,挂载containerGroup安装的数据卷到容器目录
    volume_mount1 = {
        'Name': 'mysql-data-volume',
        'MountPath': '/var/lib/mysql',
        'ReadOnly': False,
    }
    volume_mount2 = {
        'Name': 'mysql-config-volume',
        'MountPath': '/etc/mysql/conf.d/',
        'ReadOnly': False,
    }
    #environment variable
    env ={
        'Key': 'MYSQL_ROOT_PASSWORD',
        'Value': '123456',
    }
    #container ports
    port = {
        'Protocol':'TCP',
        'Port': 3306,
    }
    # containers
    container = {
        'Image': 'mysql:5.7',
        'Name': 'mysql',
        'Cpu': 0.5,
        'Memory': 1.0,
        'ImagePullPolicy': 'Always',
        'VolumeMounts': [volume_mount1, volume_mount2],
        'EnvironmentVars': [env],
        'Ports': [port],
    }
    request.set_Containers([container])
    response = eciClient.do_action_with_exception(request)
    print response
                                            

阿里云首页 弹性容器实例 相关技术圈