Dockerrun AWS硬编码内存

use*_*640 5 amazon-web-services docker amazon-elastic-beanstalk dockerrun.aws.json

在一个多容器泊坞环境Elasticbeanstalk,定义存储在强制性Dockerrun.aws.json,我想知道有什么办法来处理内存的硬编码值的最佳实践。

特别是当我们需要调整实例类型时,我们也需要调整内存值。

有没有一种方法可以指定百分比而不是确切数字?也许对@aws的建议

这是一个Dockerrun.aws模板示例:

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "container-1",
      "image": "image-1.com/image-xxxxxx",
      "memory": 512
    },
    {
      "name": "container-2",
      "image": "image-2.com/image-xxxxxx",
      "memory": 256
    },
    {
      "name": "container-3",
      "image": "image-3.com/image-xxxxxx",
      "memory": 256
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*per 5

我不是 AWS 内部人员,但我们为我们的应用程序使用了 AWS Elastic Beanstalk 以及更高级的部署策略(例如自定义 CloudFormation 模板)。以下是我作为 DevOps 工程师使用这些服务的个人经验的一些笔记:

  • 最佳实践是在文件Dockerrun.aws.json 中定义 MiB 中的内存,如文档所述。[1]
  • 您不需要定义内存硬限制。正如文档所述,内存软限制就足够了:“为容器定义中的内存或 memoryReservation 参数之一或两者指定一个非零整数。” [1]
  • memory 或 memoryReservation 预留必须提供给 AWS Elastic Beanstalk,因为它使用 AWS ECS 作为需要这些值之一的基础服务。它使用 ECS 代理将容器放置在 EC2 实例上,并且必须知道为每个容器预留多少空间。
  • 除非您的应用程序受内存限制,否则上述升级/缩减问题(即“调整实例类型”)不应该成为问题,因为您始终可以为 CPU 绑定应用程序设置一个非常低的memoryReservation值。有关软和硬内存限制之间差异的详细解释,请参见 [2]。还要记住:“Docker 守护程序为容器保留至少 4 MiB 的内存,因此您不应为容器指定少于 4 MiB 的内存。” [3]
  • 如果您想要更多的灵活性/控制,您始终可以通过 AWS CloudFormation 使用基础设施即代码从 AWS Elastic Beanstalk 转移到 ECS 部署。
  • 如果您对 AWS ECS 中的工作原理感兴趣,请访问以下 AWS 的精彩博文:Amazon ECS 如何管理 CPU 和内存资源。[4]

参考

[1] https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html
[2] /sf/answers/3133533931/
[3] https://docs.aws .amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
[4] https://aws.amazon.com/de/blogs/containers/how-amazon-ecs-manages-cpu-and-memory-resources/