Helm 知识点总结
一、Helm 是什么
Helm 是Kubernetes 的包管理工具,类比:
apt/yum/pip。
- Helm 可以把 K8s 的一堆 yaml(Deployment、Service、Ingress、ConfigMap、Secret)打包成一个应用包,一键部署、升级、回滚、卸载。
- Helm3 vs Helm2 核心区别(重点面试)
特性 Helm2 Helm3 Tiller 服务端组件 有,集群内部运行 tiller 移除 Tiller,纯客户端 Release 存储 ConfigMap 存 Secret 默认存储 release 版本记录 CRD 安装 helm init初始化无需 init,直接使用 本地命令 helm init 废弃
✅现在全部使用 Helm3
二、核心概念
- Chart应用安装包;就是一个目录,里面包含模板 yaml、values 配置。类似 rpm/deb 包。
- Repository(Repo 仓库)存放 chart 的远程仓库(http/https),公共仓库:artifacthub;国内常用阿里云 helm 镜像。
helm repo add添加仓库;helm repo update更新仓库索引
- Release(版本实例)把一个 Chart 安装到 k8s 集群之后,就生成一个 Release。同一个 chart 可以多次安装,生成多个 release。
release 是 helm 管理的运行实例,每个 release 有版本修订号(revision,回滚用)
- Values(values.yaml)chart 的配置文件,用来覆盖模板里面变量;用户修改 values 来自定义部署参数。
关系梳理:
Chart(包) --(values赋值)--> 渲染yaml --> 生成Release(集群实例)
三、Chart 目录结构(手写考点)
mychart/ ├── Chart.yaml # ✅ chart元数据(名字、版本、appVersion、描述)必填 ├── values.yaml # ✅ 默认变量配置 ├── templates/ # ✅ 存放go template模板yaml文件 │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ └── _helpers.tpl # 公共模板函数,定义通用标签、名称 ├── charts/ # 子chart(依赖包,可选) └── .helmignore # 类似.gitignore,打包忽略文件_helpers.tpl:下划线开头的模板文件,不会直接渲染成 k8s 资源,专门用来定义可复用模板片段(name、labels)
Chart.yaml 字段区分:
version:Chart 包本身版本(helm 包版本)appVersion:业务应用镜像版本,程序本身版本(很多面试坑点!)
四、常用命令(高频)
仓库操作
helm repo add [仓库名] [url] # 添加仓库 helm repo list # 查看仓库 helm repo update # 更新仓库索引缓存 helm search repo xxx # 在本地索引搜索chart helm search hub xxx # hub搜索artifacthub安装、升级、卸载
# 安装release,--values(-f) 指定自定义values;--set 命令行覆盖变量 helm install <release名> 仓库/chart名 -f myvalues.yaml helm install <release名> 仓库/chart名 --set replicaCount=2 # 升级release(修改values之后执行升级,release名字不变) helm upgrade <release名> 仓库/chart -f newvalues.yaml # 查看已经部署的release helm list -A # -A 所有命名空间 # 回滚到历史修订版本revision helm rollback <release名> <revision号> # 卸载release;--keep-history保留历史release记录 helm uninstall <release名> helm uninstall <release名> --keep-history调试命令(非常实用,写 chart 必用)
# 本地渲染模板,输出最终yaml,**不提交到k8s,本地预览调试!** helm template ./mychart -f values.yaml # 查看release历史修订记录 helm history <release名称> # 查看release实际使用的values helm get values <release名> # 获取helm生成出来的最终manifest yaml helm get manifest <release名> # 本地创建空白chart骨架 helm create mychart # 打包chart为tgz压缩包 helm package mychart💡revision 注意:install 生成 revision=1;第一次 upgrade 之后 revision=2;rollback 回去 revision 会继续 + 1,旧版本 revision 号保留不会被覆盖!
五、Helm Go Template 模板语法基础
helm 底层使用Go text/template,增加 helm 专属的 Sprig 函数库。
- 取值语法
{{ .Values.xxx }}读取 values.yaml 变量 - 内置对象:
.Values:来自 values.yaml 以及 --set 传入的值.Release:release 信息.Release.Name、.Release.Namespace、.Release.Revision.Chart:读取 Chart.yaml 元数据.Chart.Name.Template:模板文件相关信息
- 判断语法
{{- if .Values.ingress.enabled }} # ingress资源内容 {{- end }}
-代表去除换行空白{{-去掉左边空白;-}}去掉右边空白,消除多余空行
- 循环 range
{{- range .Values.resources.limits }} # 循环内容 {{ end }}- 调用_helpers.tpl 定义的命名模板
{{ include "mychart.labels" . }}include函数用来引入公共片段;和 template 区别:include 可以管道传参,template 不行。优先用 include
六、依赖管理(Chart 依赖)
Chart.yaml 中 dependencies 字段声明依赖其他 chart;
dependencies: - name: mariadb version: "10.x.x" repository: "https://xxx"helm dependency update # 更新下载依赖到charts目录 helm dependency build子 chart 有独立 values;父 chart 可以在 values 里面覆盖子 chart 的值
mariadb: xxx
七、钩子 Helm Hooks(面试重点)
Helm Hooks:可以在 helm install/upgrade/rollback/uninstall 的生命周期各个阶段执行额外 k8s Job/Pod。 annotations 声明钩子:
annotations: "helm.sh/hook": pre-install常见 hook 类型
pre-install:chart 模板渲染完成之后,在资源创建之前运行 jobpost-install:所有资源部署完成之后执行pre-upgrade:升级开始前执行post-upgrade:升级完成后pre-delete:卸载资源删除之前post-delete:卸载之后
钩子额外注解:
"helm.sh/hook-weight": "5" # 权重数字,越小越先执行 "helm.sh/hook-delete-policy": hook-succeeded # job执行成功之后自动删除钩子pod⚠️注意:Hook 资源本身不计入 Release 管理;卸载 release 默认不会清理 hook 创建的资源,需要设置 delete-policy
八、常用排错 & 面试重点总结
高频面试问题
- helm install 和 helm upgrade 的区别?
- install:全新部署,生成 revision=1;release 名称不能已经存在
- upgrade:对已经存在 release 更新配置,revision 递增
- helm rollback 原理? helm3 release 元数据存在 Secret;保存每一次 revision 渲染时全部 values;回滚就是取出旧 revision 的 values,重新执行一次 upgrade,revision 号继续增大。不是回到旧 revision 编号,而是新建修订版本。
- helm template 作用? 本地渲染模板,输出最终 yaml;不访问 k8s api,用于调试模板是否正确。
- Chart.yaml version vs appVersion 区别
- version:helm chart 包的版本;
- appVersion:内部业务镜像版本。
- helm hooks 的使用场景? 数据库初始化 Job;升级前数据备份;部署完成初始化配置。
- helm --dry-run
helm install xxx --dry-run # 模拟安装,访问apiserver做校验;helm template纯本地不访问api;dry‑run会请求k8s做校验helm template:本地;helm install --dry-run:会连接 k8s 校验 schema。
易错点
- 修改 templates 下 yaml 直接改不会生效!必须 helm upgrade 重新渲染;helm 不监听本地文件变化。
- values.yaml 修改之后本地文件改完,一定要执行 helm upgrade 才会重新渲染集群资源。
- _helpers.tpl 是命名模板,不会直接生成资源,只能 include 引入。
- helm3 不再有 tiller,权限直接使用执行 helm 命令当前用户的 kubeconfig 权限。
九、helm 私有仓库补充
- 可以用 chartmuseum 搭建私有 helm 仓库;harbor 也内置 helm 仓库。
十、helm 工作流程
- helm 读取本地 chart;读取 values(-f /--set/ 默认 values.yaml)
- go template 渲染 templates 下面所有模板,替换变量,生成完整 k8s yaml 清单
- 通过 kubeconfig 连接 k8s api,提交资源到集群;同时把 release 状态写入 Secret 保存版本历史。
如果你需要,我可以再给你一份 helm 面试题(选择 + 简答)或者 helm 的实验练习清单。