繁体   English   中英

AWS:使用 Batch/ECS 挂载模板磁盘

[英]AWS: Mounting a template disk with Batch / ECS

我正在使用 AWS Batch,但希望增加我的容器可用的磁盘空间。 我正在使用 CloudFormation 创建堆栈,并且我添加了一个 EC2::LaunchTemplate 以向我的实例添加一个 100GB 磁盘:(从堆栈中提取)

BigDiskTemplate:
    Type: 'AWS::EC2::LaunchTemplate'
    Properties:
      LaunchTemplateData:
        BlockDeviceMappings:
          - DeviceName: '/dev/xvdcz'
            Ebs:
              Encrypted: true
              VolumeSize: 100
              VolumeType: gp2
      LaunchTemplateName: BigDiskTemplate
  MyComputeEnvironment:
    Type: 'AWS::Batch::ComputeEnvironment'
    Properties:
      Type: MANAGED
      ComputeEnvironmentName: MyEnv
      ComputeResources:
        Type: EC2
        MinvCpus: 0
        DesiredvCpus: 0
        MaxvCpus: 256
        LaunchTemplate:
          LaunchTemplateName: BigDiskTemplate
        InstanceTypes:
          - optimal
          - c5.large
        Subnets:
          - !Ref Subnet
        SecurityGroupIds:
          - !Ref SecurityGroup
        InstanceRole: !Ref IamInstanceProfile
      ServiceRole: !Ref BatchServiceRole
}

是的,我希望磁盘是短暂的。 是的,我知道一些 EC2 实例支持更大的磁盘,但我也想用 GPU 实例来做到这一点。

当我在容器中运行lsblk时,我得到:

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme1n1       259:0    0  100G  0 disk 
└─nvme1n1p1   259:6    0  100G  0 part 
nvme0n1       259:1    0    8G  0 disk 
├─nvme0n1p1   259:2    0    8G  0 part /etc/hosts
└─nvme0n1p128 259:3    0    1M  0 part 

伟大的! 这是我的 100GB 磁盘。 但我不知道如何安装它。 根据示例和教程(诚然适用于 EC2),模板磁盘应该可以通过以下方式安装:

file -s /dev/nvme1n1
mkfs -t xfs /dev/nvme1n1

mkdir /data
mount /dev/nvme1n1 /data

但是,这些步骤中的大多数都会出错。 如“/dev/nvme1n1: cannot open `/dev/nvme1n1' (No such file or directory)”; “mkfs.xfs:没有那个文件或目录”; “挂载:/数据:权限被拒绝”我也尝试过不同的驱动器名称 - 例如。 /dev/nvme1n1p1、nvme1n1 或 /nvme1n1/nvme1n1p1

那么我如何将这个磁盘安装在我的容器中呢? Docker 是问题的一部分吗?

以下是您应该采取的步骤:

  1. 将卷附加到 EC2 实例。 现在lsblk应该显示设备。
  2. 将设备挂载(并格式化)到/data类的位置。 设置权限等。
  3. 在任务定义中,声明一个指向/data
  4. 在您的容器定义中,声明一个挂载点。

您不能/不应将设备直接安装到容器。


编辑:第 2 步的详细信息

可以将用户数据脚本添加到您的启动配置中。 这样您就可以挂载(和格式化)设备。 以这个脚本为例:

#!/bin/bash

# Device name. NOT block name like 'nvme0n1p1'.
device="/dev/sdp"

# Where to mount the device.
mountpoint="/data"

# Wait for device.
while [[ ! -b $(readlink -f ${device}) ]]; do
    echo "waiting for ${device}">&2; sleep 2;
done

# Format if not already formatted.
blkid $(readlink -f ${device}) || mkfs -t ext4 $(readlink -f ${device})

# Mount.
mkdir -p ${mountpoint}
mount $(readlink -f ${device}) ${mountpoint}
chmod 666 ${mountpoint}

# Persist the volume in /etc/fstab so it gets mounted again.
echo "$(readlink -f ${device}) ${mountpoint} ext4 defaults,nofail 0 2" >> /etc/fstab

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM