一次性安装多个 Helm Chart [方法 1 - 使用父/子 Chart]
Helm 是一款功能强大的对象管理工具Kubernetes,已被众多组织广泛采用。它彻底改变了 Kubernetes 对象的管理方式。
只需一条命令,我们就可以同时安装或升级多个相关的 Kubernetes 实体,无需担心资源的创建方式,Helm 会为我们完成所有繁重的工作。
$ helm install [RELEASE_NAME] [REPO]/[CHART]
但下面的文章并非关于 Helm 的基础知识,也不是关于如何安装或升级 Chart 等。而是关于部署 Chart 的一些新方法。
假设您需要在特定的 Kubernetes 集群上安装 100 多个 chart,在这种情况下您会怎么做?
我脑海中立刻浮现出几种方法:
先决条件:
- 一个运行中且权限正确的 Kubernetes 集群,这里我使用的是 minikube。
- 您的机器上已安装 kubectl 和 helm,以便与 Kubernetes 集群进行交互。
方法一:
将相互关联的图表合并为一个,例如创建一个父/包装图表,该图表将依赖相关的子图表。这意味着,如果我们安装父/包装图表,它将获得所有已部署子图表的所有 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
$ 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
- 安装父级图表后,所有 Kubernetes 资源都会被部署。
$ helm install app01 ./app01/
NAME: app01
LAST DEPLOYED: Sat Dec 2 00:14:50 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
$ 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
$ 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
- 这里还需要注意的是,现在我们有 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
- 这里我们只是更新所有子图表的副本数,并升级版本。
$ 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
- 根据父图表 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
- 正如您在这里看到的,我们通过一个命令部署了多个 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