使用 Amazon EKS 和 Amazon S3 中的 Helm 图表存储库部署 Kubernetes 资源和软件包 - AWS Prescriptive Guidance

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

使用 Amazon EKS 和 Amazon S3 中的 Helm 图表存储库部署 Kubernetes 资源和软件包

由 Sagar Panigrahi (AWS) 编写

环境:PoC 或试点

技术:容器和微服务; DevOps

Amazon Web Services:Amazon EKS

Summary

此模式可帮助您高效管理 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 图表存储库,如此整个组织的开发人员即可集中管理和访问此类图表。

先决条件和限制

先决条件

  • 具有虚拟私有云(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 管道

限制

  • 目前不支持升级、删除或管理自定义资源定义 (CRD)。

  • 如果使用的是引用 CRD 的资源,则必须单独安装 CRD(图表外)。

产品版本

  • Helm v3.6.3

架构

目标技术堆栈

  • Amazon EKS

  • Amazon VPC

  • Amazon S3

  • 源代码管理

  • Helm

  • Kubectl

目标架构

包含客户端、外部存储库、Amazon S3 中的 Helm 图表存储库以及带有 EKS 控制平面和 EKS 数据平面的 VPC 的架构。

自动化和扩展

  • AWS CloudFormation 可用于自动创建基础设施。有关更多信息,请参阅亚马逊 EKS 文档 CloudFormation中的使用 AWS 创建亚马逊 EKS 资源

  • Helm 将整合至您现有的 CI/CD 自动化工具中,以自动执行 Helm 图表的打包和版本控制(超出了此模式范围)。

  • GitVersion 或者 Jenkins 内部版本号可用于自动化图表的版本控制。

工具

工具

  • Amazon EKS – Amazon Elastic Kubernetes Service (Amazon EKS) 是一项托管服务,可用来在 AWS 上运行 Kubernetes,而无需支持或维护您自己的 Kubernetes 控制面板。Kubernetes 是一个用于实现容器化应用程序的部署、扩缩和管理自动化的开源系统。

  • Helm – Helm 是 Kubernetes 的软件包管理器,可帮助您在 Kubernetes 集群上安装和管理应用程序。

  • Amazon S3 – Amazon Simple Storage Service (Amazon S3) 是一项面向互联网的存储服务。您可以通过 Amazon S3 随时在 Web 上的任何位置存储和检索的任意大小的数据。

  • Kubectl – Kubectl 是针对 Kubernetes 集群运行命令的命令行实用程序。

代码

示例代码附后。

操作说明

任务描述所需技能

安装 Helm 客户端。

若要在本地系统上下载并安装 Helm 客户端,请使用以下命令。 

sudo curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
DevOps 工程师

验证 Helm 安装

若要验证 Helm 是否与 Amazon EKS 集群中的 Kubernetes API 服务器通信,请运行helm version

DevOps 工程师
任务描述所需技能

为 NGINX 创建 Helm 图表。

若要在客户端计算机上创建名为my-nginx的 Helm 图表,请运行helm create my-nginx

DevOps 工程师

查看图表结构。

若要查看图表的结构,请运行树命令 tree my-nginx/

DevOps 工程师

在图表中停用服务账户创建。

values.yamlserviceAccount部分下,将create密钥设置为false。将其关闭,原因在于无需为此模式创建服务账户。

DevOps 工程师

验证 (lint) 修改后的图表是否存在语法错误。

若要验证将图表安装至目标集群之前图表是否存在任何语法错误,请运行 helm lint my-nginx/

DevOps 工程师

安装部署 Kubernetes 资源的图表。

若要运行 Helm 图表 安装程序,请使用以下命令。 

helm install --name my-nginx-release --debug my-nginx/ --namespace helm-space

可选 debug标志在安装过程中输出所有调试消息。namespace标志指定将在其中创建此图表的资源部分的命名空间。

DevOps 工程师

查看 Amazon EKS 集群中的资源。

若要查看 helm-space命名空间中的 Helm 图表部分创建的资源,请使用以下命令。 

kubectl get all -n helm-space
DevOps 工程师
任务描述所需技能

修改并升级版本。

若要修改图表,请在values.yaml中将replicaCount值更改为2。然后通过运行以下命令升级已安装发布:

helm upgrade my-nginx-release my-nginx/ --namespace helm-space
DevOps 工程师

查看 Helm 版本的历史记录。

若要列出使用 Helm 安装的特定版本的所有修订版本,请运行以下命令。 

helm history my-nginx-release
DevOps 工程师

查看特定修订版的详细信息。

在切换或回滚至工作版本前以及在安装修订版前进行额外验证前,请使用以下命令查看已传递至每个修订版本的值。

helm get --revision=2 my-nginx-release
DevOps 工程师

回滚至先前版本。

若要回滚至以前的修订版,请使用以下命令。 

helm rollback my-nginx-release 1

此示例正在回滚至修订版号 1。

DevOps 工程师
任务描述所需技能

为 Helm 图表创建 S3 存储桶。

创建唯一 S3 存储桶。在存储桶中,创建一个名为 charts的文件夹。此模式中的示例使用 s3://my-helm-charts/charts作为目标图表存储库。

云管理员

安装适用于 Amazon S3 的 Helm 插件。

若要在客户端计算机上安装 helm-s3 插件,请使用以下命令。 

helm plugin install https://github.com/hypnoglow/helm-s3.git --version 0.10.0

请注意:提供使用插件版本 0.9.0 及更高版本的 Helm V3 支持。

DevOps 工程师

初始化 Amazon S3 Helm 存储库。

若要将目标文件夹初始化为 Helm 存储库,请使用以下命令。 

helm S3 init s3://my-helm-charts/charts

该命令在目标系统中创建 index.yaml文件,用于跟踪存储在该位置的所有图表信息。

DevOps 工程师

将 Amazon S3 存储库添加至 Helm。

要向客户端计算机中添加存储库,请使用以下命令。

helm repo add my-helm-charts s3://my-helm-charts/charts

此命令将别名添加至 Helm 客户端计算机中的目标存储库。

DevOps 工程师

查看存储库列表。

若要查看 Helm 客户端计算机中的存储库列表,请运行 helm repo list

DevOps 工程师
任务描述所需技能

打包图表。

若要打包您创建的 my-nginx图表,请运行helm package ./my-nginx/。该命令将 my-nginx图表文件夹的所有内容打包成存档文件,该文件使用 Chart.yaml文件中提到的版本号命名。

DevOps 工程师

将包存储至 Amazon S3 Helm 存储库。

若要将数据包上传至 Amazon S3 中的 Helm 存储库,请使用正确的 .tgz文件名运行以下命令。

helm s3 push ./my-nginx-0.1.0.tgz my-helm-charts
DevOps 工程师

搜索 Helm 图表。

若要确认图表同时出现在本地和 Amazon S3 的 Helm 存储库中,请运行以下命令。

helm search repo my-nginx
DevOps 工程师
任务描述所需技能

修改并打包图表。

values.yaml中,将replicaCount的值设为1。然后通过运行helm package ./my-nginx/来打包图表,这次是将版本Chart.yaml更改为0.1.1。 

最好使用诸如 CI/CD 管道中的 Jenkins 内部版本号 GitVersion 之类的工具通过自动化来更新版本控制。自动生成的版本号超出了这种模式范围。

DevOps 工程师

将新版本推送至 Amazon S3 中的 Helm 存储库。

若要将版本为 0.1.1 的新软件包推送至 Amazon S3 中的 my-helm-chartsHelm 存储库,请运行以下命令。

helm s3 push ./my-nginx-0.1.1.tgz my-helm-charts
DevOps 工程师
任务描述所需技能

搜索 my-nginx 图表的所有版本。

若要查看图表的所有可用版本,请使用 --versions标志运行以下命令:

helm search repo my-nginx --versions

如果没有标志,Helm 默认会显示图表的最新上传版本。

DevOps 工程师

从 Amazon S3 Helm 存储库安装图表。

上一个任务的搜索结果显示了 my-nginx图表的多个版本。若要从 Amazon S3 Helm 存储库安装新版本 (0.1.1),请使用以下命令。

helm upgrade my-nginx-release my-helm-charts/my-nginx --version 0.1.1 --namespace helm-space
DevOps 工程师

相关资源

附件

要访问与此文档相关联的其他内容,请解压以下文件:attachment.zip