

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Flux 简化 Amazon EKS 多租户应用程序部署
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux"></a>

*Nadeem Rahaman、Aditya Ambati、Aniket Dekate 和 Shrikant Patil，Amazon Web Services*

## Summary
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-summary"></a>

许多提供产品和服务的公司隶属于受数据监管的行业，这类行业要求在其内部业务职能之间建立数据壁垒。此模式描述了如何使用 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 部署的、分属不同租户的应用程序。

建议您根据自身的独特需求和安全考量，仔细规划并构建适合自己的多租户架构。此模式为您的实现提供了起点。

## 先决条件和限制
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ AWS Command Line Interface [(AWS CLI) 版本 2.11.4 或更高版本，[已安装并配置](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ 在本地计算机上安装了 [Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) 版本 0.12 或更高版本
+ [Terraform AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest) 版本 3.0.0 或更高版本
+ [Kubernetes Provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) 版本 2.10 或更高版本
+ [Helm Provider](https://registry.terraform.io/providers/hashicorp/helm/latest/docs) 版本 2.8.0 或更高版本
+ [Kubectl Provider](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs) 版本 1.14 或更高版本

**限制**
+ 对 **Terraform 手动部署的依赖：**工作流程的初始设置（包括创建 CodeCommit 存储库、 CodeBuild 项目和 CodePipeline 管道）依赖于手动 Terraform 部署。这在自动化和可扩展性方面存在潜在的限制，因为需要手动干预才能进行基础设施更改。
+ **CodeCommit 存储库依赖关系：**工作流程依赖于 CodeCommit 存储库作为源代码管理解决方案，并与之紧密结合 AWS 服务。

## 架构
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-architecture"></a>

**目标架构**

此模式通过部署三个模块来为数据平台构建管道、网络和计算基础设施，如下图所示。

*管道架构：*

![\[适用于 Amazon EKS 多租户架构的管道基础设施\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/76a4a23d-4275-427a-ae36-51c9a3803128.png)


*网络架构：*

![\[适用于 Amazon EKS 多租户架构的网络基础设施\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/e542249a-19a3-4c99-b6f5-fdf80fee4edf.png)


*计算架构：*

![\[适用于 Amazon EKS 多租户架构的计算基础设施\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/97b700a7-74b6-4f9d-b53a-76de42409a8e/images/91bd1ca8-17f0-433c-8600-4c8e6c474e31.png)


## 工具
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-tools"></a>

**AWS 服务**
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速对软件发布过程的不同阶段进行建模和配置，并自动执行持续发布软件变更所需步骤。
+ [亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 Kubernetes 控制平面或节点。
+ [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html)是连接虚拟私有云 (VPCs) 和本地网络的中央集线器。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。

**其他工具**
+ [Cilium 网络策略](https://cilium.io/use-cases/network-policy/#:~:text=Cilium%20implements%20Kubernetes%20Network%20Policies,%2C%20Kafka%2C%20gRPC%2C%20etc.)支持 Kubernetes L3 和 L4 网络策略。它们可通过 L7 策略进行扩展，为 HTTP、Kafka 和 gRPC 以及其他类似协议提供 API 级安全防护。
+ [Flux](https://fluxcd.io/) 是一款基于 Git 的持续交付（CD）工具，可自动完成 Kubernetes 上的应用程序部署。
+ [Helm](https://helm.sh/docs/) 是 Kubernetes 的开源软件包管理器，可帮助您在 Kubernetes 集群上安装和管理应用程序。
+ [Terraform](https://www.terraform.io/) 是一款基础设施即代码 (IaC) 工具 HashiCorp ，可帮助您创建和管理云和本地资源。

**代码存储库**

此模式的代码可在 GitHub [EKS 多租户 Terraform](https://github.com/aws-samples/aws-eks-multitenancy-deployment) 解决方案存储库中找到。

## 最佳实践
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-best-practices"></a>

有关此实施方案的使用指南和最佳实践，请参阅以下内容：
+ [Amazon EKS 多租户最佳实践](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Flux 文档](https://fluxcd.io/flux/get-started/)

## 操作说明
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-epics"></a>

### 为 Terraform 构建、测试和部署阶段创建管道
<a name="create-pipelines-for-terraform-build-test-and-deploy-stages"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆项目存储库。 | 在终端 GitHub [窗口中运行以下命令，克隆 EKS 多租户 Terraform 解决方案](https://github.com/aws-samples/aws-eks-multitenancy-deployment)存储库：<pre>git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git</pre> | AWS DevOps | 
| 引导 Terraform S3 存储桶和 Amazon DynamoDB。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 更新 `run.sh` 和 `locals.tf` 文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 部署管道模块。 | 要创建管道资源，请手动运行以下 Terraform 命令。目前尚无自动运行这些命令的编排。<pre>./run.sh -m pipeline -e demo -r <AWS_REGION> -t init<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan<br />./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply</pre> | AWS DevOps | 

### 创建网络基础设施
<a name="create-the-network-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启动管道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html)第一次运行后，每当你向 CodeCommit 存储库主分支提交更改时，管道就会自动启动。该管道包括以下[阶段](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 验证通过网络模块创建的资源。 | 确认以下 AWS 资源是在成功部署管道后创建的：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 

### 创建计算基础设施
<a name="create-the-compute-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新`locals.tf`以启用 CodeBuild 项目对 VPC 的访问权限。 | 要为 Amazon EKS 私有集群部署插件，必须将该 CodeBuild 项目连接到 Amazon EKS VPC。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 更新 `buildspec` 文件以构建计算模块。 | 在 `templates` 文件夹中，在所有 `buildspec` YAML 文件中，将 `TF_MODULE_TO_BUILD` 变量的值从 `network` 设置为 `compute`：<pre>TF_MODULE_TO_BUILD: "compute"</pre> | AWS DevOps | 
| 更新租户管理 Helm 图表的 `values` 文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 验证计算资源。 | 在前面的步骤中更新文件后，将自动 CodePipeline 启动。确认它已为计算基础设施创建了以下 AWS 资源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 

### 检查租户管理及其他资源
<a name="check-tenant-management-and-other-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证 Kubernetes 中的租户管理资源。 | 运行以下命令，检查借助 Helm 是否成功创建了租户管理资源。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 
| 验证租户应用程序部署。 | 运行以下命令，验证租户应用程序是否已部署。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) |  | 

## 问题排查
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 您会遇到类似于以下内容的错误消息：`Failed to checkout and determine revision: unable to clone unknown error: You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit.` | 请按照以下步骤解决问题：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | 

## 相关资源
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-resources"></a>
+ [适用于 Terraform 的 Amazon EKS 蓝图](https://github.com/aws-ia/terraform-aws-eks-blueprints)
+ [Amazon EKS 最佳实践指南，多租户部分](https://aws.github.io/aws-eks-best-practices/security/docs/multitenancy/)
+ [Flux 网站](https://fluxcd.io/)
+ [Helm 网站](https://helm.sh/)

## 附加信息
<a name="simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux-additional"></a>

以下是部署租户应用程序的存储库结构示例：

```
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
```