

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

# 教學課程：使用 CodePipeline 部署至 Amazon EKS
<a name="tutorials-eks-deploy"></a>

本教學課程可協助您在 CodePipeline 中建立部署動作，將您的程式碼部署到您在 Amazon EKS 中設定的叢集。

EKS 動作同時支援公有和私有 EKS 叢集。私有叢集是 EKS 建議的類型；不過，支援這兩種類型。

**注意**  
在主控台中建立管道時，CodePipeline 將使用 S3 成品儲存貯體做為成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

**注意**  
此動作使用 CodePipeline 受管 CodeBuild 運算在建置環境中執行命令。執行命令動作會產生個別費用 AWS CodeBuild。

**注意**  
部署動作僅適用於 V2 `EKS` 類型管道。

## 先決條件
<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. 選擇 建立一個公有和 4 個私有子網路。選擇**建立 VPC**。

1. 在子網路頁面上，選擇**私有**。

**判斷 VPC 中的私有子網路**

1. 導覽至您的 VPC，然後選擇 VPC ID 以開啟 VPC 詳細資訊頁面。

1. 在 VPC 詳細資訊頁面上，選擇**資源映射**索引標籤。

1. 檢視圖表並記下您的私有子網路。子網路會顯示標籤，指出公有或私有狀態，且每個子網路都會對應至路由表。  
![\[\]](http://docs.aws.amazon.com/zh_tw/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 叢集中連接私有子網路。在 下的**判斷 VPC 中的私有子網路區段中連接擷取的私有子網路**[步驟 1：（選用） 在 Amazon EKS 中建立叢集](#tutorials-eks-deploy-cluster)。

1. 請確定私有子網路可存取網際網路，因為 CodePipeline 會儲存並從管道的 S3 成品儲存貯體擷取成品。

## 步驟 3：更新 IAM 中的 CodePipeline 服務角色政策
<a name="tutorials-eks-deploy-role"></a>

在此步驟中，您將更新現有的 CodePipeline 服務角色，例如 `cp-service-role`，具有 CodePipeline 與叢集連線所需的許可。如果您沒有現有角色，請建立新的角色。

使用下列步驟更新您的 CodePipeline 服務角色。

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

1. 開啟 IAM 主控台，網址為 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 從主控台儀表板，選擇 **Roles (角色)**。

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`。選擇 **Add Policy (新增政策)**。選擇**下一步**。
**注意**  
這是 CodePipeline 動作用來與 Kubernetes 交談的政策。最佳實務是，若要以最低權限縮減政策中的許可範圍，而非管理政策，請改為連接自訂政策。

1. 在檢閱頁面上，選擇**建立**。

## 步驟 5：建立來源儲存庫並新增`helm chart`組態檔案
<a name="tutorials-eks-deploy-source"></a>

在此步驟中，您會建立適合您 動作的組態檔案 (Kubernetes 資訊清單檔案或 Helm Chart)，並將組態檔案存放在來源儲存庫中。為您的組態使用適當的檔案。如需詳細資訊，請參閱 [https://kubernetes.io/docs/reference/kubectl/quick-reference/](https://kubernetes.io/docs/reference/kubectl/quick-reference/)：// 或 [https://helm.sh/docs/topics/charts/](https://helm.sh/docs/topics/charts/)：//。
+ 對於 Kubernetes，請使用資訊清單檔案。
+ 對於 Helm，請使用 Helm Chart。

1. 建立或使用現有的 GitHub 儲存庫。

1. 在儲存庫中為您的 Helm Chart 檔案建立新的結構，如以下範例所示。

   ```
   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. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 在 **Welcome (歡迎)** 頁面、**Getting started (入門)** 頁面、或者 **Pipelines (管道)** 頁面上，選擇 **Create pipeline (建立管道)**。

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. 將 **Advanced settings (進階設定)** 下的設定保留為預設值，然後選擇 **Next (下一步)**。

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_tw/codepipeline/latest/userguide/images/eks-action-example.png)

   1. 在**部署組態類型**下，選擇 **Helm**。

   1. 在 **Helm Chart 位置**中，輸入發行名稱，例如 `my-release`。針對 **Helm Chart 位置**，輸入 Helm Chart 檔案的路徑，例如 `mychart`。

   1. 選擇**下一步**。

1. 在 **Step 6: Review** (步驟 6：檢閱) 頁面上，檢閱您的管道組態，然後選擇 **Create pipeline** (建立管道) 來建立管道。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/eks-deploy-pipeline.png)

1. 管道成功執行後，請選擇**檢視詳細資訊**以檢視動作上的日誌，以檢視動作輸出。