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

0 股票
0
0
0
0

介绍

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

Helm 将每一次更改(包括回滚)都视为发布版本中的一个新修订。可以通过运行以下命令检查已部署的 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,并了解了版本修订以及如何在必要时进行回滚。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢