使用 Flux 简化亚马逊EKS多租户应用程序部署 - AWS Prescriptive Guidance

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

使用 Flux 简化亚马逊EKS多租户应用程序部署

由 Nadeem Rahaman (AWS)、Aditya Ambati ()、Aniket Dekate (AWS) 和 Shrikant Patil () 创作 AWS AWS

摘要

注意: AWS CodeCommit 不再向新客户开放。的现有客户 AWS CodeCommit 可以继续照常使用该服务。了解更多

许多提供产品和服务的公司都是受数据监管的行业,需要在内部业务职能之间保持数据屏障。此模式描述了如何使用 Amazon Elastic Kubernetes Service EKS (Amazon) 中的多租户功能来构建一个数据平台,在共享单个 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 进行部署。

我们建议您根据自己的独特要求和安全考虑,仔细规划和构建自己的多租户架构。这种模式为您的实施提供了一个起点。

先决条件和限制

先决条件

限制

  • Terraform 手动部署的依赖:工作流程的初始设置(包括创建 CodeCommit 存储库、 CodeBuild 项目和 CodePipeline 管道)依赖于手动 Terraform 部署。这在自动化和可扩展性方面带来了潜在的限制,因为它需要手动干预才能进行基础架构的更改。

  • CodeCommit 存储库依赖关系:工作流程依赖于 CodeCommit 存储库作为源代码管理解决方案,并与之紧密结合 AWS 服务。

架构

目标架构

这种模式部署了三个模块来为数据平台构建管道、网络和计算基础架构,如下图所示。

管道架构:

适用于 Amazon EKS 多租户架构的管道基础设施

网络架构:

适用于 Amazon EKS 多租户架构的网络基础设施

计算架构:

适用于 Amazon EKS 多租户架构的计算基础设施

工具

AWS 服务

  • AWS CodeBuild是一项完全托管的生成服务,可帮助您编译源代码、运行单元测试和生成可随时部署的工件。

  • AWS CodeCommit是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。

  • AWS CodePipeline帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。

  • 亚马逊 Elastic Kubernetes Servic EKS e(亚马逊)可帮助你在上面运行 AWS Kubernetes,而无需安装或维护自己的 Kubernetes 控制平面或节点。

  • AWS Transit Gateway是连接虚拟私有云 (VPCs) 和本地网络的中央集线器。

  • Amazon Virtual Private Cloud(亚马逊VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS的可扩展基础设施的优势。

其他工具

  • Cilium 网络策略支持 Kubernetes L3 和 L4 网络策略。它们可以通过 L7 策略进行扩展,为 HTTP Kafka 和 g RPC 以及其他类似协议提供API级别的安全性。

  • Flux 是一款基于 Git 的持续交付 (CD) 工具,可自动在 Kubernetes 上部署应用程序。

  • Helm 是一款适用于 Kubernetes 的开源软件包管理器,可帮助你在 Kubernetes 集群上安装和管理应用程序。

  • Terraform 是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。

代码存储库

此模式的代码可在 GitHub EKS多租户 Terraform 解决方案存储库中找到。

最佳实践

有关使用此实现的指南和最佳实践,请参阅以下内容:

操作说明

任务描述所需技能

克隆项目存储库。

在终端窗口中运行以下命令,克隆 GitHub EKS多租户 Terraform 解决方案存储库:

git clone https://github.com/aws-samples/aws-eks-multitenancy-deployment.git
AWS DevOps

引导 Terraform S3 存储桶和亚马逊 DynamoDB。

  1. 在该bootstrap文件夹中,打开bootstrap.sh文件并更新 S3 存储桶名称、DynamoDB 表名称的变量值以及: AWS 区域

    S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME>" REGION="<AWS_REGION>"
  2. 运行 bootstrap.sh 脚本。该脚本需要 AWS CLI,您已将其作为先决条件的一部分进行安装。

    cd bootstrap ./bootstrap.sh
AWS DevOps

更新run.shlocals.tf文件。

  1. 成功完成引导过程后,从variables脚本部分复制 S3 存储桶和 DynamoDB 表名称:bootstrap.sh

    # Variables S3_BUCKET_NAME="<S3_BUCKET_NAME>" DYNAMODB_TABLE_NAME="<DYNAMODB_NAME"
  2. 将这些值粘贴到run.sh脚本中,该脚本位于项目的根目录中:

    BACKEND_BUCKET_ID="<SAME_NAME_AS_S3_BUCKET_NAME>" DYNAMODB_ID="<SAME_NAME_AS_DYNAMODB_NAME>"
  3. 将项目代码上传到存储 CodeCommit 库。您可以通过 Terraform 自动创建此存储库,方法是在文件true中将以下变量设置为:demo/pipeline/locals.tf

    create_new_repo = true
  4. 根据您的要求更新locals.tf文件以创建管道资源。

AWS DevOps

部署管道模块。

要创建管道资源,请手动运行以下 Terraform 命令。没有自动运行这些命令的编排。

./run.sh -m pipeline -e demo -r <AWS_REGION> -t init ./run.sh -m pipeline -e demo -r <AWS_REGION> -t plan ./run.sh -m pipeline -e demo -r <AWS_REGION> -t apply
AWS DevOps
任务描述所需技能

启动管道。

  1. 在该templates文件夹中,确保buildspec文件将以下变量设置为network

    TF_MODULE_TO_BUILD: "network"
  2. CodePipeline 控制台的管道详细信息页面上,通过选择发布更改来启动管道。

第一次运行后,每当你向 CodeCommit 存储库主分支提交更改时,管道就会自动启动。

该管道包括以下阶段

  • validate初始化 Terraform,使用 checkovtfsec 工具运行 Terraf orm 安全扫描,并将扫描报告上传到 S3 存储桶。

  • plan 显示了 Terraform 计划并将该计划上传到 S3 存储桶。

  • apply应用来自 S3 存储桶的 Terraform 计划输出并创建 AWS 资源。

  • destroy移除在apply阶段中创建的 AWS 资源。要启用此可选阶段,请在demo/pipeline/locals.tf文件true中将以下变量设置为:

    enable_destroy_stage = true
AWS DevOps

验证通过网络模块创建的资源。

确认以下 AWS 资源是在成功部署管道后创建的:

  • VPC包含三个公有子网和三个私有子网、Internet 网关和NAT网关的出口。

  • EKSVPC具有三个私有子网的 Amazon。

  • 租户 1 和租户 2 各VPCs有三个私有子网。

  • 包含所有VPC连接和路由到每个私有子网的中转网关。

  • Amazon EKS 出口的静态传输网关路由VPC,目标CIDR区块为。0.0.0.0/0这是让所有VPCs人都能通过 Amazon EKS 出口访问出站互联网所必需的VPC。

AWS DevOps
任务描述所需技能

更新locals.tf以允许 CodeBuild 项目访问VPC。

要为亚马逊EKS私有集群部署插件,必须将该 CodeBuild 项目附加到亚马逊EKSVPC。

  1. demo/pipeline文件夹中,打开locals.tf文件,并将vpc_enabled变量设置为true

  2. 运行run.sh脚本将更改应用于流水线模块:

    demo/pipeline/locals.tf ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd init ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd plan ./run.sh -m pipeline -env demo -region <AWS_REGION> -tfcmd apply
AWS DevOps

更新buildspec文件以生成计算模块。

templates文件夹中,在所有buildspecYAML文件中,将TF_MODULE_TO_BUILD变量的值设置networkcompute

TF_MODULE_TO_BUILD: "compute"
AWS DevOps

更新租户管理 Helm 图表的values文件。

  1. 在以下位置打开values.yaml文件:

    cd cfg-terraform/demo/compute/cfg-tenant-mgmt

    该文件如下所示:

    --- global: clusterRoles: operator: platform-tenant flux: flux-tenant-applier flux: tenantCloneBaseUrl: ${TEANT_BASE_URL} repoSecret: ${TENANT_REPO_SECRET} tenants: tenant-1: quotas: limits: cpu: 1 memory: 1Gi flux: path: overlays/tenant-1 tenant-2: quotas: limits: cpu: 1 memory: 2Gi flux: path: overlays/tenant-2
  2. globaltenants部分中,根据您的要求更新配置:

    • tenantCloneBaseUrl— 托管所有租户代码的仓库路径(我们对所有租户使用相同的 Git 存储库)

    • repoSecret— Kubernetes 密SSH钥,其中包含用于向全局租户 Git 存储库进行身份验证的密钥和已知主机

    • quotas— 你想为每个租户申请的 Kubernetes 资源配额

    • flux path— 全局租户存储库中租户应用程序YAML文件的路径

AWS DevOps

验证计算资源。

在前面的步骤中更新文件后,将自动 CodePipeline 启动。确认它已为计算基础设施创建了以下 AWS 资源:

  • 带有私有终端节点的 Amazon EKS 集群

  • 亚马逊EKS工作节点

  • Amazon EKS 插件:外部机密aws-loadbalancer-controller、和 metrics-server

  • GitOps 模块、Flux Helm 图表、Cilium Helm 图表和租户管理 Helm 图表

AWS DevOps
任务描述所需技能

在 Kubernetes 中验证租户管理资源。

运行以下命令以检查租户管理资源是否在 Helm 的帮助下成功创建。

  1. 租户命名空间已创建,如中所述:values.yaml

    kubectl get ns -A
  2. 配额分配给每个租户命名空间,具体如以下所述values.yaml

    kubectl get quota --namespace=<tenant_namespace>
  3. 每个租户命名空间的配额详细信息都是正确的:

    kubectl describe quota cpu-memory-resource-quota-limit -n <tenant_namespace>
  4. Cilium 网络策略已应用于每个租户命名空间:

    kubectl get CiliumNetworkPolicy -A
AWS DevOps

验证租户应用程序部署。

运行以下命令以验证租户应用程序是否已部署。

  1. Flux 能够连接到 GitOps 模块中指定的 CodeCommit 存储库:

    kubectl get gitrepositories -A
  2. Flux 自定义控制器已将YAML文件部署到存储库中: CodeCommit

    kubectl get kustomizations -A
  3. 所有应用程序资源都部署在其租户命名空间中:

    kubectl get all -n <tenant_namespace>
  4. 已为每个租户创建了一个入口:

    kubectl get ingress -n <tenant_namespace>

故障排除

事务解决方案

您会遇到一条类似于以下内容的错误消息:

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.

请按照以下步骤解决问题:

  1. 验证租户应用程序存储库:错误可能是存储库为空或配置错误所致。确保租户应用程序存储库包含所需的代码。

  2. 重新部署tenant_mgmt模块:在tenant_mgmt模块配置文件中,找到模app块,然后将deploy参数设置为:0

    deploy = 0

    运行 Terraform apply 命令后,将deploy参数值改回:1

    deploy = 1
  3. 重新检查状态:运行前面的步骤后,使用以下命令检查问题是否仍然存在:

     kubectl get gitrepositories -A

    如果问题仍然存在,可以考虑更深入地研究 Flux 日志以获取更多详细信息,或者参阅 Flux 一般故障排除指南

相关资源

其他信息

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

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