跳到主要内容
版本:3.22.0

Helm 高级技术

本节介绍使用 Helm 的各种高级特性和技术。这些内容主要面向希望对 chart 和 release 进行高度自定义和操作的 Helm 高级用户。每个高级特性都有各自的权衡利弊,因此使用时需要具备深厚的 Helm 知识并谨慎操作。换言之,请谨记 Peter Parker 原则。

后置渲染​

后置渲染允许 chart 安装者在 Helm 安装渲染后的 manifest 之前,手动操作、配置或验证这些 manifest。这使得有高级配置需求的用户可以使用 kustomize 等工具来应用配置更改,而无需 fork 公共 chart 或要求 chart 维护者为软件指定所有配置选项。此外,还有一些场景用于在企业环境中注入常用工具和 sidecar,或在部署前对 manifest 进行分析。

前提条件​

  • Helm 3.1+

使用​

后置渲染器可以是任意可执行文件,只要能在 STDIN 接收渲染后的 Kubernetes manifest 并在 STDOUT 返回有效的 Kubernetes manifest 即可。遇到失败时应返回非零退出码。这是两个组件之间唯一的"API",为后置渲染过程提供了极大的灵活性。

后置渲染器可以与 install、upgrade 和 template 命令一起使用。使用后置渲染器时,通过 --post-renderer 参数指定渲染器可执行文件的路径:

$ helm install mychart stable/wordpress --post-renderer ./path/to/executable

如果路径中不包含任何分隔符,会在 $PATH 中搜索;否则会将相对路径解析为完整路径。

如果需要使用多个后置渲染器,可以在脚本中调用它们,或者在构建的二进制工具中组合调用。在 bash 中,只需像 renderer1 | renderer2 | renderer3 这样简单地串联即可。

可以在这里查看使用 kustomize 作为后置渲染器的示例。

注意事项​

使用后置渲染器时,有几点需要注意。最重要的是,当使用后置渲染器时,所有修改该 release 的人必须使用相同的渲染器,以确保构建的可重复性。此功能允许用户切换或停止使用渲染器,但应谨慎操作,以避免意外修改或数据丢失。

另一个重要注意事项是安全性。如果你使用后置渲染器,应确保它来自可信来源(任何可执行文件都应如此)。不建议使用不受信任或未经验证的渲染器,因为它们可以完全访问渲染后的模板,而这些模板通常包含敏感数据。

自定义后置渲染器​

在 Go SDK 中使用时,后置渲染器可以提供更大的灵活性。任何后置渲染器只需实现以下 Go 接口:

type PostRenderer interface {
// Run expects a single buffer filled with Helm rendered manifests. It
// expects the modified results to be returned on a separate buffer or an
// error if there was an issue or failure while running the post render step
Run(renderedManifests *bytes.Buffer) (modifiedManifests *bytes.Buffer, err error)
}

有关 Go SDK 的更多信息,请参阅 Go SDK 部分。

Go SDK​

Helm 3 引入了全新重构的 Go SDK,为构建基于 Helm 的软件和工具提供更好的体验。完整文档可在 Go SDK 部分查看。

后端存储​

Helm 3 将默认的 release 信息存储方式更改为存储在 release 所在命名空间中的 Secret。Helm 2 默认将 release 信息作为 ConfigMap 存储在 Tiller 实例所在的命名空间中。以下小节介绍如何配置不同的存储后端。配置基于 HELM_DRIVER 环境变量,可设置为以下值之一:[configmap, secret, sql]。

ConfigMap 后端存储​

要启用 ConfigMap 后端,需要将环境变量 HELM_DRIVER 设置为 configmap。

可以在 shell 中如下设置:

export HELM_DRIVER=configmap

如果要从默认后端切换到 ConfigMap 后端,需要自行进行迁移。可以使用以下命令获取 release 信息:

kubectl get secret --all-namespaces -l "owner=helm"

生产环境说明:release 信息包含 chart 和 values 文件的内容,因此可能包含需要防止未授权访问的敏感数据(如密码、私钥和其他凭证)。在管理 Kubernetes 授权时(例如使用 RBAC),可能会授予 ConfigMap 资源较宽泛的访问权限,同时限制对 Secret 资源的访问。例如,默认的面向用户的角色"view"授予大多数资源的访问权限,但不包括 Secret。此外,Secret 数据可以配置为加密存储。如果决定切换到 ConfigMap 后端,请注意这一点,因为它可能会暴露应用程序的敏感数据。

SQL 后端存储​

这是一个 beta 版本的 SQL 存储后端,将 release 信息存储在 SQL 数据库中。

如果 release 信息超过 1MB,这种存储后端会特别有用(此时由于 Kubernetes 底层 etcd 键值存储的内部限制,无法存储在 ConfigMap/Secret 中)。

要启用 SQL 后端,需要部署 SQL 数据库并将环境变量 HELM_DRIVER 设置为 sql。数据库详细信息通过环境变量 HELM_DRIVER_SQL_CONNECTION_STRING 设置。

可以在 shell 中如下设置:

export HELM_DRIVER=sql
export HELM_DRIVER_SQL_CONNECTION_STRING=postgresql://helm-postgres:5432/helm?user=helm&password=changeme

注意:目前仅支持 PostgreSQL。

生产环境说明:建议:

  • 确保数据库可用于生产环境。对于 PostgreSQL,请参阅 Server Administration 文档了解更多详情
  • 启用权限管理,以镜像 Kubernetes RBAC 来控制 release 信息的访问权限

如果要从默认后端切换到 SQL 后端,需要自行进行迁移。可以使用以下命令获取 release 信息:

kubectl get secret --all-namespaces -l "owner=helm"