如何使用Helm3包管理器在Kubernetes集群上安装软件

来自菜鸟教程
跳转至:导航、​搜索

介绍

Helm 是 Kubernetes 的包管理器,它允许开发人员和运营商更轻松地在 Kubernetes 集群上配置和部署应用程序。

Helm 包被称为 charts,它们包含资源定义模板,这些模板可以部署和配置给定的应用程序,用户只需付出最少的努力。 使用模板,您可以通过传入变量定义来管理图表、其设置和行为,而无需修改实际图表。 Helm 自动管理自定义资源定义以及对已部署定义的修改。 具有可能自定义的已部署图表称为 release

在本教程中,您将设置 Helm 3 并学习如何安装、升级、回滚和管理图表和版本。 您还将学习创建和打包自己的图表,以及设置图表存储库,其中托管您可以立即安装的图表。

先决条件

  • 启用了基于角色的访问控制 (RBAC) 的 Kubernetes 集群。 有关发布的更多信息,您可以查看 Helm 发布 页面。

  • 安装在本地计算机上的 kubectl 命令行工具,配置为连接到您的集群。 您可以在官方文档中阅读更多关于安装kubectl 的信息。

    您可以使用以下命令测试您的连接性:

    kubectl cluster-info
    

    如果您没有收到任何错误,则您已连接到集群。 如果您使用 kubectl 访问多个集群,请确保通过运行以下命令来验证您是否选择了正确的集群上下文:

    kubectl config get-contexts
    

    输出将列出可用的配置:

    OutputCURRENT   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

您将收到类似于以下内容的输出:

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。 您现在将了解图表存储库以及如何使用它们。

第 2 步 — 设置图表存储库

Helm 图表存储在图表存储库中,任何人都可以托管。 默认情况下,Helm 3 没有预配置任何存储库。 以前版本的 Helm 包括一个中央策划的图表存储库; 然而,Helm 3 的设计故意演变为图表开发人员管理他们自己的存储库,从而允许更多的自由和更快的发布。 这意味着对于您希望使用的每个图表,您需要确保将托管存储库添加到您的 Helm 安装中。

为了帮助您找到正确的存储库,您可以使用 ArtifactHub.io,这是一个由 CNCF 管理的开源网站,它对 Helm 图表及其存储库进行分类。 它还跟踪其他 CNCF 项目使用的流行和有用的图表,因此它不同于以前版本的 Helm 使用的 stable 存储库。 对于常见的项目,例如 Nginx 入口或监控工具,它是一个很好的来源。

您可以通过主页搜索要安装的图表。 搜索 nginx 将显示与其相关的所有索引图表。

您将安装由 Kubernetes 团队管理的社区版。 搜索 ingress-nginx 以在您的结果中找到它。 选择它以访问其页面。

每个图表都应该有一个详细说明它的功能的描述,以及将其存储库添加到您的安装和安装图表的命令。 如果没有,您仍然可以通过按页面右侧的 INSTALL 按钮来获取必要的命令。

您可以单击命令旁边的蓝色按钮来复制它。 对第一个命令执行此操作,然后运行它:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

要将存储库添加到 Helm,请运行 helm repo add。 它接受的参数是存储库的名称及其位置。

输出将是:

Output"ingress-nginx" has been added to your repositories

当你添加一个新的 repo 时,你需要通过运行让 Helm 知道它包含什么:

helm repo update

您将收到以下输出,表明更新成功:

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 Chart

在上一节中,您为 ingress-nginx 图表添加了存储库。 您现在将其安装到您的集群中。

每个图表都有配置变量,您可以设置这些变量来修改其行为。 这些变量存储在一个名为 values.yaml 的文件中,该文件是图表的一部分。 除非您已将图表下载到您的计算机上,否则您必须运行以下命令才能查看它:

helm show values chart_name

要显示 ingress-nginx 的可用变量,请替换 chart_name

helm show values ingress-nginx/ingress-nginx

输出将显示 ingress-nginxvalues.yaml 的内容。

要安装图表,您可以使用 helm install

helm install release_name repository/chart_name

release 是图表的已部署实例,在这里您将其称为 ingress-nginx

此命令将使用变量的默认值将图表安装到您的集群中。 如果你想修改其中的一些,你可以使用 --set 传入新的变量值:

helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

您可以根据需要对多个变量重复 --set。 由于我们现在不会自定义它,因此通过运行按原样安装它:

helm install ingress-nginx ingress-nginx/ingress-nginx

输出将类似于以下内容:

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

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

您可以通过运行以下命令找到它在集群中的服务:

kubectl get services

输出将与此类似:

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 变量。 默认情况下,它设置为 1,您可以通过列出可用的 pod 来验证:

kubectl get pods

你会发现只有一个:

OutputNAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-7fc74cf778-kjtst   1/1     Running   0          12m

如果您希望部署更多以实现冗余(例如,三个),您可以通过运行 upgrade 版本并将变量设置为 3

helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

您还传入 --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:

kubectl get pods

您会发现列出了三个 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 步 — 回滚和删除版本

当您 upgrade 发布时,其修订号会增加。 在内部,Helm 存储版本的所有修订,允许您在需要时返回到以前的修订。

要将 pod 的数量恢复为一个,您可以再次运行 helm upgrade 并手动设置数量,因为这是一个很小的变化。 但是,当使用具有许多变量的较大图表时,手动还原是不可行的,应该自动化。

要回滚版本,请使用 helm rollback

helm rollback release_name release_revision

您可以使用它通过回滚到修订版 1 来恢复对 ingress-nginx 所做的更改:

helm rollback ingress-nginx 1

您将收到以下输出,表明操作成功:

OutputRollback was a success! Happy Helming!

您可以通过列出版本来检查当前版本:

helm list

你会发现现在的版本是 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 是否等于第一个修订版:

kubectl get pods

你会发现只有一个:

OutputNAME                                        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

输出将是:

Outputrelease "ingress-nginx" uninstalled

您可以列出版本以检查是否没有:

helm list

输出表将没有行:

OutputNAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

现在该版本已被删除,您可以在未来的部署中重用其名称。

第 6 步 - (可选)创建自定义图表

在此可选步骤中,您将学习如何创建自定义图表、将资源定义放置在何处以及如何将其打包以供进一步分发。

您将创建一个名为 example-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

您的图表将安装在目标集群上的资源定义位于 templates 目录中。 作为起点,Helm 创建的默认部署一个 Nginx 入口控制器。 尽管它们的文件扩展名是 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 中指定:

示例图表/Chart.yaml

apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

要检查 Helm 将部署什么,您可以将 --dry-run--debug 传递给指向图表目录的 helm install

helm install example-chart --dry-run --debug ./example-chart

输出将很长,并包含将应用于您的集群的所有最终资源定义。 在处理图表时,您可以使用 helm upgrade 将新版本推送到 Kubernetes。

当需要分享您完成的图表时,您可以通过运行将其打包以进行分发:

helm package ./example-chart

输出将是:

OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

可以像添加存储库中的一样安装打包的图表:

helm install example-chart example-chart-0.1.0.tgz

在此步骤中,您已创建并部署了一个自定义图表。 您还打包了它,并了解了它的结构。

结论

您现在知道如何使用 Helm 安装和升级部署到 Kubernetes 集群的软件。 您已经添加了图表存储库,并了解了它们为何重要以及 ArtifactHub 如何帮助您找到它们。 您还创建了一个新的自定义图表并了解了版本修订以及如何在必要时回滚。

有关创建自定义图表的更多信息,请访问 官方指南