

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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*

## 總結
<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 服務帳戶 (IRSA) 的 (IAM) 角色

此外，在您部署應用程式時，此解決方案會使用 Flux 來保持租戶組態不變。您可以在組態中指定包含 Flux `kustomization.yaml` 檔案的租用戶儲存庫，以部署租用戶應用程式。

此模式實作下列項目：
+ 透過手動部署 Terraform 指令碼建立的 AWS CodeCommit 儲存庫、 AWS CodeBuild 專案和 AWS CodePipeline 管道。
+ 託管租用戶所需的網路和運算元件。這些是使用 Terraform 透過 CodePipeline 和 CodeBuild 建立。
+ 透過 Helm Chart 設定的租戶命名空間、網路政策和資源配額。
+ 屬於不同租用戶的應用程式，使用 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 提供者](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 提供者](https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs) 1.14 版或更新版本

**限制**
+ **相依於 Terraform 手動部署：**工作流程的初始設定，包括建立 CodeCommit 儲存庫、CodeBuild 專案和 CodePipeline 管道，依賴手動 Terraform 部署。這在自動化和可擴展性方面引入了潛在的限制，因為它需要手動介入基礎設施變更。
+ **CodeCommit 儲存庫相依性：**工作流程依賴 CodeCommit 儲存庫做為原始碼管理解決方案，並與 緊密結合 AWS 服務。

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

**目標架構 **

此模式部署三個模組來建置資料平台的管道、網路和運算基礎設施，如下圖所示。

*管道架構：*

![\[Amazon EKS 多租戶架構的管道基礎設施\]](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/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) 可協助您快速建模和設定軟體版本的不同階段，並自動化持續發行軟體變更所需的步驟。
+ [Amazon Elastic Kubernetes Service (Amazon EKS) ](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/what-is-transit-gateway.html) 是連接虛擬私有雲端 (VPC) 和內部部署網路的中央中樞。
+ [Amazon Virtual Private Cloud (Amazon 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/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

此模式的程式碼可在 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製專案儲存庫。 | 在終端機視窗中執行下列命令，複製 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_tw/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_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟動管道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/prescriptive-guidance/latest/patterns/simplify-amazon-eks-multi-tenant-application-deployment-by-using-flux.html) | AWS DevOps | 

### 建立運算基礎設施
<a name="create-the-compute-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 更新`locals.tf`以啟用 CodeBuild 專案對 VPC 的存取。 | 若要部署 Amazon EKS 私有叢集的附加元件，CodeBuild 專案必須連接至 Amazon EKS VPC。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 Chart `values`的檔案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證 Kubernetes 中的租戶管理資源。 | 執行下列命令，以檢查在 Helm 的協助下已成功建立租用戶管理資源。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/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
```