教程:使用 CodePipeline 部署到 Amazon EKS - Amazon CodePipeline
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

教程:使用 CodePipeline 部署到 Amazon EKS

本教程可帮助您在 CodePipeline 中创建部署操作,将您的代码部署到您在 Amazon EKS 中配置的集群。

EKS 操作支持公共和私有 EKS 集群。私有集群是 EKS 推荐的类型;但是,两种类型都支持。

注意

作为在控制台中创建管道的一部分,CodePipeline 将使用 S3 构件存储桶来存放构件。(这与用于 S3 源操作的存储桶不同。) 如果 S3 构件存储桶所在的账户与您的管道账户不同,请确保 S3 构件存储桶归 Amazon Web Services 账户所有,并且安全可靠。

注意

此操作使用 CodePipeline 托管的 CodeBuild 计算在构建环境中运行命令。运行 Commands 操作将在 Amazon CodeBuild 中产生单独的费用。

注意

EKS 部署操作仅适用于 V2 类型管道。

先决条件

您必须先部署一些资源,然后才能使用本教程创建您的 CD 管道。以下是您在开始操作之前需要的资源:

注意

所有这些资源均应在同一 Amazon 区域内创建。

  • 一个将添加示例 deployment.yaml 文件的源控制存储库(本教程使用 GitHub)。

  • 您必须使用现有的 CodePipeline 服务角色,您将通过下方的 步骤 3:在 IAM 中更新 CodePipeline 服务角色策略 为该角色更新执行此操作的权限。所需的权限取决于您创建的集群的类型。有关更多信息,请参阅 服务角色策略权限

  • 您已推送到 ECR 或您的映像存储库的工作映像和存储库标签。

在满足这些先决条件后,您可以继续完成本教程并创建您的 CD 管道。

步骤 1:(可选)在 Amazon EKS 中创建集群

您可以选择使用公有或私有端点创建 EKS 集群。

在以下步骤中,您将在 EKS 中创建公有集群或私有集群。如果已创建集群,则此步骤为可选步骤。

在 Amazon EKS 中创建公有集群。

在本步骤中,您将在 EKS 中创建集群。

创建公有集群
  1. 打开 EKS 控制台,然后选择创建集群

  2. 名称中,为您的集群命名。选择下一步

  3. 选择创建

在 Amazon EKS 中创建私有集群。

如果您选择使用私有端点创建集群,请确保仅连接私有子网,并确保它们具有互联网连接。

请按照以下五个子步骤操作,使用私有端点创建集群。

在控制台中创建 VPC。
  1. 打开 VPC 控制台,然后选择创建 VPC

  2. VPC 设置页面上,选择 VPC 等

  3. 选择创建 1 个公有子网和 4 个私有子网。选择创建 VPC

  4. 在子网页面上,选择私有

确定 VPC 中的私有子网
  1. 导航到您的 VPC,然后选择 VPC ID 以打开 VPC 详细信息页面。

  2. 在 VPC 详细信息页面,选择资源图选项卡。

  3. 查看图表并记下您的私有子网。子网显示有指示公有或私有状态的标签,并且每个子网都映射到路由表。

    显示子网和 VPC 资源图的控制台图。

    请注意,私有集群将拥有所有私有子网。

  4. 创建一个公有子网以托管 NAT 网关。您一次只能将一个互联网网关连接到 VPC。

在公有子网中创建 NAT 网关
  1. 在公有子网中创建 NAT 网关。导航到 VPC 控制台,然后选择互联网网关。选择创建互联网网关

  2. 对于“名称”,为互联网网关输入名称。选择创建互联网网关

更新私有子网的路由表,以将流量引至 NAT 网关。

将 NAT 网关添加到私有子网的路由表中
  1. 导航到 VPC 控制台,然后选择子网

  2. 对于每个私有子网,选择它,然后在详细信息页面上选择该子网的路由表,选择编辑路由表

  3. 更新私有子网的路由表,以将互联网流量引至 NAT 网关。选择 Add route(添加路由)。从选项中选择要添加的 NAT 网关。选择您创建的互联网网关。

  4. 对于公有子网,创建一个自定义路由表。验证您的公有子网的网络访问控制列表(ACL)是否允许来自私有子网的入站流量。

  5. 选择保存更改

在本步骤中,您将在 EKS 中创建集群。

创建私有集群
  1. 打开 EKS 控制台,然后选择创建集群

  2. 名称中,为您的集群命名。选择下一步

  3. 指定您的 VPC 和其他配置信息。选择创建

您的 EKS 集群可以是公有集群,也可以是私有集群。此步骤适用于只有私有端点的集群。确保您的集群是私有的。

步骤 2:在 Amazon EKS 中配置您的私有集群

仅当您创建了私有集群时,此步骤才适用。此步骤适用于只有私有端点的集群。

配置集群
  1. 联网选项卡下,仅在 EKS 集群中附加私有子网。附加步骤 1:(可选)在 Amazon EKS 中创建集群确定 VPC 中的私有子网部分捕获的私有子网。

  2. 请确保私有子网可以访问互联网,因为 CodePipeline 存储和检索管道的 S3 存储桶中的构件。

步骤 3:在 IAM 中更新 CodePipeline 服务角色策略

在此步骤中,您将更新现有的 CodePipeline 服务角色,例如 cp-service-role,该角色具有 CodePipeline 连接集群所需的权限。如果您还没有角色,请创建新角色。

按照以下步骤更新您的 CodePipeline 服务角色。

更新您的 CodePipeline 服务角色策略
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在控制台控制面板中,选择角色

  3. 查找您的 CodePipeline 服务角色,例如 cp-service-role

  4. 添加新的内联策略。

  5. 策略编辑器中,输入以下内容。

    • 对于公有集群,添加以下权限。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Sid": "EksClusterPolicy", "Effect": "Allow", "Action": "eks:DescribeCluster", "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/my-cluster" }, { "Sid": "EksVpcClusterPolicy", "Effect": "Allow", "Action": [ "ec2:DescribeDhcpOptions", "ec2:DescribeNetworkInterfaces", "ec2:DescribeRouteTables", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeVpcs" ], "Resource": [ "*" ] } ] }
    • 对于私有集群,添加以下权限。私有集群需要您的 VPC 的额外权限(如果适用)。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Sid": "EksClusterPolicy", "Effect": "Allow", "Action": "eks:DescribeCluster", "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/my-cluster" }, { "Sid": "EksVpcClusterPolicy", "Effect": "Allow", "Action": [ "ec2:DescribeDhcpOptions", "ec2:DescribeNetworkInterfaces", "ec2:DescribeRouteTables", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeVpcs" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": "ec2:CreateNetworkInterface", "Resource": "*", "Condition": { "StringEqualsIfExists": { "ec2:Subnet": [ "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-03ebd65daeEXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0e377f6036EXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE" ] } } }, { "Effect": "Allow", "Action": "ec2:CreateNetworkInterfacePermission", "Resource": "*", "Condition": { "ArnEquals": { "ec2:Subnet": [ "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-03ebd65daeEXAMPLE", "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0e377f6036EXAMPLE", "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0db658ba1cEXAMPLE", "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0db658ba1cEXAMPLE" ] } } }, { "Effect": "Allow", "Action": "ec2:DeleteNetworkInterface", "Resource": "*", "Condition": { "StringEqualsIfExists": { "ec2:Subnet": [ "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-03ebd65daeEXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0e377f6036EXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE", "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE" ] } } } ] }
  6. 选择更新策略

步骤 4:为 CodePipeline 服务角色创建访问条目

在此步骤中,您将在集群上创建一个访问条目,该条目将添加您在步骤 3 中更新的 CodePipeline 服务角色以及托管访问策略。

  1. 打开 EKS 控制台并导航至您的集群。

  2. 选择访问选项卡。

  3. IAM 访问条目下,选择创建访问条目

  4. IAM 主体 ARN 中,输入您刚刚为操作更新的角色,例如 cp-service-role。选择下一步

  5. 步骤 2:添加访问策略页面的策略名称中,选择用于访问的托管策略,例如 AmazonEKSClusterAdminPolicy。选择添加策略。选择下一步

    注意

    这是 CodePipeline 操作用来与 Kubernetes 对话的策略。最佳做法是,附加自定义策略,将策略中的权限范围缩小到最低权限,而非使用管理员策略。

  6. 在查看页面上,选择创建

步骤 5:创建源存储库并添加 helm chart 配置文件

在此步骤中,您将创建一个适合您的操作的配置文件(Kubernetes 清单文件或 Helm 图表),并将配置文件存储在源存储库中。使用适合您的配置的文件。有关更多信息,请访问 https://kubernetes.io/docs/reference/kubectl/quick-reference/https://helm.sh/docs/topics/charts/

  • 对于 Kubernetes,请使用清单文件。

  • 对于 Helm,请使用 Helm 图表。

  1. 创建或使用现有的 GitHub 存储库。

  2. 在存储库中为 Helm 图表文件创建一个新结构,如下例所示。

    mychart |-- Chart.yaml |-- charts |-- templates | |-- NOTES.txt | |-- _helpers.tpl | |-- deployment.yaml | |-- ingress.yaml | `-- service.yaml `-- values.yaml
  3. 将文件添加到存储库的根级别。

步骤 6:创建管道

使用 CodePipeline 向导创建您的管道阶段,并连接源存储库。

创建管道
  1. https://console.aws.amazon.com/codepipeline/ 打开 CodePipeline 控制台。

  2. 欢迎页面、入门页面或管道页面上,选择创建管道

  3. 步骤 1:选择创建选项页面上的创建选项下,选择构建自定义管道选项。选择下一步

  4. 步骤 2:选择管道设置管道名称中,输入 MyEKSPipeline

  5. CodePipeline 提供 V1 和 V2 类型的管道,它们在特性和价格上有所不同。在控制台中,您只能选择 V2 类型。有关更多信息,请参阅管道类型。有关 CodePipeline 的定价信息,请参阅定价

  6. 服务角色中,选择您在步骤 3 中更新的服务角色。

  7. 高级设置中的各项设置保留为默认值,然后选择下一步

  8. 步骤 3:添加源阶段页面上,对于源提供商,选择创建与您的 GitHub 存储库的连接

  9. 步骤 4:添加构建阶段页面上,选择跳过

  10. 步骤 5:添加部署阶段页面上,选择 Amazon EKS

    Deploy configuration form with Helm selected, showing fields for release name and chart location.
    1. 部署配置类型下,选择 Helm

    2. Helm 图表位置中,输入版本名称,例如 my-release。对于 Helm 图表位置,请输入 Helm 图表的路径,例如 mychart

    3. 选择下一步

  11. Step 6: Review 页面上,审查您的管道配置,然后选择 Create pipeline 以创建管道。

    控制台示意图,显示了成功运行的管道,其中部署操作已添加到您的管道中。
  12. 管道成功运行后,选择查看详细信息即可查看操作日志,查看操作输出。