使用 Helm

本指南介绍了使用 Helm 在 Kubernetes 集群上管理软件包的基本知识。它假定您已经 安装 了 Helm 客户端。

如果您只是想运行一些快速命令,您可能希望从 快速入门指南 开始。本章介绍了 Helm 命令的细节,并解释了如何使用 Helm。

三大概念

一个 _图表_ 是一个 Helm 软件包。它包含在 Kubernetes 集群中运行应用程序、工具或服务所需的所有资源定义。可以把它看作是 Kubernetes 等效于 Homebrew 公式、Apt dpkg 或 Yum RPM 文件。

一个 _仓库_ 是可以收集和共享图表的场所。它类似于 Perl 的 CPAN 存档Fedora 包数据库,但针对 Kubernetes 软件包。

一个 _发布_ 是在 Kubernetes 集群中运行的图表的实例。一个图表通常可以多次安装到同一个集群中。每次安装时,都会创建一个新的 _发布_。例如,考虑一个 MySQL 图表。如果您想要在集群中运行两个数据库,可以安装该图表两次。每个数据库将有自己的 _发布_,反过来将有自己的 _发布名称_。

牢记这些概念,我们现在可以这样解释 Helm

Helm 将 _图表_ 安装到 Kubernetes 中,为每次安装创建一个新的 _发布_。要查找新的图表,您可以搜索 Helm 图表 _仓库_。

'helm search':查找图表

Helm 带有一个强大的搜索命令。它可以用来搜索两种不同类型的源

  • helm search hub 搜索 Artifact Hub,它列出了来自数十个不同仓库的 Helm 图表。
  • helm search repo 搜索您已添加到本地 Helm 客户端(使用 helm repo add)的仓库。此搜索是在本地数据上进行的,不需要任何公共网络连接。

您可以通过运行 helm search hub 来查找公开可用的图表

$ helm search hub wordpress
URL                                                 CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress        7.6.7         5.2.4       Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.6.3        v0.6.3      Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.7.1        v0.7.1      A Helm chart for deploying a WordPress site on ...

以上搜索 Artifact Hub 上所有 wordpress 图表。

没有过滤器,helm search hub 将向您显示所有可用的图表。

使用 helm search repo,您可以查找已添加的仓库中的图表名称

$ helm repo add brigade https://brigadecore.github.io/charts
"brigade" has been added to your repositories
$ helm search repo brigade
NAME                          CHART VERSION APP VERSION DESCRIPTION
brigade/brigade               1.3.2         v1.2.1      Brigade provides event-driven scripting of Kube...
brigade/brigade-github-app    0.4.1         v0.2.1      The Brigade GitHub App, an advanced gateway for...
brigade/brigade-github-oauth  0.2.0         v0.20.0     The legacy OAuth GitHub Gateway for Brigade
brigade/brigade-k8s-gateway   0.1.0                     A Helm chart for Kubernetes
brigade/brigade-project       1.0.0         v1.0.0      Create a Brigade project
brigade/kashti                0.4.0         v0.4.0      A Helm chart for Kubernetes

Helm 搜索使用模糊字符串匹配算法,因此您可以键入部分单词或短语

$ helm search repo kash
NAME            CHART VERSION APP VERSION DESCRIPTION
brigade/kashti  0.4.0         v0.4.0      A Helm chart for Kubernetes

搜索是查找可用软件包的好方法。找到要安装的软件包后,可以使用 helm install 安装它。

'helm install':安装软件包

要安装新软件包,请使用 helm install 命令。最简单的方法是使用两个参数:您选择的发布名称和要安装的图表名称。

$ helm install happy-panda bitnami/wordpress
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    happy-panda-wordpress.default.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

现在 wordpress 图表已安装。请注意,安装图表会创建一个新的 _发布_ 对象。上面的发布名为 happy-panda。(如果您希望 Helm 为您生成一个名称,请省略发布名称并使用 --generate-name。)

在安装过程中,helm 客户端将打印关于创建了哪些资源、发布的状态以及是否需要或应该执行其他配置步骤的有用信息。

Helm 按以下顺序安装资源

  • 命名空间
  • 网络策略
  • 资源配额
  • 限制范围
  • Pod 安全策略
  • Pod 扰乱预算
  • 服务帐户
  • 秘密
  • 秘密列表
  • 配置图
  • 存储类别
  • 持久卷
  • 持久卷声明
  • 自定义资源定义
  • 集群角色
  • 集群角色列表
  • 集群角色绑定
  • 集群角色绑定列表
  • 角色
  • 角色列表
  • 角色绑定
  • 角色绑定列表
  • 服务
  • 守护进程集
  • Pod
  • 副本控制器
  • 副本集
  • 部署
  • 水平 Pod 自动缩放器
  • 有状态集
  • 作业
  • CronJob
  • Ingress
  • APIService

Helm 不会等到所有资源都运行完毕才退出。许多图表需要大小超过 600MB 的 Docker 镜像,并且可能需要很长时间才能安装到集群中。

要跟踪发布的状态或重新读取配置信息,可以使用 helm status

$ helm status happy-panda
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    happy-panda-wordpress.default.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

以上显示了您发布的当前状态。

在安装之前自定义图表

按照我们这里的方式安装只会使用该图表的默认配置选项。很多时候,您需要自定义图表以使用您喜欢的配置。

要查看图表上哪些选项可配置,请使用 helm show values

$ helm show values bitnami/wordpress
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
#   imageRegistry: myRegistryName
#   imagePullSecrets:
#     - myRegistryKeySecretName
#   storageClass: myStorageClass

## Bitnami WordPress image version
## ref: https://hub.docker.com/r/bitnami/wordpress/tags/
##
image:
  registry: docker.io
  repository: bitnami/wordpress
  tag: 5.6.0-debian-10-r35
  [..]

然后,您可以在 YAML 格式的文件中覆盖这些设置中的任何一个,然后在安装过程中传递该文件。

$ echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
$ helm install -f values.yaml bitnami/wordpress --generate-name

以上将创建一个默认的 MariaDB 用户,用户名为 user0,并授予该用户访问新创建的 user0db 数据库的权限,但将接受该图表的其他所有默认值。

在安装过程中传递配置数据有两种方法

  • --values(或 -f):指定一个包含覆盖的 YAML 文件。这可以多次指定,最右边的文件将优先。
  • --set:在命令行中指定覆盖。

如果同时使用两者,--set 值将合并到 --values 中,并具有更高的优先级。使用 --set 指定的覆盖将持久保存到一个秘密中。可以使用 helm get values <release-name> 查看已 --set 的值。可以通过运行 helm upgrade 并指定 --reset-values 来清除已 --set 的值。

--set 的格式和限制

--set 选项接受零个或多个名称/值对。最简单的方法是像这样使用它:--set name=value。它的 YAML 等效项是

name: value

多个值用 , 字符分隔。因此 --set a=b,c=d 变成

a: b
c: d

支持更复杂的表达式。例如,--set outer.inner=value 转换为

outer:
  inner: value

列表可以通过将值括在 {} 中来表示。例如,--set name={a, b, c} 转换为

name:
  - a
  - b
  - c

某些名称/键可以设置为 null 或空数组 []。例如,--set name=[],a=null 转换为

name:
  - a
  - b
  - c
a: b

name: []
a: null

从 Helm 2.5.0 开始,可以使用数组索引语法访问列表项。例如,--set servers[0].port=80 变成

servers:
  - port: 80

可以以这种方式设置多个值。行 --set servers[0].port=80,servers[0].host=example 变成

servers:
  - port: 80
    host: example

有时您需要在 --set 行中使用特殊字符。可以使用反斜杠转义字符;--set name=value1\,value2 将变成

name: "value1,value2"

类似地,您也可以转义点序列,这在图表使用 toYaml 函数解析注释、标签和节点选择器时可能很有用。--set nodeSelector."kubernetes\.io/role"=master 的语法变成

nodeSelector:
  kubernetes.io/role: master

使用 --set 表达深度嵌套的数据结构可能很困难。图表设计者在设计 values.yaml 文件的格式时应考虑 --set 的用法(阅读有关 值文件 的更多信息)。

更多安装方法

helm install 命令可以从多个来源安装

  • 图表仓库(如上所述)
  • 本地图表存档(helm install foo foo-0.1.1.tgz
  • 解压缩的图表目录(helm install foo path/to/foo
  • 完整 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz

'helm upgrade' 和 'helm rollback':升级发布,并在失败时恢复

当图表的新版本发布,或者当您想要更改发布的配置时,可以使用 helm upgrade 命令。

升级会获取现有发布并根据您提供的信息进行升级。由于 Kubernetes 图表可能很大很复杂,Helm 会尝试执行最不侵入性的升级。它只会更新自上次发布以来已更改的内容。

$ helm upgrade -f panda.yaml happy-panda bitnami/wordpress

在上面的情况下,happy-panda 发布使用相同的图表进行升级,但使用了一个新的 YAML 文件

mariadb.auth.username: user1

我们可以使用helm get values来查看新设置是否生效。

$ helm get values happy-panda
mariadb:
  auth:
    username: user1

helm get命令是用于查看集群中发布版本的实用工具。正如我们在上面看到的,它显示了我们从panda.yaml中部署到集群的新值。

现在,如果在发布过程中出现计划外的情况,可以使用helm rollback [RELEASE] [REVISION]轻松回滚到之前的版本。

$ helm rollback happy-panda 1

上述命令将 happy-panda 回滚到它的第一个发布版本。发布版本是增量修订。每次安装、升级或回滚时,修订号都会增加 1。第一个修订号始终为 1。我们可以使用helm history [RELEASE]查看特定发布版本的修订号。

安装/升级/回滚的实用选项

您可以指定其他一些实用选项来自定义 Helm 在安装/升级/回滚期间的行为。请注意,这不是 CLI 标志的完整列表。要查看所有标志的说明,只需运行helm <command> --help

  • --timeout:一个Go 持续时间值,用于等待 Kubernetes 命令完成。默认为5m0s
  • --wait:等待所有 Pod 进入就绪状态、PVC 绑定、Deployment 拥有最小(Desired 减去 maxUnavailable)数量的就绪 Pod 以及 Service 拥有 IP 地址(如果存在 LoadBalancer,则还包括 Ingress)后,才会将发布版本标记为成功。它将等待--timeout值的时间。如果达到超时时间,发布版本将被标记为FAILED。注意:在 Deployment 设置了replicas为 1 且 maxUnavailable 未设置为 0 作为滚动更新策略一部分的情况下,--wait将返回就绪状态,因为它已满足就绪状态下的最小 Pod 条件。
  • --no-hooks:此选项将跳过运行命令的钩子
  • --recreate-pods(仅适用于upgraderollback):此标志将导致所有 Pod 被重新创建(除了属于 Deployment 的 Pod)。(已在 Helm 3 中弃用)

'helm uninstall':卸载发布版本

当需要从集群中卸载发布版本时,请使用helm uninstall命令

$ helm uninstall happy-panda

这将从集群中删除发布版本。您可以使用helm list命令查看当前部署的所有发布版本

$ helm list
NAME            VERSION UPDATED                         STATUS          CHART
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0

从上面的输出中,我们可以看到happy-panda发布版本已被卸载。

在之前的 Helm 版本中,当发布版本被删除时,它的删除记录会保留。在 Helm 3 中,删除操作也会删除发布版本记录。如果您希望保留删除的发布版本记录,请使用helm uninstall --keep-history。使用helm list --uninstalled只会显示使用--keep-history标志卸载的发布版本。

helm list --all标志将显示 Helm 保留的所有发布版本记录,包括失败或已删除项目的记录(如果指定了--keep-history

$  helm list --all
NAME            VERSION UPDATED                         STATUS          CHART
happy-panda     2       Wed Sep 28 12:47:54 2016        UNINSTALLED     wordpress-10.4.5.6.0
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
kindred-angelf  2       Tue Sep 27 16:16:10 2016        UNINSTALLED     alpine-0.1.0

请注意,由于发布版本现在默认情况下会被删除,因此无法再回滚已卸载的资源。

'helm repo':使用仓库

Helm 3 不再附带默认图表仓库。helm repo命令组提供用于添加、列出和删除仓库的命令。

您可以使用helm repo list查看已配置的仓库

$ helm repo list
NAME            URL
stable          https://charts.helm.sh/stable
mumoshu         https://mumoshu.github.io/charts

您可以使用helm repo add添加新的仓库

$ helm repo add dev https://example.com/dev-charts

由于图表仓库经常发生变化,因此您可以随时通过运行helm repo update确保您的 Helm 客户端是最新的。

可以使用helm repo remove删除仓库。

创建您自己的图表

图表开发指南解释了如何开发您自己的图表。但您可以使用helm create命令快速入门

$ helm create deis-workflow
Creating deis-workflow

现在,./deis-workflow中有一个图表。您可以编辑它并创建您自己的模板。

在编辑图表时,您可以通过运行helm lint来验证它是否格式正确。

当需要打包图表以进行分发时,您可以运行helm package命令

$ helm package deis-workflow
deis-workflow-0.1.0.tgz

现在,该图表可以通过helm install轻松安装。

$ helm install deis-workflow ./deis-workflow-0.1.0.tgz
...

打包的图表可以加载到图表仓库中。有关详细信息,请参阅Helm 图表仓库的文档。

结论

本章介绍了helm客户端的基本使用模式,包括搜索、安装、升级和卸载。它还介绍了helm statushelm gethelm repo等实用工具命令。

有关这些命令的更多信息,请查看 Helm 的内置帮助:helm help

下一章中,我们将介绍开发图表的流程。