介绍
Helm是一个用于 Kubernetes 的包管理器,允许开发人员和运维人员更轻松地在 Kubernetes 集群上配置和部署应用程序。
Helm 包被称为 charts,它们包含部署和配置给定应用程序的资源定义模板,用户只需付出最少的工作就能完成部署。通过模板化,您可以通过传入变量定义来管理 chart、其设置和行为,而无需修改实际的 chart。自定义的资源定义以及对已部署定义的修改,Helm 都会自动管理。已部署的 chart,在可能的自定义情况下,被称为 release。
在本教程中,您将设置 Helm 3,并学习如何安装、升级、回滚和管理 charts 和 releases。您还将学习如何创建和打包自己的 charts,并设置 chart 仓库,这些仓库包含您可以立即安装的 charts。
先决条件
-
启用了基于角色的访问控制(RBAC)的 Kubernetes 集群。有关 releases 的更多信息,请查看 Helm releases 页面。
-
在您的本地计算机上安装了
kubectl
命令行工具,并配置为连接到您的集群。您可以在官方文档中了解更多关于安装kubectl
的信息。您可以使用以下命令测试连接性:
如果没有收到错误信息,则表示已连接到集群。如果您使用
kubectl
访问多个集群,请确保通过运行以下命令验证您选择了正确的集群上下文:输出将列出可用的配置:
输出CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin在这里,星号 (
*
) 表示我们已连接到do-fra1-helm3-example
集群。要切换集群,请运行:
当您连接到正确的集群时,请继续执行第 1 步以开始安装 Helm。
第 1 步 — 安装 Helm 3
在此部分中,您将使用官方提供的 shell 脚本安装 Helm 3。
首先,通过运行以下命令导航到/tmp
,在那里您将存储安装脚本:
使用以下命令下载脚本:
您可以在文本编辑器中检查get_helm.sh
以确保其安全性。
通过将其权限设置为以下内容,使其可执行:
最后,运行以下命令安装 Helm 3:
您将收到类似以下的输出:
OutputDownloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
您的计算机上已安装了 Helm 3。您现在将了解图表存储库以及如何使用它们。
第二步 — 设置图表存储库
Helm 图表存储在可能由任何人托管的存储库中。默认情况下,Helm 3 不会预先配置任何存储库。Helm 的早期版本包括一个中央经过筛选的图表存储库;然而,Helm 3 的设计有意演变为图表开发者管理自己的存储库,这样可以获得更多的自由和更快的发布速度。这意味着,对于您希望使用的每个图表,您都需要确保将托管存储库添加到您的 Helm 安装中。
为了帮助您找到正确的存储库,您可以使用 ArtifactHub.io,这是由 CNCF 管理的开源网站,它目录了 Helm 图表及其存储库。它还跟踪其他 CNCF 项目使用的流行和有用的图表,因此与 Helm 的早期版本所使用的 stable
存储库有所不同。对于常见项目,如 Nginx ingresses 或监控工具,这是一个很好的来源。
您可以通过主页搜索您想安装的图表。搜索 nginx
将显示与其相关的所有索引图表。
你将安装由Kubernetes团队管理的社区版。在搜索结果中搜索ingress-nginx
以找到它。选择它以访问其页面。
每个图表都应该有一个描述,详细说明它的作用,并附带添加其存储库到您的安装和安装该图表的命令。如果没有,您仍然可以通过点击页面右侧的INSTALL按钮来获取所需的命令。
您可以点击命令旁边的蓝色按钮来复制它。为第一个命令复制它,并运行:
要将存储库添加到Helm中,您运行helm repo add
。它接受的参数是存储库的名称和位置。
输出将是:
Output"ingress-nginx" has been added to your repositories
当您添加新存储库时,您需要通过运行以下命令让Helm知道它包含什么:
您将收到以下输出,显示更新成功:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈
在这一步中,您已经了解了ArtifactHub及其提供的内容。您还向Helm安装中添加了一个新存储库。在下一步中,您将安装一个Helm图表。
步骤3 — 安装Helm图表
在前一节中,您已经添加了ingress-nginx
图表的存储库。现在,您将安装它到您的集群中。
每个图表都有配置变量,您可以设置这些变量来修改其行为。这些变量存储在一个名为values.yaml
的文件中,该文件是图表的一部分。除非您已将图表下载到您的计算机上,否则您将需要运行以下命令来查看它:
要显示ingress-nginx
的可用变量,替换chart_name
:
输出将是一个长列表,显示ingress-nginx
的values.yaml
的内容。
要安装图表,您可以使用helm install
:
A release is a deployed instance of the chart, and here you’re calling it ingress-nginx
.
此命令将使用变量的默认值将图表安装到您的集群中。如果您希望修改其中一些变量,可以使用--set
传入新的变量值:
您可以重复使用--set
来设置尽可能多的变量。由于我们现在不会自定义它,所以通过运行以下命令安装它:
输出将类似于以下内容:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 10:12:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
...
请注意,NAME
对应于您指定的发布名称。Helm还列出了常见信息,例如发布状态和部署的命名空间。NOTES
部分在图表之间有所不同,通常包含快速入门指南或警告使用图表资源时的一些常见问题。在这里,它指出正在创建负载均衡器,并且可能需要一些时间才能完成。
要检查已部署的图表,请使用helm list
:
您会发现ingress-nginx
目前是唯一已部署的图表:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
您可以通过运行以下命令在集群中找到其提供的服务:
输出将类似于以下内容:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s
ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
现在您已经将一个发布部署到了集群中,您可以在其部署期间修改其配置。
步骤 4 — 升级发布
一旦发布部署完成,当您需要更改其配置时,您无需完全拆除并重新部署它。您可以使用 helm upgrade
命令升级发布,使用图表的新版本,或者设置新的设置。
ingress-nginx
图表公开了控制部署的控制器 pod 数量的 controller.replicaCount
变量。默认情况下,它设置为一,您可以通过列出可用的 pod 进行验证:
您会发现只有一个:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
如果您想要部署更多以实现冗余(例如,三个),您可以通过运行以下命令 upgrade
发布并将变量设置为 3
:
您还传递了 --reuse-values
,它指示 Helm 基于已部署的发布来制定您的更改,保留先前的配置。
在输出中,Helm 将增加修订版本以表示发布已升级:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...
您可以通过运行以下命令列出可用的 pod:
您将看到列出了三个 pod,而不是一个:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m
ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
接下来您将回滚更改并完全删除发布。
第5步 —— 回滚并删除发布
当您升级
一个发布时,其修订号会递增。在内部,Helm 存储所有发布的修订版本,允许您在需要时返回到先前的修订版本。
要将 pod 数量恢复为 1,您可以再次运行helm upgrade
并手动设置数量,因为这是一个小改动。然而,当处理具有许多变量的较大图表时,手动回滚是不可行的,应该自动化。
要回滚发布,请使用helm rollback
:
您可以使用它来回滚您对ingress-nginx
所做的更改,将其回滚到修订版本1
:
您将收到以下输出,指示操作成功:
OutputRollback was a success! Happy Helming!
您可以通过列出发布来检查当前修订版本:
您会发现修订版本现在是3
,而不是1
:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helm 将每个更改,包括回滚,视为对发布的新修订。您可以通过运行检查已部署的 pod 数量来验证修订版本3
是否等于第一个修订版本:
您会发现只有一个:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
要删除一个发布及其所有修订版本,您可以使用helm delete
:
由于您不再需要它,通过运行以下命令删除ingress-nginx
:
输出将是:
Outputrelease "ingress-nginx" uninstalled
您可以列出发布版本以检查是否没有:
输出表将不包含任何行:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
现在已删除发布版本,您可以在未来部署中重用其名称。
第6步 — (可选) 创建自定义图表
在这个可选步骤中,您将学习如何创建自定义图表,放置资源定义的位置以及如何打包以供进一步分发。
您将创建一个名为example-chart
的新图表。运行以下命令创建它:
这将创建一个名为example-chart
的新目录,其中包含以下文件和结构:
charts/
templates/
├─ tests/
│ ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml
您图表将安装在目标集群上的资源定义位于templates
目录中。Helm 创建的默认资源定义作为起点部署一个 Nginx Ingress 控制器。即使它们的文件扩展名是 YAML,它们也使用 Go 的模板语法来通过公开的变量进行定制,您可以传递这些变量。您可以通过运行以下命令来验证service.yaml
的内容:
您会发现它具有用双大括号括起来的生成值的模板指令:
引用的变量暴露给用户并在values.yaml
中定义。部署后Helm显示的NOTES
文本存储在NOTES.txt
中,也是模板化的。图表元数据,如名称、版本和部署软件的版本,都在Chart.yaml
中指定:
要检查Helm将部署的内容,您可以在指向图表目录的helm install
中传入--dry-run
和--debug
:
输出将很长,并包含所有最终的资源定义,这些资源将被应用到您的集群上。在制作图表时,您可以使用helm upgrade
将新版本推送到Kubernetes。
当您要分享完成的图表时,您可以运行以下命令对其进行打包以进行分发:
输出将是:
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
打包的图表可以像从已添加的存储库中添加的图表一样安装:
在此步骤中,您创建了一个自定义图表并对其进行了部署。您还将其打包,并了解了其结构。
结论
现在您知道如何使用Helm来安装和升级部署到您的Kubernetes集群上的软件。您已经添加了图表存储库,并了解了它们的重要性以及ArtifactHub如何帮助您找到它们。您还创建了一个新的自定义图表,并了解了发布修订版本以及在必要时如何回滚。
欲了解更多有关创建自定义图表的信息,请访问官方指南。