docker-compose - Terraform:在 EKS/ECS 上部署 Docker Compose 应用程序
问题描述
TL;博士
我使用在 Docker Compose 上运行的开源服务器应用程序。它有一些服务,包括 PostgreSQL DB 和 Redis。
如何使用 Terraform 在完整的 IaC 中将此应用程序最好地部署到 AWS?
到目前为止的解决方案
1.AWSecs-cli
ecs-cli
现在支持docker compose
在 Amazon ECS 中发送配置。
但是,我不认为它可以与 Terraform 工作流程集成(这可能不是大惊小怪)。我确定的是ecs-cli
CloudFormation不支持,根据这个问题,此时仍然打开。所以我认为它也不能轻易添加到 Terraform 中。
2.硬EKS方式
- 获取您的
docker-compose.yml
文件,将其翻译为kubectl
YAML。 - (准备每次升级包时都这样做)。
- 使用 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 Compose
systemctl
服务。
那会有点伤害:构建时间长、监控困难、无法扩展。
旁注
- 我提到我需要完整的 IaC。我的意思是:
- 书面配置(仅它)
master
告诉您部署了什么。 - 部署将完成,我的团队无需运行任何其他命令。它基本上适用于 CI/CD 或单推。
- 在 IaC 中轻松配置监控和警报。
- 书面配置(仅它)
- 我希望将一些服务替换为 AWS 组件(即 RDS 的 PostgreSQL 服务和 ElastiCache 的 Redis 服务)。
- 该应用程序恰好是Apache Superset。但是我也想知道什么被认为是解决这个 Docker Compose 问题的最佳通用方法。
解决方案
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 样式记录所有内容。
推荐阅读
- python - 图像在 skimage 中包含除 0 或 1 错误以外的值
- python - 基于聚合数据框填充数据框
- json - 在带有 Microsoft Graph API 的 Microsoft Teams 中@提及用户不会标记用户。我错过了什么?
- sql-server - .Net 应用程序在升级到 SQL Server 2014 SP3 后未连接到 SQL Server
- javascript - 选择选项出现移位
- iframe - 在 iframe 中将其他网站集成到我的网站中
- java - Spring引导迁移后总是未经授权
- python - TypeError:'builtin_function_or_method'和'dict'的实例之间不支持'>'
- jquery - 如何在完整日历中将 +5 更多文本更改为自定义文本
- android - 从其他访问android模拟器IP地址