拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

helm学习

helm学习

Helm 知识点总结

一、Helm 是什么

Helm 是Kubernetes 的包管理工具,类比:apt/yum/pip。

  • Helm 可以把 K8s 的一堆 yaml(Deployment、Service、Ingress、ConfigMap、Secret)打包成一个应用包,一键部署、升级、回滚、卸载。
  • Helm3 vs Helm2 核心区别(重点面试)
    特性Helm2Helm3
    Tiller 服务端组件有,集群内部运行 tiller移除 Tiller,纯客户端
    Release 存储ConfigMap 存Secret 默认存储 release 版本记录
    CRD 安装helm init初始化无需 init,直接使用
    本地命令helm init废弃

✅现在全部使用 Helm3

二、核心概念

  1. Chart应用安装包;就是一个目录,里面包含模板 yaml、values 配置。类似 rpm/deb 包。
  2. Repository(Repo 仓库)存放 chart 的远程仓库(http/https),公共仓库:artifacthub;国内常用阿里云 helm 镜像。

helm repo add添加仓库;helm repo update更新仓库索引

  1. Release(版本实例)把一个 Chart 安装到 k8s 集群之后,就生成一个 Release。同一个 chart 可以多次安装,生成多个 release。

release 是 helm 管理的运行实例,每个 release 有版本修订号(revision,回滚用)

  1. 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 函数库。

  1. 取值语法{{ .Values.xxx }}读取 values.yaml 变量
  2. 内置对象:
  • .Values:来自 values.yaml 以及 --set 传入的值
  • .Release:release 信息.Release.Name、.Release.Namespace、.Release.Revision
  • .Chart:读取 Chart.yaml 元数据.Chart.Name
  • .Template:模板文件相关信息
  1. 判断语法
{{- if .Values.ingress.enabled }} # ingress资源内容 {{- end }}

-代表去除换行空白{{-去掉左边空白;-}}去掉右边空白,消除多余空行

  1. 循环 range
{{- range .Values.resources.limits }} # 循环内容 {{ end }}
  1. 调用_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 模板渲染完成之后,在资源创建之前运行 job
  • post-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

八、常用排错 & 面试重点总结

高频面试问题

  1. helm install 和 helm upgrade 的区别?
  • install:全新部署,生成 revision=1;release 名称不能已经存在
  • upgrade:对已经存在 release 更新配置,revision 递增
  1. helm rollback 原理? helm3 release 元数据存在 Secret;保存每一次 revision 渲染时全部 values;回滚就是取出旧 revision 的 values,重新执行一次 upgrade,revision 号继续增大。不是回到旧 revision 编号,而是新建修订版本。
  2. helm template 作用? 本地渲染模板,输出最终 yaml;不访问 k8s api,用于调试模板是否正确。
  3. Chart.yaml version vs appVersion 区别
  • version:helm chart 包的版本;
  • appVersion:内部业务镜像版本。
  1. helm hooks 的使用场景? 数据库初始化 Job;升级前数据备份;部署完成初始化配置。
  2. helm --dry-run
helm install xxx --dry-run # 模拟安装,访问apiserver做校验;helm template纯本地不访问api;dry‑run会请求k8s做校验

helm template:本地;helm install --dry-run:会连接 k8s 校验 schema。

易错点

  1. 修改 templates 下 yaml 直接改不会生效!必须 helm upgrade 重新渲染;helm 不监听本地文件变化。
  2. values.yaml 修改之后本地文件改完,一定要执行 helm upgrade 才会重新渲染集群资源。
  3. _helpers.tpl 是命名模板,不会直接生成资源,只能 include 引入。
  4. helm3 不再有 tiller,权限直接使用执行 helm 命令当前用户的 kubeconfig 权限。

九、helm 私有仓库补充

  • 可以用 chartmuseum 搭建私有 helm 仓库;harbor 也内置 helm 仓库。

十、helm 工作流程

  1. helm 读取本地 chart;读取 values(-f /--set/ 默认 values.yaml)
  2. go template 渲染 templates 下面所有模板,替换变量,生成完整 k8s yaml 清单
  3. 通过 kubeconfig 连接 k8s api,提交资源到集群;同时把 release 状态写入 Secret 保存版本历史。

如果你需要,我可以再给你一份 helm 面试题(选择 + 简答)或者 helm 的实验练习清单。

返回列表