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

介绍

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

Helm 包被称为 charts,它们包含部署和配置给定应用程序的资源定义模板,用户只需付出最少的工作就能完成部署。通过模板化,您可以通过传入变量定义来管理 chart、其设置和行为,而无需修改实际的 chart。自定义的资源定义以及对已部署定义的修改,Helm 都会自动管理。已部署的 chart,在可能的自定义情况下,被称为 release

在本教程中,您将设置 Helm 3,并学习如何安装、升级、回滚和管理 charts 和 releases。您还将学习如何创建和打包自己的 charts,并设置 chart 仓库,这些仓库包含您可以立即安装的 charts。

先决条件

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

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

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

    1. kubectl cluster-info

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

    1. kubectl config get-contexts

    输出将列出可用的配置:

    输出
    CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    在这里,星号 (*) 表示我们已连接到 do-fra1-helm3-example 集群。要切换集群,请运行:

    1. kubectl config use-context context-name

当您连接到正确的集群时,请继续执行第 1 步以开始安装 Helm。

第 1 步 — 安装 Helm 3

在此部分中,您将使用官方提供的 shell 脚本安装 Helm 3

首先,通过运行以下命令导航到/tmp,在那里您将存储安装脚本:

  1. cd /tmp

使用以下命令下载脚本:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

您可以在文本编辑器中检查get_helm.sh以确保其安全性。

通过将其权限设置为以下内容,使其可执行:

  1. chmod u+x get_helm.sh

最后,运行以下命令安装 Helm 3:

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

第二步 — 设置图表存储库

Helm 图表存储在可能由任何人托管的存储库中。默认情况下,Helm 3 不会预先配置任何存储库。Helm 的早期版本包括一个中央经过筛选的图表存储库;然而,Helm 3 的设计有意演变为图表开发者管理自己的存储库,这样可以获得更多的自由和更快的发布速度。这意味着,对于您希望使用的每个图表,您都需要确保将托管存储库添加到您的 Helm 安装中。

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

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

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

每个图表都应该有一个描述,详细说明它的作用,并附带添加其存储库到您的安装和安装该图表的命令。如果没有,您仍然可以通过点击页面右侧的INSTALL按钮来获取所需的命令。

您可以点击命令旁边的蓝色按钮来复制它。为第一个命令复制它,并运行:

  1. 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知道它包含什么:

  1. 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图表。

步骤3 — 安装Helm图表

在前一节中,您已经添加了ingress-nginx图表的存储库。现在,您将安装它到您的集群中。

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

  1. helm show values chart_name

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

  1. helm show values ingress-nginx/ingress-nginx

输出将是一个长列表,显示ingress-nginxvalues.yaml的内容。

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

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

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

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

您可以重复使用--set来设置尽可能多的变量。由于我们现在不会自定义它,所以通过运行以下命令安装它:

  1. 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部分在图表之间有所不同,通常包含快速入门指南或警告使用图表资源时的一些常见问题。在这里,它指出正在创建负载均衡器,并且可能需要一些时间才能完成。

要检查已部署的图表,请使用helm list

  1. 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

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

  1. 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 — 升级发布

一旦发布部署完成,当您需要更改其配置时,您无需完全拆除并重新部署它。您可以使用 helm upgrade 命令升级发布,使用图表的新版本,或者设置新的设置。

ingress-nginx 图表公开了控制部署的控制器 pod 数量的 controller.replicaCount 变量。默认情况下,它设置为一,您可以通过列出可用的 pod 进行验证:

  1. kubectl get pods

您会发现只有一个:

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

如果您想要部署更多以实现冗余(例如,三个),您可以通过运行以下命令 upgrade 发布并将变量设置为 3

  1. 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:

  1. kubectl get pods

您将看到列出了三个 pod,而不是一个:

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,您可以再次运行helm upgrade并手动设置数量,因为这是一个小改动。然而,当处理具有许多变量的较大图表时,手动回滚是不可行的,应该自动化。

要回滚发布,请使用helm rollback

  1. helm rollback release_name release_revision

您可以使用它来回滚您对ingress-nginx所做的更改,将其回滚到修订版本1

  1. helm rollback ingress-nginx 1

您将收到以下输出,指示操作成功:

Output
Rollback was a success! Happy Helming!

您可以通过列出发布来检查当前修订版本:

  1. 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.0

Helm 将每个更改,包括回滚,视为对发布的新修订。您可以通过运行检查已部署的 pod 数量来验证修订版本3是否等于第一个修订版本:

  1. kubectl get pods

您会发现只有一个:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

要删除一个发布及其所有修订版本,您可以使用helm delete

  1. helm delete release_name

由于您不再需要它,通过运行以下命令删除ingress-nginx

  1. helm delete ingress-nginx

输出将是:

Output
release "ingress-nginx" uninstalled

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

  1. helm list

输出表将不包含任何行:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

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

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

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

您将创建一个名为example-chart的新图表。运行以下命令创建它:

  1. helm create example-chart

这将创建一个名为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的内容:

  1. cat example-chart/templates/service.yaml

您会发现它具有用双大括号括起来的生成值的模板指令:

Output
apiVersion
: 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中指定:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

要检查Helm将部署的内容,您可以在指向图表目录的helm install中传入--dry-run--debug

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

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

当您要分享完成的图表时,您可以运行以下命令对其进行打包以进行分发:

  1. helm package ./example-chart

输出将是:

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

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

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

在此步骤中,您创建了一个自定义图表并对其进行了部署。您还将其打包,并了解了其结构。

结论

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager