创建第一个Helm Chart

介绍
因此,您已经启动并运行了Kubernetes集群并设置了Helm v3.x,但是如何在其上运行应用程序呢? 本指南将引导您完成创建第一个图表的过程,解释这些软件包中包含的内容以及用于开发它们的工具。 到最后,您应该了解使用Helm将自己的应用程序交付给集群的优势。

对于具有三层体系结构的典型云原生应用程序,下图说明了如何使用Kubernetes对象对其进行描述。 在此示例中,每个层均包含一个Deployment and Service对象,并且可以另外定义ConfigMap或Secret对象。 这些对象中的每一个通常都在单独的YAML文件中定义,并被馈送到kubectl命令行工具中。

Helm图表封装了每个YAML定义,提供了在部署时进行配置的机制,并允许您定义在共享软件包时可能有用的元数据和文档。 舵在不同情况下可能有用:

查找和使用打包为Kubernetes图表的流行软件
将您自己的应用程序共享为Kubernetes图表
创建Kubernetes应用程序的可复制构建
智能管理您的Kubernetes对象定义
管理Helm软件包的发行版
让我们通过创建第一个图表来探索第二种和第三种情况。

步骤1:产生您的第一个图表
开始使用新图表的最佳方法是使用helm create命令来构建可以建立的示例。 使用此命令在新目录中创建一个名为mychart的新图表:

Helm将在您的项目中创建一个名为mychart的新目录,其结构如下所示。 让我们浏览新图表(双关语意味),以了解其工作原理。

 

模板
难题中最重要的部分是template /目录。 Helm在这里为您的服务,部署和其他Kubernetes对象找到YAML定义。 如果您已经为您的应用程序定义了,那么您所需要做的就是自己替换生成的YAML文件。 最后得到的是可以使用helm install命令部署的工作图表。

但是,值得注意的是,该目录名为模板,Helm通过Go模板渲染引擎运行该目录中的每个文件。 Helm扩展了模板语言,添加了许多实用功能来编写图表。 打开service.yaml文件以查看其外观:

这是使用模板的基本服务定义。 部署图表时,Helm会生成一个看起来更像有效服务的定义。 我们可以进行头盔安装的试运行,并启用调试以检查生成的定义:

Values
service.yaml中的模板使用了特定于Helm的对象.Chart和.Values。。前者为您的定义提供有关图表的元数据,例如名称或版本。 后一个.Values对象是Helm图表的关键元素,用于公开可以在部署时设置的配置。 该对象的默认值在values.yaml文件中定义。 尝试更改service.internalPort的默认值并执行另一个空运行,您应该发现Service中的targetPort和Deployment中的containerPort发生了变化。 这里使用service.internalPort值来确保Service和Deployment对象正确一起工作。 使用模板可以大大减少样板并简化您的定义。

如果图表的用户想要更改默认配置,则可以直接在命令行上提供替代:

对于更高级的配置,用户可以使用–values选项指定一个包含替代的YAML文件。

助手和其他功能
service.yaml模板还利用了_helpers.tpl中定义的部分,以及诸如replace之类的功能。 Helm文档对模板语言进行了更深入的介绍,介绍了在开发图表时如何使用功能,局部和流控制。

文献资料
templates /目录中的另一个有用文件是NOTES.txt文件。这是模板化的纯文本文件,在成功部署图表后会打印出该文件。正如我们在部署第一个图表时所看到的,这是简要描述使用图表的后续步骤的有用位置。由于NOTES.txt是通过模板引擎运行的,因此您可以使用模板来打印出有效的命令,以获取IP地址或从Secret对象获取密码。

元数据
如前所述,Helm图表由元数据组成,用于帮助描述应用程序是什么,定义对最低要求的Kubernetes和/或Helm版本的约束以及管理图表的版本。所有这些元数据都存在于Chart.yaml文件中。 Helm文档描述了此文件的不同字段。

步骤2:部署第一个图表
您在上一步中生成的图表被设置为运行通过Kubernetes服务公开的NGINX服务器。默认情况下,该图表将创建ClusterIP类型的服务,因此NGINX仅在群集内部公开。要从外部访问它,我们将改用NodePort类型。我们还可以设置Helm版本的名称,以便我们可以轻松地参考它。让我们继续使用helm install命令部署NGINX图表:

helm install的输出显示了发行状态的便捷摘要,创建了哪些对象以及呈现的NOTES.txt文件,以解释下一步要做什么。 运行输出中的命令以获取访问NGINX服务的URL并将其在浏览器中拉起。

如果一切顺利,您应该看到如上所示的NGINX欢迎页面。 恭喜你! 您刚刚部署了打包为Helm图表的第一个服务!

步骤3:修改图表以部署自定义服务
生成的图表将创建一个Deployment对象,该对象旨在运行默认值提供的映像。 这意味着我们要运行其他服务所需要做的就是更改values.yaml中的引用图像。

我们将更新图表以运行Docker Hub上可用的待办事项列表应用程序。 在values.yaml中,更新图像键以引用待办事项列表图像:

在开发图表时,最好在lint 中运行它,以确保遵循最佳实践并且模板格式正确。 运行helm lint命令以查看linter的运行情况:

lint没有抱怨图表有任何重大问题,所以我们很高兴。 但是,作为示例,如果设法弄错了一些东西,则短绒棉可能会输出以下内容:

这一次,lint告诉我们它无法正确解析我的values.yaml文件。 使用行号提示,我们可以轻松找到我们引入的错误的修复程序。

现在该图表再次有效,再次运行helm install来部署待办事项列表应用程序:

再次,我们可以运行NOTES中的命令来获取URL来访问我们的应用程序。

如果您已经为应用程序构建了容器,则可以通过更新默认值或部署模板将它们与图表一起运行。 请查看Bitnami文档,以获取有关对应用程序进行容器化的介绍。

第4步:打包全部共享
到目前为止,在本教程中,我们一直在使用helm install命令来安装本地的,未打包的图表。 但是,如果您希望与团队或社区共享图表,则消费者通常会从tar包中安装图表。 我们可以使用helm包来创建tar包:

Helm将使用Chart.yaml文件中定义的元数据中的名称和版本在我们的工作目录中创建一个mychart-0.1.0.tgz软件包。 用户可以通过将该软件包作为参数传递给helm install来从此软件包而不是本地目录进行安装。

仓库
为了更轻松地共享软件包,Helm内置了对从HTTP服务器安装软件包的支持。 Helm读取服务器上托管的存储库索引,该索引描述了可用的图表包及其位置。

我们可以使用helm serve命令运行本地存储库来提供图表。

现在,在单独的终端窗口中,您应该能够在本地存储库中查看图表并从此处进行安装:

要设置远程存储库,您可以按照Helm文档中的指南进行操作。

依存关系
随着打包为图表的应用程序的复杂性增加,您可能会发现需要引入诸如数据库的依赖项。 Helm允许您指定将在同一发行版中创建的子图表。 要定义依赖项,请在图表根目录中创建一个requirements.yaml文件:

与运行时语言依赖项文件(例如Python的requirements.txt)非常相似,requirements.yaml文件允许您管理图表的依赖项及其版本。 更新依赖项时,将生成一个锁定文件,以便后续获取依赖项时使用已知的有效版本。 运行以下命令以获取我们定义的MariaDB依赖项:

Helm在bitnami存储库中找到了匹配的版本,并将其提取到我图表的子图表目录中。 现在,当我们去安装图表时,我们将看到也创建了MariaDB的对象:

原文:https://docs.bitnami.com/tutorials/create-your-first-helm-chart/