使用 Flux 简化 Amazon EKS 多租户应用程序部署
Nadeem Rahaman、Aditya Ambati、Aniket Dekate 和 Shrikant Patil,Amazon Web Services
摘要
注意:AWS CodeCommit 现已不再向新客户提供。AWS CodeCommit 的现有客户可以继续正常使用该服务。了解更多
许多提供产品和服务的公司隶属于受数据监管的行业,这类行业要求在其内部业务职能之间建立数据壁垒。此模式描述了如何使用 Amazon Elastic Kubernetes Service(Amazon EKS)中的多租户功能来构建数据平台,在共享单个 Amazon EKS 集群的租户或用户之间实现逻辑隔离与物理隔离。此模式通过以下方法实现隔离:
Kubernetes 命名空间隔离
基于角色的访问控制 (RBAC)
网络策略
资源配额
服务账户的 AWS Identity and Access Management(IAM)角色(IRSA)
此外,此解决方案使用 Flux,确保在部署应用程序时保持租户配置不可变。您可通过在配置中指定包含 Flux kustomization.yaml 文件的租户存储库来部署租户应用程序。
此模式实现以下内容:
通过手动部署 Terraform 脚本创建的 AWS CodeCommit 存储库、AWS CodeBuild 项目和 AWS CodePipeline 管道。
托管租户所需的网络和计算组件。这些组件是使用 Terraform 通过 CodePipeline 和 CodeBuild 创建的。
通过 Helm 图表配置的租户命名空间、网络策略和资源配额。
使用 Flux 部署的、分属不同租户的应用程序。
建议您根据自身的独特需求和安全考量,仔细规划并构建适合自己的多租户架构。此模式为您的实现提供了起点。
先决条件和限制
先决条件
一个活跃的 AWS 账户
在本地计算机上安装了 Terraform
版本 0.12 或更高版本 Terraform AWS Provider
版本 3.0.0 或更高版本 Kubernetes Provider
版本 2.10 或更高版本 Helm Provider
版本 2.8.0 或更高版本 Kubectl Provider
版本 1.14 或更高版本
限制
对 Terraform 手动部署的依赖:该工作流的初始设置,包括创建 CodeCommit 存储库、CodeBuild 项目和 CodePipeline 管道,依赖于手动 Terraform 部署。这在自动化和可扩展性方面存在潜在的限制,因为需要手动干预才能进行基础设施更改。
对 CodeCommit 存储库的依赖:该工作流依赖 CodeCommit 存储库作为源代码管理解决方案,并且与 AWS 服务紧密耦合。
架构
目标架构
此模式通过部署三个模块来为数据平台构建管道、网络和计算基础设施,如下图所示。
管道架构:

网络架构:

计算架构:

工具
AWS 服务
AWS CodeBuild 是一项完全托管式构建服务,可编译源代码、运行单元测试和生成部署就绪的构件。
AWS CodeCommit 是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。
AWS CodePipeline 可帮助您快速对软件发布过程的不同阶段进行建模和配置,并自动执行持续发布软件变更所需步骤。
Amazon Elastic Kubernetes Service(Amazon EKS)可帮助您在 AWS 上运行 Kubernetes,而无需安装或维护您自己的 Kubernetes 控制面板或节点。
AWS Transit Gateway 是连接虚拟私有云(VPC)和本地网络的中央枢纽。
Amazon Virtual Private Cloud(Amazon VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS 的可扩展基础设施的优势。
其他工具
Cilium 网络策略
支持 Kubernetes L3 和 L4 网络策略。它们可通过 L7 策略进行扩展,为 HTTP、Kafka 和 gRPC 以及其他类似协议提供 API 级安全防护。 Flux
是一款基于 Git 的持续交付(CD)工具,可自动完成 Kubernetes 上的应用程序部署。 Helm
是 Kubernetes 的开源软件包管理器,可帮助您在 Kubernetes 集群上安装和管理应用程序。 Terraform
是 HashiCorp 推出的基础设施即代码(IaC)工具,可帮助您创建和管理云和本地资源。
代码存储库
此模式的代码可在 GitHub EKS 多租户 Terraform 解决方案
最佳实践
有关此实施方案的使用指南和最佳实践,请参阅以下内容:
操作说明
| 任务 | 描述 | 所需技能 |
|---|---|---|
克隆项目存储库。 | 在终端窗口中运行以下命令,克隆 GitHub EKS 多租户 Terraform 解决方案
| AWS DevOps |
引导 Terraform S3 存储桶和 Amazon DynamoDB。 |
| AWS DevOps |
更新 |
| AWS DevOps |
部署管道模块。 | 要创建管道资源,请手动运行以下 Terraform 命令。目前尚无自动运行这些命令的编排。
| AWS DevOps |
| 任务 | 描述 | 所需技能 |
|---|---|---|
启动管道。 |
首次运行后,每当您向 CodeCommit 存储库主分支提交更改时,管道就会自动启动。 该管道包括以下阶段: | AWS DevOps |
验证通过网络模块创建的资源。 | 确认在管道部署成功后创建了以下 AWS 资源:
| AWS DevOps |
| 任务 | 描述 | 所需技能 |
|---|---|---|
更新 | 要为 Amazon EKS 私有集群部署附加组件,必须将 CodeBuild 项目附加到 Amazon EKS VPC。
| AWS DevOps |
更新 | 在
| AWS DevOps |
更新租户管理 Helm 图表的 |
| AWS DevOps |
验证计算资源。 | 在前面的步骤中更新文件后,CodePipeline 会自动启动。确认它已为计算基础设施创建了以下 AWS 资源:
| AWS DevOps |
| 任务 | 描述 | 所需技能 |
|---|---|---|
验证 Kubernetes 中的租户管理资源。 | 运行以下命令,检查借助 Helm 是否成功创建了租户管理资源。
| AWS DevOps |
验证租户应用程序部署。 | 运行以下命令,验证租户应用程序是否已部署。
|
故障排除
| 问题 | 解决方案 |
|---|---|
您会遇到类似于以下内容的错误消息:
| 请按照以下步骤解决问题:
|
相关资源
其他信息
以下是部署租户应用程序的存储库结构示例:
applications sample_tenant_app ├── README.md ├── base │ ├── configmap.yaml │ ├── deployment.yaml │ ├── ingress.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── tenant-1 │ ├── configmap.yaml │ ├── deployment.yaml │ └── kustomization.yaml └── tenant-2 ├── configmap.yaml └── kustomization.yaml