本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Flux 简化 Amazon EKS 多租户应用程序部署
Nadeem Rahaman、Aditya Ambati、Aniket Dekate 和 Shrikant Patil,Amazon Web Services
Summary
许多提供产品和服务的公司隶属于受数据监管的行业,这类行业要求在其内部业务职能之间建立数据壁垒。此模式描述了如何使用 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 管道。
托管租户所需的网络和计算组件。它们是 CodeBuild 通过 CodePipeline 和使用 Terraform 创建的。
通过 Helm 图表配置的租户命名空间、网络策略和资源配额。
使用 Flux 部署的、分属不同租户的应用程序。
建议您根据自身的独特需求和安全考量,仔细规划并构建适合自己的多租户架构。此模式为您的实现提供了起点。
先决条件和限制
先决条件
活跃的 AWS 账户
AWS Command Line Interface (AWS CLI) 版本 2.11.4 或更高版本,已安装并配置
在本地计算机上安装了 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 可帮助您快速对软件发布过程的不同阶段进行建模和配置,并自动执行持续发布软件变更所需步骤。
亚马逊 Elastic Kubernetes Service(亚马逊 EKS)可帮助你在上面运行 AWS Kubernetes,而无需安装或维护自己的 Kubernetes 控制平面或节点。
AWS Transit Gateway是连接虚拟私有云 (VPCs) 和本地网络的中央集线器。
Amazon Virtual Private Cloud(亚马逊 VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS的可扩展基础设施的优势。
其他工具
Cilium 网络策略
支持 Kubernetes L3 和 L4 网络策略。它们可通过 L7 策略进行扩展,为 HTTP、Kafka 和 gRPC 以及其他类似协议提供 API 级安全防护。 Flux
是一款基于 Git 的持续交付(CD)工具,可自动完成 Kubernetes 上的应用程序部署。 Helm
是 Kubernetes 的开源软件包管理器,可帮助您在 Kubernetes 集群上安装和管理应用程序。 Terraform
是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。
代码存储库
此模式的代码可在 GitHub EKS 多租户 Terraform
最佳实践
有关此实施方案的使用指南和最佳实践,请参阅以下内容:
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
克隆项目存储库。 | 在终端 GitHub 窗口中运行以下命令,克隆 EKS 多租户 Terraform 解决方案
| AWS DevOps |
引导 Terraform S3 存储桶和 Amazon DynamoDB。 |
| AWS DevOps |
更新 |
| AWS DevOps |
部署管道模块。 | 要创建管道资源,请手动运行以下 Terraform 命令。目前尚无自动运行这些命令的编排。
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
启动管道。 |
第一次运行后,每当你向 CodeCommit 存储库主分支提交更改时,管道就会自动启动。 该管道包括以下阶段: | AWS DevOps |
验证通过网络模块创建的资源。 | 确认以下 AWS 资源是在成功部署管道后创建的:
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
更新 | 要为 Amazon EKS 私有集群部署插件,必须将该 CodeBuild 项目连接到 Amazon EKS VPC。
| AWS DevOps |
更新 | 在
| AWS DevOps |
更新租户管理 Helm 图表的 |
| AWS DevOps |
验证计算资源。 | 在前面的步骤中更新文件后,将自动 CodePipeline 启动。确认它已为计算基础设施创建了以下 AWS 资源:
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
验证 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