Terraform:在 EKS/ECS 上部署 Docker Compose 应用程序

Joh*_*nn8 9 docker-compose kubernetes-helm apache-superset terraform-provider-aws amazon-eks

TL; 博士

我使用在 Docker Compose 上运行的开源服务器应用程序。它有一些服务,包括 PostgreSQL DB 和 Redis。

如何使用 Terraform 在完整的 IaC 中最好地将此应用程序部署到 AWS?


迄今为止的解决方案

1.AWS ecs-cli

ecs-cli现在支持docker compose在 Amazon ECS 中发送配置。

但是,我不认为它可以与 Terraform 工作流程集成(这可能不是什么大惊小怪)。我知道肯定是,ecs-cli不是在CloudFormation支持,按照这一问题在这个时候,仍然打开。所以我认为它也不能轻易添加到 Terraform。

2. 硬 EKS 方式

  • 获取您的docker-compose.yml文件,将其转换为kubectlYAML。
  • (准备在每次包升级时这样做)。
  • 使用 Terraform 的 + EKS API 进行部署(最小示例)。

但这还不是完全的 IaC。每次 docker-compose 在源存储库中更改时,您都必须重新翻译您的配置。这听起来像很多工作。

3. 使用 Helm 图表

  • 为应用程序编写 Helm 图表。
  • 运行 Terraform 以启动集群。
  • 仍然使用helm 提供程序运行 Terraform 以在集群上安装带有 Helm 的应用程序。

4.【不行】k8s Kompose

我读过Kompose可以自动将 Docker Compose 配置转换为 k8s 配置,但它们似乎没有移植到 AWS 上,更不用说 Terraform。

5. [Not OK] 肮脏的 AMI 解决方案

  • 使用 Packer 构建自定义 EC2 AMI。
  • 使用 Terraform,设置 DB、Redis 和所有权限/网络/等。
  • 使用自定义 AMI 启动 EC2 实例。
  • AMI 包含(定制的)应用程序代码,尤其是docker-compose.yml. 还有 Docker 镜像。
  • AMI 启动 Docker Composesystemctl服务。

这会造成一些伤害:构建时间长、监控困难、无法扩展。

旁注

  • 我提到我需要完整的 IaC。我的意思是:
    1. 书面配置(并且仅)master告诉您部署了什么。
    2. 部署将完成,我的团队无需运行任何其他命令。它基本上适用于 CI/CD 或单次推送。
    3. 在 IaC 中可以轻松配置监控和警报。
  • 我想用 AWS 组件替换一些服务(即 RDS 的 PostgreSQL 服务和 ElastiCache 的 Redis 服务)。
  • 该应用程序恰好Apache Superset。但是我也想知道什么被认为是解决这个 Docker Compose 问题的最佳通用方法。

Joh*_*nn8 6

1. 观望

谁知道,ecs-cli-v2可能会更好地与 CloudFormation 和/或 Terraform 集成。

2. 使用 Helm 图表

正如问题中提到的。可能是最好的解决方案,尽管需要(一点)努力来参数化 Helm。

另请参阅:Helm 入门

3.Docker Swarm + CloudFormation + Terraform

Docker Swarm 现在接受来自文件的输入docker-compose.yml可以在此处找到并配置该模板。配置完成后,它可以集成到 Terraform 基础设施中。

本教程(已有 3 年历史)介绍了如何在 AWS 上使用 Docker Swarm 模式。

要启动容器,如有必要(未充分调查,欢迎反馈),您可以使用 Terraform 的local-exec. 通过这种方式,您可以通过 SSH 连接到主节点并运行docker stack deploy其他类似命令,同时仍然以 IaC 风格编写所有命令。