0

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

ec2 实例设置:

  • 地区:eu-central-1(法兰克福)
  • imageId:ami-10d1367f
    • 名称:amzn-ami-minimal-hvm-2016.03.0.x86_64-s3
    • RootDeviceType:实例存储
    • 虚拟化类型:hvm
  • 硬件 ID:d2x_large
    • vCPU:4
    • 内存:30,5 GB
    • 存储:3x2000 GB

每次创建 ec2 实例时,根分区只有 10GB 磁盘空间。我在 jCloud [ECHardwareBuilder] 中发现了问题:( https://github.com/jclouds/jclouds/blob/master/apis/ec2/src/main/java/org/jclouds/ec2/compute/domain/EC2HardwareBuilder.爪哇#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. 是否可以创建我自己的扩展 EC2HardwareBuilder 的类,以便我可以将根卷大小更改为 2000?
  2. 如何将此类注入 brooklyn,以便使用它来代替旧的 EC2HardwareBuilder 类?
4

1 回答 1

3

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

如果您手动配置,您可以看到这一点 - 在存储下,它提供 /dev/sdb、/dev/sdc 和 /dev/sdd。如果您尝试编辑此“存储”部分,它只会让您选择 /dev/sd{bm} 的设备。它不允许您选择 /dev/sda1。当我使用默认值部署时,它实际上给了我一个 2G 的 /dev/xvda1 分区:

[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{bm} (可以在 AWS Web 控制台中完成),但这不会解决您的问题。


http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device中所述,Amazon Instance Store 的“根设备卷”的大小限制- 支持的 AMI 为 10 GiB。

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

  • 使用 EBS 支持的 AMI
  • 尝试即时调整它的大小(但这实际上是移动到不同的分区,而不仅仅是向右调整大小;有关此问题的讨论,请参阅https://askubuntu.com/a/728141,其中链接到https://unix.stackexchange.com/a/227318
  • 解决它:什么/需要所有空间?您可以将 /dev/sdb 挂载到适当的目录吗?

我个人赞成“解决它”的方法(假设 EBS 支持不适合您)。


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

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

如果您确实想使用 guice,您可能能够绑定整个的不同实现EC2HardwareSupplier(从而避免静态调用),但我们需要非常小心,没有其他东西也调用这些静态方法.

于 2016-06-09T13:09:54.523 回答