

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

# 在 Amazon S3 中使用 Amazon EKS 和 Helm Chart 儲存庫部署 Kubernetes 資源和套件
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3"></a>

*Sagar Panigrahi，Amazon Web Services*

## 總結
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-summary"></a>

此模式可協助您有效率地管理 Kubernetes 應用程式，無論其複雜性為何。模式會將 Helm 整合到現有的持續整合和持續交付 (CI/CD) 管道中，以將應用程式部署到 Kubernetes 叢集。Helm 是 Kubernetes 套件管理員，可協助您管理 Kubernetes 應用程式。Helm Chart 有助於定義、安裝和升級複雜的 Kubernetes 應用程式。圖表可以版本化並存放在 Helm 儲存庫中，這可改善中斷期間的平均還原時間 (MTTR)。 

此模式針對 Kubernetes 叢集使用 Amazon Elastic Kubernetes Service (Amazon EKS)。它使用 Amazon Simple Storage Service (Amazon S3) 做為 Helm Chart 儲存庫，以便整個組織的開發人員集中管理和存取圖表。

## 先決條件和限制
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-prereqs"></a>

**先決條件**
+ 具有虛擬私有雲端 (VPC) 的作用中 Amazon Web Services (AWS) 帳戶
+ Amazon EKS 叢集 
+ 在 Amazon EKS 叢集中設定並準備好接受工作負載的工作者節點
+ Kubectl 用於設定用戶端機器中目標叢集的 Amazon EKS kubeconfig 檔案
+ 建立 S3 儲存貯體的 AWS Identity and Access Management (IAM) 存取權
+ 從用戶端機器存取 Amazon S3 的 IAM （程式設計或角色）
+ 原始程式碼管理和 CI/CD 管道

**限制**
+ 目前不支援升級、刪除或管理自訂資源定義 (CRDs)。
+ 如果您使用的是參考 CRD 的資源，則必須單獨安裝 CRD （在圖表之外）。

**產品版本**
+ Helm 3.6.3 版

## Architecture
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-architecture"></a>

**目標技術堆疊**
+ Amazon EKS
+ Amazon VPC
+ Amazon S3
+ 原始程式碼管理
+ Helm
+ kubectl

**目標架構**

![用戶端 Helm 和 Kubectl 在 Amazon S3 中為 Amazon EKS 叢集部署 Helm Chart 儲存庫。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/d3f993e6-4d96-4cb9-a075-c4debe431fd7/images/2f09f7bb-440a-4c4b-b29f-08d136d1ada4.png)


 

**自動化和擴展**
+ AWS CloudFormation 可用來自動建立基礎設施。如需詳細資訊，請參閱 [Amazon EKS 文件中的使用 AWS CloudFormation 建立](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html) Amazon EKS 資源。
+ Helm 要整合到您現有的 CI/CD 自動化工具中，以自動化 Helm Chart 的封裝和版本控制 （此模式的範圍外）。
+ GitVersion 或 Jenkins 建置號碼可用來自動化圖表的版本控制。

## 工具
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-tools"></a>

**工具**
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) – Amazon Elastic Kubernetes Service (Amazon EKS) 是一種受管服務，可在 AWS 上執行 Kubernetes，而不需要站立或維護您自己的 Kubernetes 控制平面。Kubernetes 是一套開放原始碼系統，用於容器化應用程式的自動化部署、擴展與管理。
+ [Helm](https://helm.sh/docs/) – Helm 是 Kubernetes 套件管理員，可協助您在 Kubernetes 叢集上安裝和管理應用程式。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html) – Amazon Simple Storage Service (Amazon S3) 是網際網路的儲存體。您可以使用 Amazon S3 隨時從 Web 任何地方存放和擷取任意資料量。
+ [Kubectl](https://kubernetes.io/docs/reference/kubectl/overview/) – Kubectl 是一種命令列公用程式，用於對 Kubernetes 叢集執行命令。

**Code**

已連接範例程式碼。

## 史詩
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-epics"></a>

### 設定和初始化 Helm
<a name="configure-and-initialize-helm"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 Helm 用戶端。 | 若要在您的本機系統上下載並安裝 Helm 用戶端，請使用下列命令。 <pre>sudo curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash</pre> | DevOps 工程師 | 
| 驗證 Helm 安裝。 | 若要驗證 Helm 是否能夠與 Amazon EKS 叢集中的 Kubernetes API 伺服器通訊，請執行 `helm version`。 | DevOps 工程師 | 

### 在 Amazon EKS 叢集中建立並安裝 Helm Chart
<a name="create-and-install-a-helm-chart-in-the-amazon-eks-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 NGINX 的 Helm Chart。 | 若要在用戶端機器`my-nginx`上建立名為 的 Helm Chart，請執行 `helm create my-nginx`。 | DevOps 工程師 | 
| 檢閱圖表的結構。 | 若要檢閱圖表的結構，請執行樹狀命令 `tree my-nginx/`。 | DevOps 工程師 | 
| 在圖表中停用服務帳戶建立。 | 在 的 `serviceAccount`區段`values.yaml`下，將`create`金鑰設定為 `false`。這是關閉的，因為不需要為此模式建立服務帳戶。 | DevOps 工程師 | 
| 驗證 (lint) 修改後的圖表是否有語法錯誤。 | 若要驗證圖表是否有任何語法錯誤，再將其安裝在目標叢集中，請執行 `helm lint my-nginx/`。 | DevOps 工程師 | 
| 安裝圖表以部署 Kubernetes 資源。 | 若要執行 Helm Chart 安裝，請使用下列命令。 <pre>helm install --name my-nginx-release --debug my-nginx/ --namespace helm-space </pre><br />選用旗標會在安裝期間`debug`輸出所有偵錯訊息。`namespace` 旗標指定要在其中建立此圖表資源部分的命名空間。 | DevOps 工程師 | 
| 檢閱 Amazon EKS 叢集中的資源。 | 若要檢閱在`helm-space`命名空間中作為 Helm Chart 一部分建立的資源，請使用下列命令。 <pre>kubectl get all -n helm-space</pre> | DevOps 工程師 | 

### 回復至舊版的 Kubernetes 應用程式
<a name="roll-back-to-a-previous-version-of-a-kubernetes-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改和升級版本。 | 若要修改圖表，請在 中將`replicaCount`值`values.yaml`變更為 `2`。然後執行下列命令來升級已安裝的版本。<pre>helm upgrade my-nginx-release my-nginx/ --namespace helm-space</pre> | DevOps 工程師 | 
| 檢閱 Helm 版本的歷史記錄。 | 若要列出使用 Helm 安裝的特定版本的所有修訂，請執行下列命令。 <pre>helm history my-nginx-release</pre> | DevOps 工程師 | 
| 檢閱特定修訂的詳細資訊。 | 在切換或轉返到工作版本之前，以及安裝修訂之前的額外驗證層，請使用下列命令檢視傳遞到每個修訂的值。<pre>helm get --revision=2 my-nginx-release</pre> | DevOps 工程師 | 
| 回復至先前的版本。 | 若要復原至先前的修訂版，請使用下列命令。 <pre>helm rollback my-nginx-release 1 </pre><br />此範例會轉返至修訂版編號 1。 | DevOps 工程師 | 

### 將 S3 儲存貯體初始化為 Helm 儲存庫
<a name="initialize-an-s3-bucket-as-a-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為 Helm Chart 建立 S3 儲存貯體。 | 建立唯一的 S3 儲存貯體。在 儲存貯體中，建立名為 的資料夾`charts`。此模式中的範例使用 `s3://my-helm-charts/charts`做為目標圖表儲存庫。 | 雲端管理員 | 
| 安裝適用於 Amazon S3 的 Helm 外掛程式。 | 若要在用戶端機器上安裝 helm-s3 外掛程式，請使用下列命令。 <pre>helm plugin install https://github.com/hypnoglow/helm-s3.git --version 0.10.0</pre><br />注意：Helm V3 支援適用於外掛程式 0.9.0 版及更新版本。 | DevOps 工程師 | 
| 初始化 Amazon S3 Helm 儲存庫。 | 若要將目標資料夾初始化為 Helm 儲存庫，請使用下列命令。 <pre>helm S3 init s3://my-helm-charts/charts </pre><br />命令會在目標中建立 `index.yaml` 檔案，以追蹤存放在該位置的所有圖表資訊。 | DevOps 工程師 | 
| 將 Amazon S3 儲存庫新增至 Helm。 | 若要在用戶端機器中新增儲存庫，請使用下列命令。<pre>helm repo add my-helm-charts s3://my-helm-charts/charts </pre><br />此命令會將別名新增至 Helm 用戶端機器中的目標儲存庫。 | DevOps 工程師 | 
| 檢閱儲存庫清單。 | 若要檢視 Helm 用戶端機器中的儲存庫清單，請執行 `helm repo list`。 | DevOps 工程師 | 

### 在 Amazon S3 Helm 儲存庫中封裝和存放圖表
<a name="package-and-store-charts-in-the-amazon-s3-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 封裝圖表。 | 若要封裝您建立的`my-nginx`圖表，請執行 `helm package ./my-nginx/`。命令會將`my-nginx`圖表資料夾的所有內容封裝至封存檔案，該檔案會使用`Chart.yaml`檔案中提及的版本編號來命名。 | DevOps 工程師 | 
| 將套件存放在 Amazon S3 Helm 儲存庫中。 | 若要將套件上傳至 Amazon S3 中的 Helm 儲存庫，請使用 `.tgz` 檔案的正確名稱執行下列命令。<pre>helm s3 push ./my-nginx-0.1.0.tgz my-helm-charts</pre> | DevOps 工程師 | 
| 搜尋 Helm Chart。 | 若要確認圖表在本機和 Amazon S3 中的 Helm 儲存庫中同時出現，請執行下列命令。<pre>helm search repo my-nginx</pre> | DevOps 工程師 | 

### 修改、版本和封裝圖表
<a name="modify-version-and-package-a-chart"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 修改和封裝圖表。 | 在 中`values.yaml`，將 `replicaCount`值設定為 `1`。然後執行 封裝圖表`helm package ./my-nginx/`，這次將 中的版本變更為 `Chart.yaml` `0.1.1`。 <br />在 CI/CD 管道中使用 GitVersion 或 Jenkins 建置號碼等工具，最好透過自動化更新版本控制。自動化版本編號超出此模式的範圍。 | DevOps 工程師 | 
| 將新版本推送至 Amazon S3 中的 Helm 儲存庫。 | 若要將 0.1.1 版的新套件推送至 Amazon S3 中的 `my-helm-charts` Helm 儲存庫，請執行下列命令。<pre>helm s3 push ./my-nginx-0.1.1.tgz my-helm-charts</pre> | DevOps 工程師 | 

### 從 Amazon S3 Helm 儲存庫搜尋並安裝圖表
<a name="search-for-and-install-a-chart-from-the-amazon-s3-helm-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 搜尋 my-nginx 圖表的所有版本。 | 若要檢視圖表的所有可用版本，請使用 `--versions`旗標執行下列命令。<pre>helm search repo my-nginx --versions</pre><br />如果沒有 旗標，Helm 預設會顯示圖表的最新上傳版本。 | DevOps 工程師 | 
| 從 Amazon S3 Helm 儲存庫安裝圖表。 | 先前任務的搜尋結果會顯示`my-nginx`圖表的多個版本。若要從 Amazon S3 Helm 儲存庫安裝新版本 (0.1.1)，請使用下列命令。<pre>helm upgrade my-nginx-release my-helm-charts/my-nginx --version 0.1.1 --namespace helm-space</pre> | DevOps 工程師 | 

## 相關資源
<a name="deploy-kubernetes-resources-and-packages-using-amazon-eks-and-a-helm-chart-repository-in-amazon-s3-resources"></a>
+ [HELM 文件](https://helm.sh/docs/)
+ [helm-s3 外掛程式 (MIT 授權）](https://github.com/hypnoglow/helm-s3.git)
+ [HELM 用戶端二進位](https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3)
+ [Amazon EKS 文件](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)

## 附件
<a name="attachments-d3f993e6-4d96-4cb9-a075-c4debe431fd7"></a>

若要存取與本文件相關聯的其他內容，請解壓縮下列檔案： [attachment.zip](samples/p-attach/d3f993e6-4d96-4cb9-a075-c4debe431fd7/attachments/attachment.zip)