使用 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
(仅适用于upgrade
和rollback
):此标志将导致所有 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 status
、helm get
和helm repo
等实用工具命令。
有关这些命令的更多信息,请查看 Helm 的内置帮助:helm help
。
在下一章中,我们将介绍开发图表的流程。