KServe 把 helm 列为安装 KServe 和其他 Kubernetes operators 的工具之一,故需恶补一番。
Helm 之 Kubernetes 的"应用安装包管理器"
-
- [一、Helm 是什么?](#一、Helm 是什么?)
- 二、本篇博客会带你收获啥?
- [三、Helm 的三个核心概念](#三、Helm 的三个核心概念)
-
- [1. Chart:应用安装包](#1. Chart:应用安装包)
- [2. Repository:Chart 仓库](#2. Repository:Chart 仓库)
- [3. Release:安装后的实例](#3. Release:安装后的实例)
- [四、安装 Helm](#四、安装 Helm)
- [五、你必须先明白:Helm 和 kubectl 的区别](#五、你必须先明白:Helm 和 kubectl 的区别)
- [六、Helm 实操(从 0 到 1)](#六、Helm 实操(从 0 到 1))
-
- [1. 创建目录](#1. 创建目录)
- [2. 创建 Chart.yaml](#2. 创建 Chart.yaml)
- [3. 创建 values.yaml](#3. 创建 values.yaml)
- [4. 创建模板文件](#4. 创建模板文件)
- 七、先不要安装,先渲染看看
- [八、真正安装这个 Chart](#八、真正安装这个 Chart)
- [九、查看 Helm 生成的最终 YAML](#九、查看 Helm 生成的最终 YAML)
- [十、修改 values.yaml,然后升级](#十、修改 values.yaml,然后升级)
- [十一、卸载 Helm Release](#十一、卸载 Helm Release)
- [十二、Helm Chart 的标准目录结构](#十二、Helm Chart 的标准目录结构)
- [十三、你应该如何理解 values.yaml?](#十三、你应该如何理解 values.yaml?)
- [十四、Helm 和 K8s YAML 的关系](#十四、Helm 和 K8s YAML 的关系)
- 十五、入门阶段的总结
一、Helm 是什么?
Helm 是 Kubernetes 里的包管理工具。
就像 Ubuntu 里的 apt 安装管理器。
Kubernetes 原本部署应用,需要写很多 YAML,比如:
text
Deployment
Service
ConfigMap
Secret
Ingress
PVC
ServiceAccount
Role
RoleBinding
CRD
如果一个应用很复杂,你每次都手写、复制、修改这些 YAML,就会很痛苦。Helm 的作用就是把这些 YAML 打包成一个 Chart,然后通过一条命令安装、升级、回滚、卸载。
二、本篇博客会带你收获啥?
因为我接下来要搞 KServe、vLLM、AI Native 方向,所以 Helm 最少需要:
text
1. 知道 Helm 是 Kubernetes 包管理器
2. 知道 Chart / Repository / Release 是什么
3. 会 helm install 安装应用
4. 会 helm list 查看应用
5. 会 helm upgrade 更新应用
6. 会 helm uninstall 卸载应用
7. 会看 values.yaml
8. 会用 -f 指定配置文件
9. 会用 helm template 看最终 YAML
10. 能大概看懂 templates 目录里的 Deployment、Service、ConfigMap
暂时不需要深入这些:
text
复杂模板函数
_helpers.tpl 高级封装
子 Chart 依赖管理
Chart 仓库发布
Helm hook
Helm plugin
Helmfile
OCI Chart 深度管理
这些等真正遇到 KServe、Prometheus、Grafana、Kubeflow 的复杂部署时,再补。
三、Helm 的三个核心概念
Helm 官方文档里把 Helm 使用时的三个核心概念概括为:Chart、Repository、Release。
1. Chart:应用安装包
Chart 就是 Helm 的"安装包"。
你可以把它理解成:
text
Chart = 一堆 Kubernetes YAML 模板 + 默认配置文件
比如一个 nginx Chart,里面可能包含:
text
Deployment.yaml
Service.yaml
Ingress.yaml
ConfigMap.yaml
values.yaml
Chart.yaml
Helm 官方对 Chart 的定义是:Chart 是一组文件,用来描述一组相关的 Kubernetes 资源;一个 Chart 可以部署简单的 memcached Pod,也可以部署复杂的 Web 应用栈。
2. Repository:Chart 仓库
Repository 就是 Helm Chart 的仓库。
你可以理解成:
text
Docker 镜像放在 Docker Hub
Helm Chart 放在 Chart Repository
平时你可以从仓库里下载别人写好的 Chart,然后安装到自己的 Kubernetes 集群里。
3. Release:安装后的实例
Release 是 Chart 被安装到 Kubernetes 集群后的实例。
举个例子:
bash
helm install my-nginx nginx-chart
这里:
text
nginx-chart 是 Chart
my-nginx 是 Release
同一个 Chart 可以安装多次,每次安装出来都是一个不同的 Release。Helm 官方也说明,一个 Chart 可以在同一个集群中安装多次,每次安装都会创建一个新的 Release。
你可以这样理解:
text
Chart:安装包
Release:安装后的应用实例
四、安装 Helm
我之前通过 vmware ,Ubantu版本,部署过一主二从集群。
我只需要在 master 所在的集群,安装 helm 即可。
Helm 官方 Ubuntu/Debian apt 安装方式现在用 Buildkite 源,命令如下。
sudo apt-get update
sudo apt-get install -y curl gpg apt-transport-https
添加 Helm 的 GPG key:
curl -fsSL https://packages.buildkite.com/helm-linux/helm-debian/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
# 表示以后从 Helm 软件源下载的软件包,我信任这个签名来源
添加 Helm apt 源:
echo "deb [signed-by=/usr/share/keyrings/helm.gpg] https://packages.buildkite.com/helm-linux/helm-debian/any/ any main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
安装 Helm:
sudo apt-get update
sudo apt-get install -y helm
验证:
helm version
然后验证 Helm 能不能连你的 K8s 集群:
helm list -A
如果这里没有报错,只是显示空列表,说明 Helm 正常。
五、你必须先明白:Helm 和 kubectl 的区别
先看 kubectl:
bash
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
它是直接把 YAML 提交给 Kubernetes。
再看 Helm:
bash
helm install my-app ./my-chart
helm 不是简单提交一个 YAML,而是可以:
text
读取 Chart
读取 values.yaml 配置
把 templates 目录里的模板渲染成真正的 Kubernetes YAML
把最终 YAML 提交给 Kubernetes
记录这次安装,形成 Release
从宏观来说,
通常 kubectl 直接操作 Kubernetes 资源
而 Helm 管理一组 Kubernetes 资源的安装、升级、回滚、卸载
六、Helm 实操(从 0 到 1)
先不安装复杂应用,只做一个最小例子。
目标:用 Helm 创建一个 ConfigMap。
1. 创建目录
bash
mkdir -p hello-helm/templates
cd hello-helm
目录结构先变成:
text
hello-helm/
templates/
2. 创建 Chart.yaml
在 hello-helm 目录下创建 Chart.yaml:
yaml
apiVersion: v2
name: hello-helm
version: 0.1.0
description: A simple Helm chart for learning
解释一下:
text
apiVersion: Chart 的 API 版本
name: Chart 名字
version: Chart 自己的版本
description: 描述
Helm 官方文档说明,Chart.yaml 是 Chart 必需文件,里面包含 Chart 的名称、版本等信息。
3. 创建 values.yaml
创建 values.yaml:
yaml
message: "Hello Helm"
这个文件是默认配置。
你可以理解成:
text
values.yaml = 变量配置文件
templates = YAML 模板
Helm 官方模板指南也说明,values.yaml 包含 Chart 的默认值,并且用户可以在 helm install 或 helm upgrade 时覆盖这些值。
4. 创建模板文件
在 templates 目录下创建 configmap.yaml:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
message: {{ .Values.message | quote }}
这里有两个新东西:
text
{{ .Release.Name }}
{{ .Values.message }}
解释:
text
.Release.Name:当前 Release 的名字
.Values.message:读取 values.yaml 里的 message
quote:给值加双引号,避免 YAML 格式出问题
也就是说,如果你执行:
bash
helm install demo ./hello-helm
那么:
yaml
name: {{ .Release.Name }}-config
会被渲染成:
yaml
name: demo-config
而:
yaml
message: {{ .Values.message | quote }}
会被渲染成:
yaml
message: "Hello Helm"
Helm 官方文档也展示了类似的模板写法,比如通过 {``{ .Release.Name }} 把 Release 名称注入到模板中。
七、先不要安装,先渲染看看
在 hello-helm 的上一级目录执行:
bash
helm template demo ./hello-helm
你会看到 Helm 渲染出来的 Kubernetes YAML,大概是:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-config
data:
message: "Hello Helm"
这里非常重要:
text
helm template 只是本地渲染,不会真正安装到 Kubernetes。
所以你以后看到一个 Chart 不确定对不对,可以先:
bash
helm template xxx ./chart目录
看它最终会生成什么 YAML。
八、真正安装这个 Chart
执行:
bash
helm install demo ./hello-helm
这里:
text
demo:Release 名字
./hello-helm:Chart 目录
查看 Helm Release:
bash
helm list
查看 Kubernetes 里的 ConfigMap:
bash
kubectl get configmap
你应该能看到:
text
demo-config
查看这个 ConfigMap:
bash
kubectl get configmap demo-config -o yaml
九、查看 Helm 生成的最终 YAML
执行:
bash
helm get manifest demo
这个命令会显示 Helm 这次安装时真正提交给 Kubernetes 的资源内容。Helm 官方模板入门文档也使用 helm get manifest 来查看 Release 实际加载的模板内容。
你可以记住:
bash
helm get manifest release名字
它的作用是:
text
查看这个 Helm Release 背后到底生成了哪些 Kubernetes YAML
十、修改 values.yaml,然后升级
现在把 values.yaml 改成:
yaml
message: "Hello Kubernetes and Helm"
然后执行:
bash
helm upgrade demo ./hello-helm
再查看:
bash
kubectl get configmap demo-config -o yaml
你会发现 message 变了。
这就是 Helm 的升级能力。
Helm 官方 helm upgrade 文档说明,这个命令用于把一个 Release 升级到 Chart 的新版本,参数通常是 Release 名和 Chart。
十一、卸载 Helm Release
执行:
bash
helm uninstall demo
再查看:
bash
helm list
kubectl get configmap
你会发现 Release 没了,对应的 ConfigMap 也被删除了。
这就是 Helm 比单纯 kubectl apply 更方便的地方:
text
它知道这一组资源属于哪个 Release。
卸载时,它可以把这组资源一起删掉。
十二、Helm Chart 的标准目录结构
一个常见 Chart 大概长这样:
text
my-chart/
Chart.yaml
values.yaml
charts/
templates/
deployment.yaml
service.yaml
ingress.yaml
configmap.yaml
secret.yaml
_helpers.tpl
NOTES.txt
Helm 官方文档中列出的 Chart 结构也包含 Chart.yaml、values.yaml、charts/、crds/、templates/ 等目录或文件;其中 templates/ 会和 values 结合生成有效的 Kubernetes manifest。
你入门阶段重点看这几个:
text
Chart.yaml:描述这个 Chart
values.yaml:默认配置
templates/:模板目录,里面是 Kubernetes YAML 模板
charts/:依赖的子 Chart
crds/:CRD 资源
其中最重要的是:
text
values.yaml + templates/
因为 Helm 的核心就是:
text
把 values.yaml 里的变量,填充到 templates 里的 YAML 模板中。
十三、你应该如何理解 values.yaml?
text
values.yaml 是配置表。
templates 里的 YAML 是模板。
Helm 会把配置表里的值填进模板里。
就相当于 之博客中说的 configmap、secret 那种,不要把变量写死到镜像里。
十四、Helm 和 K8s YAML 的关系
Helm 不是替代 Kubernetes YAML,
它本质上还是生成 Kubernetes YAML。
十五、入门阶段的总结
现在只需要记住这张关系图:
text
values.yaml
↓
templates/*.yaml
↓
helm template 渲染
↓
真正的 Kubernetes YAML
↓
提交给 Kubernetes API Server
↓
创建 Pod / Service / ConfigMap / CRD 等资源
或者更简单来说:Helm = Kubernetes YAML 模板引擎 + 应用安装管理工具