介绍
Helm 是 Kubernetes 的包管理器,它允许开发人员和运维人员轻松地在 Kubernetes 集群上配置和部署应用程序。.
Helm 包被称为 Chart,其中包含资源定义模板,能够以最小的用户操作部署和配置指定的应用程序。借助模板,您可以通过传递变量定义来管理 Chart、其设置及其行为,而无需更改实际的 Chart 本身。Helm 会自动管理自定义资源定义以及对预部署定义的更改。已部署的 Chart(可能包含自定义项)称为 Release。.
在本教程中,您将设置 Helm 3,并学习如何安装、升级、恢复和管理图表及其版本。您还将学习如何创建和打包自己的图表,以及如何设置图表仓库,以便托管您可以立即安装的图表。.
先决条件
- 启用了基于角色的访问控制(RBAC)的 Kubernetes 集群。.
- kubectl 命令行工具已安装在您的本地计算机上,并配置为连接到您的集群。.
- 您可以使用以下命令测试连接:
kubectl cluster-info- 如果没有出现任何错误,则表示您已连接到集群。如果您使用 kubectl 访问多个集群,请确保已通过运行以下命令选择正确的集群上下文:
kubectl config get-contexts- 输出结果列出了所有可用设置:
Output CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin- 这里的星号 (*) 表示我们连接到 do-fra1-helm3-example 集群。要切换集群,请运行:
kubectl config use-context context-name- 连接到正确的集群后,继续执行步骤 1 开始安装 Helm。.
步骤 1 – 安装 Helm 3
在本节中,您将使用官方提供的 shell 脚本安装 Helm 3。.
首先进入 /tmp 目录,运行以下命令即可找到安装脚本:
cd /tmp使用以下命令下载脚本:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3您可以在文本编辑器中检查 get_helm.sh 文件,以确保其安全性。.
将其权限设置为以下值,使其可执行:
chmod u+x get_helm.sh最后,运行该命令安装 Helm 3:
./get_helm.sh您将得到类似如下的输出:
Output
Downloading 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。现在我们将向您介绍图表仓库以及如何使用它们。.
步骤 2 – 设置图表库
Helm Chart 存储在 Chart 仓库中,任何人都可以托管这些仓库。默认情况下,Helm 3 没有预配置任何仓库。之前的 Helm 版本包含一个中央 Chart 仓库。然而,Helm 3 的设计有意面向 Chart 开发者,让他们管理自己的仓库,从而提供更大的自由度和更快的发布速度。这意味着,对于您想要使用的每个 Chart,您都需要确保将托管该 Chart 的仓库添加到您的 Helm 安装中。.
为了帮助您找到合适的仓库,您可以使用 ArtifactHub.io,这是一个由 CNCF 管理的开源网站,它收录了 Helm Chart 及其对应的仓库。它还会追踪其他 CNCF 项目使用的热门实用 Chart,因此与之前 Helm 版本所使用的稳定仓库有所不同。对于 Nginx 日志或监控工具等常见项目来说,这是一个非常棒的资源。.
您可以从主页搜索想要安装的图表。Nginx 搜索将显示所有与其相关的已索引图表。.
您将安装由 Kubernetes 团队维护的社区版本。搜索 ingress-nginx 即可在搜索结果中找到它。选择它即可访问相关页面。.

每个图表都应包含任务描述,以及如何将存储库添加到图表安装目录和进行安装的说明。此外,您仍然可以点击页面右侧的“安装”按钮获取必要的说明。.
您可以点击命令旁边的蓝色按钮来复制命令。对于第一个命令,请执行以下操作并运行它:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx要向 Helm 添加仓库,请运行 `helm repo add` 命令。它接受的参数是仓库的名称及其位置。.
输出结果为:
Output
"ingress-nginx" has been added to your repositories添加新仓库时,需要运行以下命令告诉 Helm 它包含哪些内容:
helm repo update您将收到以下输出,表明更新已成功:
Output
Hang 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 Chart。.
步骤 3 – 安装 Helm Chart
在上一节中,您添加了 ingress-nginx 图形仓库。现在您将把它安装到您的集群上。.
每个图表都有配置变量,您可以设置这些变量来更改其行为。这些变量存储在名为 values.yaml 的文件中,该文件是图表的一部分。除非您已将图表下载到您的设备,否则您需要运行以下命令才能查看它:
helm show values chart_name要显示 ingress-nginx 的可用变量,请替换 chart_name:
helm show values ingress-nginx/ingress-nginx输出结果会很长,并显示 ingress-nginx 的 values.yaml 文件的内容。.
要安装该图表,可以使用 install 命令:
helm install release_name repository/chart_name发布版本是该图的已部署实例,在这里你称之为 ingress-nginx。.
此命令会使用集群上变量的默认值安装图表。如果要更改某些变量,可以使用 `--set` 参数传递新的变量值:
helm install ingress-nginx/ingress-nginx --set variable_name=variable_value
您可以重复使用 `--set` 命令来设置所需的变量数量。由于我们现在不会对其进行自定义,请按原样运行以下命令进行安装:
helm install ingress-nginx ingress-nginx/ingress-nginx输出结果将类似于以下内容:
Output
NAME: 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 部分因图表而异,通常包含快速入门提示或关于使用图表资源时一些常见问题的警告。此处提到正在创建负载均衡器,可能需要一些时间才能完成。.
要检查已部署的图表,请使用 list 命令:
helm list你会注意到,目前唯一部署的图是 ingress-nginx:
Output
NAME 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您可以通过运行以下命令来查找其集群中包含的服务:
kubectl get services输出结果将类似于这样:
Output
NAME 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 – 升级版本
版本一旦运行,无需在需要更改其配置时将其销毁并重新创建。您可以使用升级命令将版本升级到新版本的图表或设置新设置。.
ingress-nginx 图显示了 controller.replicaCount 变量,该变量控制已部署的控制器 Pod 的数量。默认情况下,该变量设置为 1,您可以通过列出可用 Pod 来验证这一点:
kubectl get pods你会注意到只有一个:
Output
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m如果想要部署更多节点以实现冗余(例如三个),可以升级版本并将变量设置为 3,方法是运行以下命令:
helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values你还可以传递 --reuse-values ,该参数指示 Helm 将你的更改放在已部署版本之上,并保留之前的配置。.
Helm 会在输出中进行更正,以表明版本已升级:
Output
NAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...您可以通过运行以下命令列出可用的 pod:
kubectl get pods你会看到列出的是三个胶囊,而不是一个:
Output
NAME 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,您可以重新运行升级命令并手动调整数量,因为这是一个很小的改动。但是,当处理包含大量变量的大型图表时,手动恢复是不可能的,应该自动进行。.
要恢复某个版本,请使用 restore 命令:
helm rollback release_name release_revision你可以使用此功能将对 ingress-nginx 所做的更改还原到版本 1:
helm rollback ingress-nginx 1您将收到以下输出,表明操作已成功:
Output
Rollback was a success! Happy Helming!您可以通过列出版本号来查看当前版本:
helm list你会注意到修订版本现在是 3 而不是 1:
Output
NAME 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.0Helm 将每一次更改(包括回滚)都视为发布版本中的一个新修订。可以通过运行以下命令检查已部署的 Pod 数量:
kubectl get pods你会注意到只有一个:
Output
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m要删除某个版本及其所有修订版本,可以使用 helm delete 命令:
helm delete release_name由于您不再需要 ingress-nginx,请运行以下命令将其删除:
helm delete ingress-nginx输出结果为:
Output
release "ingress-nginx" uninstalled您可以列出版本号,检查是否没有重复的版本:
helm list输出表将不包含任何行:
Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
既然该版本已被删除,您可以在未来的部署中重复使用它的名称。.
步骤 6 – (可选)创建自定义图表
在这个可选步骤中,您将学习如何创建自定义图表、资源定义放置位置以及如何将其打包以便进一步分发。.
您将创建一个名为 sample-chart 的新图表。要创建它,请运行以下命令:
helm create 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您的图表在目标集群上安装的资源定义位于模板目录中。Helm 创建的默认资源定义作为起点,部署了一个 Nginx Ingress 控制器。尽管它们的扩展名是 YAML,但它们使用 Go 的格式化语法,以便您可以通过传递的公开变量来保持可配置性。您可以通过运行以下命令查看 service.yaml 的内容:
cat example-chart/templates/service.yaml你会注意到它包含用于生成用双括号括起来的值的格式说明:
OutputapiVersion: v1
kind: Service
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "mychart.selectorLabels" . | nindent 4 }}引用的变量对用户可见,并在 values.yaml 文件中定义。Helm NOTES 文本在部署后存储在 NOTES.txt 文件中,并进行格式化。图表元数据(例如名称、版本以及所部署软件的版本)在 Chart.yaml 文件中指定:
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
...
type: application
...
version: 0.1.0
...
appVersion: "1.16.0"要检查 Helm 正在部署的内容,可以通过指向 chart 目录,向 helm install 命令传递 --dry-run 和 --debug 参数:
helm install example-chart --dry-run --debug ./example-chart输出结果会很长,其中包含将应用于集群的所有最终资源定义。在处理资源图的同时,您可以使用升级命令将新版本推送到 Kubernetes。.
分享完图表后,您可以通过运行以下命令使其可供分发:
helm package ./example-chart输出结果为:
Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz打包好的图表可以像安装新增存储库中的图表一样进行安装:
helm install example-chart example-chart-0.1.0.tgz至此,您已创建并部署了自定义图表。您还对其进行了打包,并熟悉了其结构。.
结果
现在您已经了解如何使用 Helm 安装和升级部署到 Kubernetes 集群的软件。您添加了 Chart 仓库,并了解了它们的重要性以及 ArtifactHub 如何帮助您找到它们。您还创建了一个新的自定义 Chart,并了解了版本修订以及如何在必要时进行回滚。.












