本文介绍了Helm,一个简化Kubernetes应用程序部署的软件包管理器,包括其工作原理、charts的使用、配置和部署流程,以及创建自定义charts的方法。
简介
将应用程序部署到 Kubernetes(一个功能强大且流行的容器编排系统)可能会很复杂。设置单个应用程序可能涉及创建多个相互依赖的 Kubernetes 资源,例如 pods、services、deployments 和 replicasets,每个资源都需要编写详细的 YAML 清单文件。
Helm 是 Kubernetes 的一个软件包管理器,允许开发人员和运维人员更轻松地将应用程序和服务打包、配置和部署到 Kubernetes 集群上。
Helm 现在是一个官方的 Kubernetes 项目,并且是云原生计算基金会的一部分,该基金会是一个支持 Kubernetes 生态系统内外的开源项目的非营利组织。
在本文中,我们将概述 Helm 及其使用的各种抽象,以简化将应用程序部署到 Kubernetes。如果您对 Kubernetes 还不熟悉,建议先阅读《Kubernetes 简介》以熟悉基本概念。
如果您正在寻找托管的 Kubernetes 主机服务,请查看我们为增长而构建的简单、托管的 Kubernetes 服务。
Helm 概述
几乎每种编程语言和操作系统都有自己的软件包管理器,以帮助安装和维护软件。Helm 提供了与许多您可能已经熟悉的软件包管理器(如 Debian 的 apt
或 Python 的 pip
)相同的基本功能集。
Helm 可以:
- 安装软件。
- 自动安装软件依赖项。
- 升级软件。
- 配置软件部署。
- 从存储库获取软件包。
Helm 通过以下组件提供这些功能:
- 一个命令行工具
helm
,它为所有 Helm 功能提供用户界面。 - 一个伴随的服务器组件
tiller
,它运行在您的 Kubernetes 集群上,监听来自helm
的命令,并处理集群上软件发布的配置和部署。 - Helm 打包格式,称为 charts。
- 一个官方的精选 charts 存储库,其中包含流行的开源软件项目的预打包 charts。
接下来我们将更详细地研究 charts 格式。
Charts
Helm 软件包称为 charts,它们由一些 YAML 配置文件和一些模板组成,这些模板被渲染为 Kubernetes 清单文件。以下是 chart 的基本目录结构:
package-name/ charts/ templates/ Chart.yaml LICENSE README.md requirements.yaml values.yaml
这些目录和文件具有以下功能:
- charts/: 可以将手动管理的 chart 依赖项放在此目录中,尽管通常最好使用
requirements.yaml
动态链接依赖项。 - templates/: 此目录包含模板文件,这些文件与配置值(来自
values.yaml
和命令行)组合在一起,并渲染为 Kubernetes 清单。模板使用 Go 编程语言的模板格式。 - Chart.yaml: 一个包含有关 chart 的元数据的 YAML 文件,例如 chart 名称和版本、维护者信息、相关网站和搜索关键字。
- LICENSE: chart 的纯文本许可证。
- README.md: 包含 chart 用户信息的自述文件。
- requirements.yaml: 列出 chart 依赖项的 YAML 文件。
- values.yaml: chart 的默认配置值的 YAML 文件。
helm
命令可以从本地目录安装 chart,也可以从打包成 .tar.gz
格式的此目录结构自动下载并安装 chart。这些打包的 charts 也可以从 chart 存储库或 repos 自动下载并安装。
接下来我们将看一下 chart 存储库。
Chart 存储库
Helm chart 存储库是一个简单的 HTTP 站点,提供 index.yaml
文件和 .tar.gz
打包的 charts。helm
命令有可用的子命令来帮助打包 charts 并创建所需的 index.yaml
文件。这些文件可以由任何 Web 服务器、对象存储服务或 GitHub Pages 等静态站点主机提供。
Helm 预先配置了一个名为 stable 的默认 chart 存储库。此存储库指向 https://kubernetes-charts.storage.googleapis.com
上的 Google 存储桶。stable 存储库的源代码可以在 GitHub 上的 helm/charts Git 存储库中找到。
可以使用 helm repo add
命令添加其他存储库。一些流行的备用存储库包括:
- 官方的 incubator 存储库,其中包含尚未准备好用于 stable 的 charts。有关使用 incubator 的说明可以在官方 Helm charts GitHub 页面上找到。
- Bitnami Helm Charts,提供一些在官方 stable 存储库中未涵盖的 charts。
无论是安装您本地开发的 chart,还是从存储库中安装 chart,您都需要为您的特定设置进行配置。接下来我们将研究配置。
Chart 配置
chart 通常在其 values.yaml
文件中具有默认配置值。一些应用程序可能可以使用默认值完全部署,但通常您需要覆盖一些配置以满足您的需求。
可以配置的值由 chart 的作者确定。有些用于配置 Kubernetes 原语,有些可能传递到底层容器以配置应用程序本身。
以下是一些示例值的片段:
service: type: ClusterIP port: 3306
这些是用于配置 Kubernetes Service 资源的选项。您可以使用 helm inspect values chart-name
来转储 chart 的所有可用配置值。
这些值可以通过编写自己的 YAML 文件并在运行 helm install
时使用它们来进行覆盖,也可以通过使用 --set
标志在命令行上单独设置选项来进行覆盖。您只需要指定您想要从默认值更改的那些值。
使用特定配置部署的 Helm chart 称为 release。接下来我们将讨论发布。
发布版本
在安装图表时,Helm 将图表的模板与用户指定的配置和values.yaml
中的默认配置合并。这些被渲染成 Kubernetes 清单,然后通过 Kubernetes API 部署。这样就创建了一个 发布版本,即特定图表的特定配置和部署。
发布版本的概念很重要,因为您可能希望在集群上部署同一个应用程序多次。例如,您可能需要具有不同配置的多个 MySQL 服务器。
您可能还希望单独升级图表的不同实例。也许一个应用程序准备好升级 MySQL 服务器,但另一个应用程序没有准备好。使用 Helm,您可以单独升级每个发布版本。
您可能会升级一个发布版本,因为其图表已更新,或者因为您想要更新发布版本的配置。无论哪种方式,每次升级都会创建发布版本的新 修订版本,并且 Helm 将允许您轻松回滚到以前的修订版本,以防出现问题。
创建图表
如果找不到要部署的软件的现有图表,您可能希望创建自己的图表。Helm 可以使用 helm create chart-name
命令输出图表目录的脚手架。这将创建一个包含我们在上面的图表部分中讨论的文件和目录的文件夹。
然后,您需要在 Chart.yaml
中填写图表的元数据,并将 Kubernetes 清单文件放入 templates
目录中。然后,您需要从清单中提取相关配置变量,并将其放入 values.yaml
中,然后再使用模板系统将其包含回清单模板中。
helm
命令有许多可用的子命令,可帮助您测试、打包和提供图表。有关更多信息,请阅读有关开发图表的官方 Helm 文档。
结论
在本文中,我们回顾了 Helm,Kubernetes 的包管理器。我们概述了 Helm 架构和各个 helm
和 tiller
组件,详细介绍了 Helm 图表格式,并查看了图表存储库。我们还深入探讨了如何配置 Helm 图表以及如何将配置和图表组合并部署为 Kubernetes 集群上的发布版本。最后,我们简要介绍了在没有合适图表可用时创建图表的基础知识。
有关 Helm 的更多信息,请查看官方 Helm 文档。要找到 Helm 的官方图表,请查看 GitHub 上的官方 helm/charts Git 存储库。