发布于 2026-01-06 0 阅读
0

一次性安装多个 Helm Chart [方法 1 - 使用父/子 Chart]

一次性安装多个 Helm Chart [方法 1 - 使用父/子 Chart]

Helm 是一款功能强大的对象管理工具Kubernetes,已被众多组织广泛采用。它彻底改变了 Kubernetes 对象的管理方式。

只需一条命令,我们就可以同时安装或升级多个相关的 Kubernetes 实体,无需担心资源的创建方式,Helm 会为我们完成所有繁重的工作。

$ helm install [RELEASE_NAME] [REPO]/[CHART]
Enter fullscreen mode Exit fullscreen mode

但下面的文章并非关于 Helm 的基础知识,也不是关于如何安装或升级 Chart 等。而是关于部署 Chart 的一些新方法。

假设您需要在特定的 Kubernetes 集群上安装 100 多个 chart,在这种情况下您会怎么做?

我脑海中立刻浮现出几种方法:

先决条件:

方法一:

将相互关联的图表合并为一个,例如创建一个父/包装图表,该图表将依赖相关的子图表。这意味着,如果我们安装父/包装图表,它将获得所有已部署子图表的所有 Kubernetes 资源(前提是这些子图表在 Chart.yaml 中被标记为已启用)。

下面是一个简单的例子,其中我有一个名为 app01 的 3 层应用程序。

  • 如果你查看父级 Chart.yaml 中两个命令的输出,你会发现所有三个 chart 都被列为依赖项,而在另一个 Chart 中,每个 chart 都有自己的 Kubernetes 资源。
$ cat Chart.yaml
apiVersion: v2
name: app01
description: A Helm chart for app01 which contains FE, BE, DB.
version: 0.1.0
appVersion: 1.0.0
dependencies:
  - name: webapp
    version: "0.1.0"
    repository: "file://./charts/webapp"
    enabled: true
  - name: backend
    version: "0.1.0"
    repository: "file://./charts/backend"
    enabled: true
  - name: database
    version: "0.1.0"
    repository: "file://./charts/database"
    enabled: true
Enter fullscreen mode Exit fullscreen mode
$ tree
.
├── Chart.yaml
├── charts
│   ├── backend
│   │   ├── Chart.yaml
│   │   ├── charts
│   │   ├── templates
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   └── serviceaccount.yaml
│   │   └── values.yaml
│   ├── database
│   │   ├── Chart.yaml
│   │   ├── charts
│   │   ├── templates
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   └── serviceaccount.yaml
│   │   └── values.yaml
│   └── webapp
│       ├── Chart.yaml
│       ├── charts
│       ├── templates
│       │   ├── _helpers.tpl
│       │   ├── deployment.yaml
│       │   ├── hpa.yaml
│       │   ├── ingress.yaml
│       │   ├── service.yaml
│       │   └── serviceaccount.yaml
│       └── values.yaml
└── values.yaml

10 directories, 26 files
Enter fullscreen mode Exit fullscreen mode
  • 安装父级图表后,所有 Kubernetes 资源都会被部署。
$ helm install app01 ./app01/
NAME: app01
LAST DEPLOYED: Sat Dec  2 00:14:50 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
Enter fullscreen mode Exit fullscreen mode
$ helm list -A
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
app01   default         1               2023-12-02 00:14:50.075444065 +0530 IST deployed        app01-0.1.0     1.0.0
Enter fullscreen mode Exit fullscreen mode
$ k get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/app01-backend-965cb9b5b-q7gqv     1/1     Running   0          17m
pod/app01-database-56bdbcd49c-bh4s2   1/1     Running   0          17m
pod/app01-webapp-5b67db8bdf-m6psg     1/1     Running   0          17m

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/app01-backend    ClusterIP   10.107.53.8      <none>        8080/TCP  17m
service/app01-database   ClusterIP   10.104.173.124   <none>        3306/TCP  17m
service/app01-webapp     ClusterIP   10.111.168.18    <none>        80/TCP    17m
service/kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP   8d

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app01-backend    1/1     1            1           17m
deployment.apps/app01-database   1/1     1            1           17m
deployment.apps/app01-webapp     1/1     1            1           17m

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/app01-backend-965cb9b5b     1         1         1       17m
replicaset.apps/app01-database-56bdbcd49c   1         1         1       17m
replicaset.apps/app01-webapp-5b67db8bdf     1         1         1       17m
Enter fullscreen mode Exit fullscreen mode
  • 这里还需要注意的是,现在我们有 4 个 values.yaml 文件(每个子 chart 一个,父 helm chart 一个)。
  • 好处在于,我们只需使用一个父级的 values.yaml 文件即可管理所有这 3 个对象。
  • 请确保在父图表的 values.yaml 文件中,子图表的值缩进正确,并且缩进到 Chart.yaml 文件中指定的图表名称下方。.dependencies[*].name
$ cat values.yaml
webapp:
  replicaCount: 2

database:
  replicaCount: 1

backend:
  replicaCount: 3
Enter fullscreen mode Exit fullscreen mode
  • 这里我们只是更新所有子图表的副本数,并升级版本。
$ helm upgrade --install app01 ./app01/
Release "app01" has been upgraded. Happy Helming!
NAME: app01
LAST DEPLOYED: Sat Dec  2 01:21:56 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
Enter fullscreen mode Exit fullscreen mode
  • 根据父图表 values.yaml 中的定义,副本计数现在分别增加到 2 和 3。
$ k get deploy; k get pods
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
app01-backend    3/3     3            3           105m
app01-database   1/1     1            1           105m
app01-webapp     2/2     2            2           105m
NAME                              READY   STATUS    RESTARTS   AGE
app01-backend-965cb9b5b-dg6gq     1/1     Running   0          38m
app01-backend-965cb9b5b-q7gqv     1/1     Running   0          105m
app01-backend-965cb9b5b-z92c8     1/1     Running   0          38m
app01-database-56bdbcd49c-bh4s2   1/1     Running   0          105m
app01-webapp-5b67db8bdf-c25kc     1/1     Running   0          38m
app01-webapp-5b67db8bdf-m6psg     1/1     Running   0          105m
Enter fullscreen mode Exit fullscreen mode
  • 正如您在这里看到的,我们通过一个命令部署了多个 Helm Chart,并且使用一个 values.yaml 文件,我们能够管理所有这些 Chart。

方法二:

使用helmfile。

方法三:

使用 bash 或任何其他脚本语言(我计划编写一个简单的实用程序来实现此目的)。

此外,我正在撰写另一篇关于方法 2 和 3 的文章,而且可能还有其他多种方法可以实现这一目标(欢迎分享您的想法和评论)。

学习愉快 :)

PS:封面图片是用Canva制作的。

文章来源:https://dev.to/aws-builders/installing-multiple-helm-charts-in-one-go-approach-1-5d1p