亚马逊AWS官方博客

使用 Amazon CodeCatalyst 跨账号和区域部署 EKS 应用

介绍

Amazon CodeCatalyst(于 2023 年 4 月 20 日正式发布)是一个统一的软件开发服务,旨在简化软件团队的开发、协作和部署流程。它将各种工具和实践整合到一个单一平台中,以促进持续集成和持续交付(CI/CD)。Amazon Elastic Kubernetes Service(Amazon EKS)是一项托管服务,简化了在 AWS 上运行 Kubernetes,无需自行安装和操作 Kubernetes 控制平面或节点。

CodeCatalyst workflow 目前提供内置的 Kubernetes action,可以简单方便地部署应用到 Amazon EKS。EKS api server 提供了公有和私有端点对外提供服务。出于安全原因,EKS 的应用部署通常通过 api server 私有端点进行。同时在企业环境中,业务团队在亚马逊云科技上的环境基于合规和安全的考量,会分别拥有自己的账号和网络地址划分,这意味着各个团队的 EKS 集群会分别部署在不同的账号和 VPC 中。另外,CodeCatalyst 服务本身目前只在美西 2(us-west-2)和欧西 1(eu-west-1)区域可用,而且亚马逊云科技的控制台和 CodeCatalyst 的控制台各自独立,并拥有单独的账号体系,CodeCatalyst 和亚马逊云科技的资源的交互需要通过公网访问。

如果需要使用 CodeCatalyst 将应用程序通过 EKS 的私有端点部署到亚马逊云科技的多个账号和区域,以符合业务扩展和安全合规的需求,CodeCatalyst 能够满足这些需求吗?答案是肯定的。CodeCatalyst 在 2023 年 11 月宣布支持 Amazon Virtual Private Cloud(Amazon VPC),您可以利用此功能在 CodeCatalyst 和您的 VPC 之间创建 VPC 连接。Amazon CodeCatalyst 可以使用 VPC 的全部功能,然后您可以使用 VPC 对等连接(或者传输网关)允许 CodeCatalyst 将应用程序部署到另一个区域的 EKS 中。另外通过 CodeCatalyst 的环境管理功能可以关联到多个亚马逊云科技账号,从而实现跨账号的资源访问。本博文将指导您如何使用和配置 CodeCatalyst 跨账号和区域部署应用到 EKS 集群。

解决方案概述

Amazon CodeCatalyst 为持续集成和持续交付(CI/CD)提供了强大的集成环境。通过利用 CodeCatalyst,您可以自动化将应用程序部署到多个 EKS 集群,无论它们位于哪个区域或账号。在下面的案例中,我们有一个名为 testing1 的 CodeCatalyst 空间,其关联的工作流账号为 8995xxxxxxxx,位于 us-west-2 区域。目标账号 4729xxxxxxxx 在 ap-northeast-1 区域中有一个准备就绪的 EKS 集群。我们需要将应用程序部署到这个 EKS 集群中。下图说明了架构和工作流程:CodeCatalyst action 在运行的的时候,通过 VPC 连接功能在 VPC 内创建对应的弹性网络接口,action 通过弹性网络接口对其它资源实现内网访问请注意,ENI 没有公共 IP 地址。因此需要提供一条通往互联网的路径,互联网连接使 CodeCatalyst 能够访问 API 以及 GitHub、PyPI、NPM、Docker Hub 等公开可用的存储库。这个例子中通过 NAT 实现互联网连接。

前置条件

在开始之前,请确保您具备以下条件:

  • 开通 CodeCatalyst 并创建 Amazon CodeCatalyst 空间(us-west-2)和项目。
  • 空间关联工作流账号(8995xxxxxxxx)。
  • EKS 已在目标账号(4729xxxxxxxx)和区域 ap-northeast-1 中准备就绪。
  • 已配置 EKS 集群 api server 允许私有端点访问。
  • AWS CLI 已配置必要的权限。

操作步骤

创建 VPC 连接

CodeCatalyst 仅支持在同一区域创建 VPC 连接(这是 CodeCatalyst 中 VPC 连接的限制之一)。在我们的这个例子中,空间位于 us-west-2,因此我们需要在 us-west-2 区域为工作流账号创建一个 VPC。该 VPC 必须满足 CodeCatalyst 可以连接的需求。以下是一些关键需求:

  • 对于公有子网的数量,确保在任何可用区中至少有一个公有子网。
  • 对于私有子网的数量,确保在该区域的每个可用可用区中都有一个私有子网。
  • 确保您的 VPC 能够访问互联网。
  • CodeCatalyst 不支持为其创建的网络接口分配公有IP地址。实现这一点的一种方法是添加 NAT 设备,以便 CodeCatalyst 可以与您的 VPC 一起使用。

一旦 VPC 成功创建,我们就可以为其创建 VPC 连接。VPC 连接允许 CodeCatalyst 创建工作流弹性网络接口(ENI),用于与您账号中的资源进行交互。您必须为每个想要与 CodeCatalyst 空间一起使用的 AWS 账号创建一个连接。

创建 VPC 对等连接

按照指南为工作流 VPC 和目标 VPC 创建 VPC 对等连接(在本例中,我们使用 VPC 对等连接连接两个 VPC,当然您也可以通过传输网关实现)。

添加目标账号

由于我们需要将应用程序部署到目标账号的 EKS 集群(请注意,如果您选择使用付费层级,连接的账号也可以用作该空间的计费账号),我们需要将账号和角色添加到 CodeCatalyst(该角色用于 EKS 部署,因此请确保它附加了 EKS 策略)。

创建环境

尽管我们已经有了账号和 VPC 连接,但 CodeCatalyst 工作流还不能直接开始部署应用。要启用这些部署,我们必须设置 CodeCatalyst 环境。CodeCatalyst 环境(不要与开发环境混淆)定义了 CodeCatalyst 工作流连接到的目标 AWS 账号和可选的 Amazon VPC。环境还定义了工作流访问目标账号内 AWS 服务和资源所需的 IAM 角色。我们可以设置多个环境,并给它们命名,如开发、测试、预发布和生产。当我们部署到这些环境时,有关部署的信息会显示在 CodeCatalyst 的部署活动和部署目标标签页中。让我们创建一个名为”eks-dev-env”的环境,以便稍后进行工作流部署。

  • AWS 账号连接 – 选择我们在前面步骤中创建的目标账号”test2″,EKS 在该账号中。
  • 默认 IAM 角色 – 选择用于将应用程序部署到 EKS 的角色。
  • VPC 连接 – 选择我们之前创建的”codecatalyst-vpc-con”。

请注意,CodeCatalyst 创建的 IAM 角色虽然可以访问 EKS,但它无法对 EKS 中 Kubernetes 资源执行任何操作,这意味着它无法将应用程序部署到 EKS。您可以使用 EKS 集群访问管理功能,将该角色添加为具有足够策略的 IAM 访问条目使其可以操作 Kubernetes 对象。同时还请检查 EKS 的安全组,确保它允许来自 CodeCatalyst 工作流 ENI 的入站流量。这里还需要注意的是联账号和角色指向的目标账号,但是 VPC 连接指向的工作流账号。

创建工作流

工作流是一种自动化过程,用于描述在持续集成和持续交付(CI/CD)系统中如何构建、测试和部署代码。工作流定义了一系列在工作流运行期间要执行的步骤或操作。工作流还定义了启动工作流的事件或触发器。要设置工作流,可以使用 CodeCatalyst 控制台的可视化编辑器或 YAML 编辑器创建工作流定义文件。

由于工作流需要关联代码仓库,我们先创建代码仓库(存储 EKS 部署所需 Yaml 与镜像版本等相关内容)。

在 repo 中创建文件(Kubernetes/cd.conf

REPOSITORY_URI=****.dkr.ecr.us-west-2.amazonaws.com/quotes-service
IMAGE_TAG=****

在 repo 中创建文件(Kubernetes/deploy.yaml

apiVersion: v1
kind: Service
metadata:
  name: quotes-service
  labels:
    app: quotes-service
spec:
  type: LoadBalancer
  selector:
    app: quotes-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---      
apiVersion: apps/v1
kind: Deployment
metadata:
  name: quotes-app
  labels:
    app: quotes-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: quotes-app
  template:
    metadata:
      labels:
        app: quotes-app
    spec:
      containers:
      - name: quotes-app
        image: $REPOSITORY_URI:$IMAGE_TAG
        ports:
        - containerPort: 8080

创建 workflow,选择我们刚刚创建的代码仓库。

编辑 workflow 的内容如下(带人工审核)。

Name: Workflow_b364
SchemaVersion: "1.0"
Actions:
  ApplicationConfig:
    Identifier: aws/build@v1
    Inputs:
      Sources:
        - WorkflowSource
    Configuration:
      Steps:
        # - Run: cat Kubernetes/cd.conf
        - Run: REPOSITORY_URI=$(sed -n 's/^REPOSITORY_URI=\(.*\)$/\1/p'
            Kubernetes/cd.conf)
        - Run: echo $REPOSITORY_URI # 输出 REPOSITORY_URI
        - Run: IMAGE_TAG=$(sed -n 's/^IMAGE_TAG=\(.*\)$/\1/p' Kubernetes/cd.conf)
        - Run: echo $IMAGE_TAG # 输出 IMAGE_TAG
        - Run: find Kubernetes/deploy.yaml -type f | xargs sed -i
            "s|\$REPOSITORY_URI|${REPOSITORY_URI}|g"
        - Run: find Kubernetes/deploy.yaml -type f | xargs sed -i
            "s|\$IMAGE_TAG|$IMAGE_TAG|g"
        - Run: cat Kubernetes/deploy.yaml
    Outputs:
      Artifacts:
        - Name: Manifests
          Files:
            - Kubernetes/*
      AutoDiscoverReports:
        Enabled: true
        # Use as prefix for the report files
        ReportNamePrefix: eks-cd-demo
    Compute:
      Type: EC2
  Approval_02:
    # Identifies the action. Do not modify this value.
    Identifier: aws/approval@v1
    Configuration:
      ApprovalsRequired: 1
    DependsOn:
      - ApplicationConfig
  DeployAppToEKS:
    Identifier: aws/kubernetes-deploy@v1.0.2
    Environment:
      Connections:
        - Role: CodeCatalystWorkflowDevelopmentRole-***-test
          Name: "*****"
      Name: test-env
    Inputs:
      Artifacts:
        - Manifests
    Compute:
      Type: EC2
    Configuration:
      Namespace: default
      Manifests: Kubernetes/deploy.yaml
      Cluster: demoeks
      Region: us-west-2
    DependsOn:
      - Approval_02

点击左侧进行编辑

编辑 ApplicationConfig 阶段所需的内容,如使用预制的 Compute fleet 请先创建再进行勾选。

修改 DeployAppToEKS 过程所需要的配置:

  • Environment – 选择我们在前面步骤创建好的环境 eks-dev-env,选择后会自动获取账号,角色和 VPC 连接信息并显示。
  • Region – 目标账号的 region,这里我们选择 Asia Pacific(Tokyo) ,ap-northeast-1。

完成后点击 Commit,之点击 Action,运行一次 workflow,观察执行结果即可。

总结

本文介绍了使用 CodeCatalyst 实现跨账号和跨区域部署 EKS 应用的主要流程。通过这种设置,您可以在一个一站式的 DevOps 平台上管理和执行容器应用的部署任务,同时保持不同账号和区域之间的网络连接和安全性。这里我们再总结一下文章中涉及到一些关键步骤:

  1. 将工作流账号和目标账号添加到 CodeCatalyst
  2. 创建 CodeCatalyst 与工作流 VPC 之间的 VPC 连接
  3. 创建工作流 VPC 与目标 VPC 之间的 VPC 对等连接
  4. 创建环境,并为部署绑定目标账号和工作流 VPC
  5. 运行工作流 action,这些 action 将承担 CodeCatalyst 工作流角色来执行部署

本篇作者

叶鹏勇

亚马逊云科技解决方案架构师,负责容器以及 DevOps 相关领域的方案和架构设计工作。在容器,微服务,SRE 相关领域有多年的实战经验。

李佳

亚马逊云科技快速原型解决方案研发架构师,主要负责微服务与容器原型设计与研发。