扩展 EC2HardwareBuilder class 以将引导卷的其他大小设置为 10GB

extend EC2HardwareBuilder class to set an other size for the boot volume as 10GB

我结合使用 Apache Brooklyn 和 jCloud EC2 在 AWS 上创建 ec2 实例。

ec2 实例设置:

每次创建 ec2 实例时,根分区只有 10GB 磁盘 space。我在jCloud [ECHardwareBuilder]:(https://github.com/jclouds/jclouds/blob/master/apis/ec2/src/main/java/org/jclouds/ec2/compute/domain/EC2HardwareBuilder.java#L731)

中发现了问题
/**
 * @see InstanceType#D2_XLARGE
 */
public static EC2HardwareBuilder d2_xlarge() {
  return new EC2HardwareBuilder(InstanceType.D2_XLARGE).d2()
    .ram(31232)`enter code here`
    .processors(ImmutableList.of(new Processor(4.0, 3.5)))
    .volumes(ImmutableList.<Volume>of(
      new VolumeBuilder().type(LOCAL).size(10.0f).device("/dev/sda1").bootDevice(true).durable(false).build(),
      new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdb").bootDevice(false).durable(false).build(),
      new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdc").bootDevice(false).durable(false).build(),
      new VolumeBuilder().type(LOCAL).size(2000.0f).device("/dev/sdd").bootDevice(false).durable(false).build()))
    .is64Bit(true);
}

我的问题是:

  1. 是否可以创建我自己的 class 来扩展 EC2HardwareBuilder,以便我可以将根卷大小更改为 2000?
  2. 如何将此 class 注入 brooklyn,以便使用它代替旧的 EC2HardwareBuilder class?

EC2HardwareBuilder.d2_xlarge 方法仅表示该实例类型的默认值。它不控制实际配置的内容。

如果您手动配置,您可以看到这一点 - 在存储下,它提供 /dev/sdb、/dev/sdc 和 /dev/sdd。如果您尝试编辑此 "storage" 部分,它只会让您选择 /dev/sd{b-m} 的设备。它不会让您选择 /dev/sda1。当我使用默认设置部署时,它实际上为 /dev/xvda1:

提供了一个 2G 分区

[ec2-user@ip-172-31-5-36 ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 2.0G 686M 1.3G 36% / devtmpfs 15G 72K 15G 1% /dev tmpfs 15G 0 15G 0% /dev/shm

当我使用下面的蓝图(使用 brooklyn master)与 Brooklyn 一起部署时,它还为 /dev/xvda1:

提供了一个 2G 分区

location: jclouds:aws-ec2:eu-central-1: hardwareId: d2.xlarge imageId: eu-central-1/ami-10d1367f services: - type: org.apache.brooklyn.entity.machine.MachineEntity

你能确认你得到的肯定是 10G 而不是 2G 吗?我怀疑大小取决于 AMI。

从 jclouds 的角度来看,问题在于无法通过 EC2 api 发现此信息,因此在 jclouds 中进行了硬编码!

我们可以添加 jclouds 功能增强以更改使用 /dev/sd{b-m} 中的哪一个(可以在 AWS 网络控制台中完成),但这不能解决您的问题。


http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device 中所述,Amazon Instance Store-Backed AMI "root device volume" 的大小限制为 10 GiB。

要拥有更大的根分区,您可以:

  • 使用 EBS 支持的 AMI
  • 尝试即时调整它的大小(但这实际上是 移动 到不同的分区,而不是仅仅向右调整大小;关于这个的讨论, 参见 https://askubuntu.com/a/728141, which links to https://unix.stackexchange.com/a/227318)
  • 解决它:/ 中的什么需要全部 space?你能把 /dev/sdb 挂载到合适的目录吗?

我个人更喜欢 "work around it" 方法(假设 EBS-Backed 不适合您)。


为了将来参考,如果您确实想覆盖 EC2HardwareBuilder.d2_xlarge 等方法的行为,那么很遗憾,您不能!这些是静态方法。你必须用你自己的 class 版本构建一个 jar(当然是针对正确版本的 jclouds 编译的),并将其放入 $BROOKLYN_HOME./lib/patch/.

通常,jclouds 非常适合通过在 guice 中配置事物(以更改注入的依赖项)来覆盖和自定义事物,但不幸的是这里没有。

如果您确实想使用 guice,您可以绑定整个 EC2HardwareSupplier 的不同实现(从而避免静态调用),但我们需要非常小心else 也在调用这些静态方法。