

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

# 教程：使用以下方法部署到 Amazon EKS CodePipeline
<a name="tutorials-eks-deploy"></a>

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

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

**注意**  
作为在控制台中创建管道的一部分，S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

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

**注意**  
`EKS` 部署操作仅适用于 V2 类型管道。

## 先决条件
<a name="tutorials-eks-deploy-prereqs"></a>

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

**注意**  
所有这些资源都应在同一个 AWS 区域内创建。
+ 源代码控制存储库（本教程使用 GitHub），您将在其中添加示例`deployment.yaml`文件。
+ 您必须使用现有的 CodePipeline 服务角色，该角色将使用[步骤 3：在 IAM 中更新 CodePipeline 服务角色策略](#tutorials-eks-deploy-role)以下方法更新为该操作的权限。所需的权限取决于您创建的集群的类型。有关更多信息，请参阅 [服务角色策略权限](action-reference-EKS.md#action-reference-EKS-service-role)。
+ 您已推送到 ECR 或您的映像存储库的工作映像和存储库标签。

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

## 步骤 1：（可选）在 Amazon EKS 中创建集群
<a name="tutorials-eks-deploy-cluster"></a>

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

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

### 在 Amazon EKS 中创建公有集群。
<a name="tutorials-eks-deploy-cluster-public"></a>

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

**创建公有集群**

1. 打开 EKS 控制台，然后选择**创建集群**。

1. 在**名称**中，为您的集群命名。选择**下一步**。

1. 选择**创建**。

### 在 Amazon EKS 中创建私有集群。
<a name="tutorials-eks-deploy-cluster-private"></a>

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

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

**在控制台中创建 VPC。**

1. 打开 VPC 控制台，然后选择**创建 VPC**。

1. 在 **VPC 设置**页面上，选择 **VPC 等**。

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

1. 在子网页面上，选择**私有**。

**确定 VPC 中的私有子网**

1. 导航到您的 VPC，然后选择 VPC ID 以打开 VPC 详细信息页面。

1. 在 VPC 详细信息页面，选择**资源图**选项卡。

1. 查看图表并记下您的私有子网。子网显示有指示公有或私有状态的标签，并且每个子网都映射到路由表。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/eks-deploy-subnets.png)

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

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

**在公有子网中创建 NAT 网关**

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

1. 对于“名称”，为互联网网关输入名称。选择**创建互联网网关**。

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

**将 NAT 网关添加到私有子网的路由表中**

1. 导航到 VPC 控制台，然后选择**子网**。

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

1. 更新私有子网的路由表，以将互联网流量引至 NAT 网关。选择 **Add route**（添加路由）。从选项中选择要添加的 **NAT 网关**。选择您创建的互联网网关。

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

1. 选择**保存更改**。

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

**创建私有集群**

1. 打开 EKS 控制台，然后选择**创建集群**。

1. 在**名称**中，为您的集群命名。选择**下一步**。

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

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

## 步骤 2：在 Amazon EKS 中配置您的私有集群
<a name="tutorials-eks-deploy-cluster-private-configure"></a>

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

**配置集群**

1. 在**联网**选项卡下，仅在 EKS 集群中附加私有子网。附加[步骤 1：（可选）在 Amazon EKS 中创建集群](#tutorials-eks-deploy-cluster)下**确定 VPC 中的私有子网**部分捕获的私有子网。

1. 确保私有子网可以访问 Internet，因为可以 CodePipeline存储和检索管道的 S3 工件存储桶中的项目。

## 步骤 3：在 IAM 中更新 CodePipeline 服务角色策略
<a name="tutorials-eks-deploy-role"></a>

在此步骤中，您将使用连接集群所需的权限 CodePipeline 来更新现有 CodePipeline 服务角色（例如）。`cp-service-role`如果您还没有角色，请创建新角色。

通过以下步骤更新您的 CodePipeline 服务角色。

**更新您的 CodePipeline 服务角色政策**

1. 打开 IAM 控制台，网址为 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 在控制台控制面板中，选择**角色**。

1. 查找您的 CodePipeline 服务角色，例如`cp-service-role`。

1. 添加新的内联策略。

1. 在**策略编辑器**中，输入以下内容。
   + 对于公有集群，添加以下权限。

------
#### [ 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"
                         ]
                     }
                 }
             }
         ]
     }
     ```

------

1. 选择**更新策略**。

## 步骤 4：为 CodePipeline 服务角色创建访问条目
<a name="tutorials-eks-deploy-access-entry"></a>

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

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

1. 选择**访问**选项卡。

1. 在 **IAM 访问条目**下，选择**创建访问条目**。

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

1. 在**步骤 2：添加访问策略**页面的**策略名称**中，选择用于访问的托管策略，例如 `AmazonEKSClusterAdminPolicy`。选择**添加策略**。选择**下一步**。
**注意**  
这是该 CodePipeline 操作用来与 Kubernetes 对话的策略。最佳做法是，附加自定义策略，将策略中的权限范围缩小到最低权限，而非使用管理员策略。

1. 在查看页面上，选择**创建**。

## 步骤 5：创建源存储库并添加 `helm chart` 配置文件
<a name="tutorials-eks-deploy-source"></a>

在此步骤中，您将创建一个适合您的操作的配置文件（Kubernetes 清单文件或 Helm 图表），并将配置文件存储在源存储库中。使用适合您的配置的文件。欲了解更多信息，请参阅 [https://kubernetes。 ](https://kubernetes.io/docs/reference/kubectl/quick-reference/)io/docs/reference/kubectl/quick[-reference/ 或 https://helm。 sh/docs/topics/charts](https://helm.sh/docs/topics/charts/)/。
+ 对于 Kubernetes，请使用清单文件。
+ 对于 Helm，请使用 Helm 图表。

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

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

   ```
   mychart
   |-- Chart.yaml
   |-- charts
   |-- templates
   |   |-- NOTES.txt
   |   |-- _helpers.tpl
   |   |-- deployment.yaml
   |   |-- ingress.yaml
   |   `-- service.yaml
   `-- values.yaml
   ```

1. 将文件添加到存储库的根级别。

## 步骤 6：创建管道
<a name="tutorials-eks-deploy-pipeline"></a>

使用向 CodePipeline 导创建工作流阶段并连接源存储库。

**创建管道**

1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

1. 在**步骤 2：选择管道设置**的**管道名称**中，输入 **MyEKSPipeline**。

1. CodePipeline 提供 V1 和 V2 类型的管道，它们的特性和价格各不相同。在控制台中，您只能选择 V2 类型。有关更多信息，请参阅[管道类型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。有关定价的信息 CodePipeline，请参阅[定价](https://aws.amazon.com/codepipeline/pricing/)。

1. 在**服务角色**中，选择您在步骤 3 中更新的服务角色。

1. 将**高级设置**中的各项设置保留为默认值，然后选择**下一步**。

1. 在 “**步骤 3：添加源阶段**” 页面上，对于**源提供商****，选择创建与存储 GitHub 库的连接**。

1. 在**步骤 4：添加构建阶段**页面上，选择**跳过**。

1. 在**步骤 5：添加部署阶段**页面上，选择 **Amazon EKS**。  
![\[Deploy configuration form with Helm selected, showing fields for release name and chart location.\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/eks-action-example.png)

   1. 在**部署配置类型**下，选择 **Helm**。

   1. 在 **Helm 图表位置**中，输入版本名称，例如 `my-release`。对于 **Helm 图表位置**，请输入 Helm 图表的路径，例如 `mychart`。

   1. 选择**下一步**。

1. 在 **Step 6: Review** 页面上，审查您的管道配置，然后选择 **Create pipeline** 以创建管道。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/eks-deploy-pipeline.png)

1. 管道成功运行后，选择**查看详细信息**即可查看操作日志，查看操作输出。