

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

# 使用 Amazon EKS 和 Amazon S3 中的 Helm 图表存储库部署 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*

## Summary
<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 图表可用于定义、安装和升级复杂的 Kubernetes 应用程序。图表可以版本控制，并存储在 Helm 存储库中，从而缩短停机期间的平均恢复时间 (MTTR)。 

此模式对 Kubernetes 集群使用了 Amazon Elastic Kubernetes Service (Amazon EKS)。其使用 Amazon Simple Storage Service (Amazon S3) 作为 Helm 图表存储库，如此整个组织的开发人员即可集中管理和访问此类图表。

## 先决条件和限制
<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) Account
+ Amazon EKS 集群 
+ 在 Amazon EKS 集群中设置并准备处理工作负载的工作节点
+ 在客户端计算机中为目标集群配置 Amazon EKS kubeconfig 文件的 Kubectl
+ 用于创建 S3 存储桶的 AWS Identity and Access Management (IAM) 访问权限
+ 通过客户端计算机访问 Amazon S3 的 IAM（编程或角色）
+ 源代码管理和 CI/CD 管道

**限制**
+ 目前不支持升级、删除或管理自定义资源定义 (CRDs)。
+ 如果使用的是引用 CRD 的资源，则必须单独安装 CRD（图表外）。

**产品版本**
+ Helm v3.6.3

## 架构
<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 图表存储库。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d3f993e6-4d96-4cb9-a075-c4debe431fd7/images/2f09f7bb-440a-4c4b-b29f-08d136d1ada4.png)


 

**自动化和扩展**
+ AWS CloudFormation 可用于自动创建基础设施。有关更多信息，请参阅 A [mazon EKS 文档 CloudFormation中的使用 AWS 创建亚马逊 EKS 资源](https://docs.aws.amazon.com/eks/latest/userguide/creating-resources-with-cloudformation.html)。
+ Helm 将整合到您现有的 CI/CD 自动化工具中，以自动化 Helm 图表的打包和版本控制（超出此模式的范围）。
+ 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 集群运行命令的命令行实用程序。

**代码**

示例代码附后。

## 操作说明
<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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 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 图表
<a name="create-and-install-a-helm-chart-in-the-amazon-eks-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 NGINX 创建 Helm 图表。 | 若要在客户端计算机上创建名为 `my-nginx` 的 Helm 图表，请运行 `helm create my-nginx`。 | DevOps 工程师 | 
| 查看图表结构。 | 若要查看图表的结构，请运行树命令 `tree my-nginx/`。 | DevOps 工程师 | 
| 在图表中停用服务账户创建。 | 在 `values.yaml` 的 `serviceAccount` 部分下，将 `create` 密钥设置为 `false`。将其关闭，原因在于无需为此模式创建服务账户。 | DevOps 工程师 | 
| 验证 (lint) 修改后的图表是否存在语法错误。 | 若要验证将图表安装至目标集群之前图表是否存在任何语法错误，请运行 `helm lint my-nginx/`。 | DevOps 工程师 | 
| 安装部署 Kubernetes 资源的图表。 | 若要运行 Helm 图表 安装程序，请使用以下命令。 <pre>helm install --name my-nginx-release --debug my-nginx/ --namespace helm-space </pre><br />可选 `debug` 标志在安装过程中输出所有调试消息。`namespace` 标志指定将在其中创建此图表的资源部分的命名空间。 | DevOps 工程师 | 
| 查看 Amazon EKS 集群中的资源。 | 若要查看 `helm-space` 命名空间中的 Helm 图表部分创建的资源，请使用以下命令。 <pre>kubectl get all -n helm-space</pre> | DevOps 工程师 | 

### 回滚至 Kubernetes 应用程序的先前版本
<a name="roll-back-to-a-previous-version-of-a-kubernetes-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改并升级版本。 | 若要修改图表，请在 `values.yaml` 中将 `replicaCount` 值更改为 `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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 Helm 图表创建 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 />请注意：提供使用插件版本 0.9.0 及更高版本的 Helm V3 支持。 | 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 打包图表。 | 若要打包您创建的 `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 图表。 | 若要确认图表同时出现在本地和 Amazon S3 的 Helm 存储库中，请运行以下命令。<pre>helm search repo my-nginx</pre> | DevOps 工程师 | 

### 修改、版本化和打包图表
<a name="modify-version-and-package-a-chart"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改并打包图表。 | 将 `values.yaml` 中，将 `replicaCount` 的值设为 `1`。然后通过运行 `helm package ./my-nginx/` 来打包图表，这次是将版本 `Chart.yaml` 更改为 `0.1.1`。 <br />理想情况下，版本控制是在管道中使用诸如 GitVersion 或 Jenkins 内部版本号之类的工具通过自动化进行 CI/CD 更新。自动生成的版本号超出了这种模式范围。 | 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 搜索 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)