一、Helm 简介
1. 什么是 Helm
Helm 是Kubernetes 的包管理器。
原生 kubectl 需要手动维护大量分散 yaml;Helm 把一套应用的所有资源封装为 Chart 包,实现一键安装、升级、回滚、卸载、多环境配置、模板复用。
✅ Helm 核心能力
- 简化部署:一条命令完成整套应用部署
- 版本管理:install/upgrade/rollback,升级故障快速回滚
- 配置解耦:通过 values.yaml/–set 区分开发、测试、生产环境
- 模板复用:Go Template 模板,消除重复 yaml 编写
- 包共享:Chart 可以上传仓库,团队复用
2. 三大核心概念⭐
表格
| 名词 | 说明 |
|---|---|
| Chart | 应用安装包。包含所有 k8s 资源模板 (deployment/service/configmap 等)、默认配置 values.yaml。类比 rpm/docker 镜像。 |
| Release | Chart 安装到集群后的运行实例。同一个 Chart 可以多次安装,生成多个独立 Release。 |
| Repository(仓库) | Chart 软件仓库,存放 tgz 格式 Chart 包;分为公共仓库 (bitnami)、私有仓库 (Harbor、ChartMuseum、OCI 仓库)。类比 yum 源、docker hub。 |
Artifact Hub:helm 的检索网站,本身不存储 Chart,只是搜索引擎。
helm search hub:联网查询 Artifact Hubhelm search repo:查询本地已经 add 的仓库缓存,不需要外网
3. Helm 工作流程
- 开发者编写 Chart 模板,打包 tgz 上传 Repository 仓库
- 用户 helm 客户端下载 Chart 包
- Helm 客户端本地做模板渲染:Chart 模板 + Values 配置 → 生成完整 k8s yaml
- helm 读取
~/.kube/config,调用 apiserver,把渲染后 yaml 提交 k8s 集群创建资源 - 集群生成 Release 运行实例
⚠Helm3 是纯客户端工具,只需要安装在管理节点,集群内部不需要部署 helm 服务组件。
二、Helm 安装
只在操作机器(master / 跳板机)安装,不需要所有节点部署。
#下载
wget https://get.helm.sh/helm-v3.16.0-linux-amd64.tar.gz
#解压
tar -zxvf helm-v3.16.0-linux-amd64.tar.gz
#放到系统PATH
mv linux-amd64/helm /usr/local/bin/helm
#验证版本
helm version
三、Helm 仓库管理命令
#添加仓库(bitnami国内加速源)
helm repo add bitnami https://helm-charts.itboon.top/bitnami
#查看本地已添加仓库
helm repo list
#更新仓库本地缓存(获取最新chart版本)
helm repo update
#删除仓库
helm repo remove bitnami
#搜索本地仓库内chart
helm search repo bitnami/nginx --versions
#下载chart到本地,不安装;--untar自动解压
helm pull bitnami/nginx --version 22.1.1 --untar
四、Release 生命周期核心命令⭐
Release:集群上运行的应用实例;每个 release 有唯一名称。
1. install 安装 release
#基础安装
helm install my‑nginx bitnami/nginx -n nginx‑ns --create‑namespace
#--set 临时覆盖配置
helm install my‑nginx bitnami/nginx \
-n nginx‑ns --create‑namespace \
--set service.type=NodePort
# --dry‑run 模拟安装,只输出渲染后的yaml,**不真正部署集群,用于调试模板**
helm install my‑nginx bitnami/nginx --dry‑run -n nginx‑ns
参数说明
--namespace / -n指定命名空间--create‑namespace命名空间不存在就自动创建--set key.subkey=value命令行覆盖 values 配置,多层 key 用.分隔
2. upgrade 升级 release
修改配置、升级 chart 版本,滚动更新,业务不中断
helm upgrade my‑nginx bitnami/nginx \
-n nginx‑ns \
--set service.type=ClusterIP
3. history 查看发布历史
每次 install、upgrade 都会生成一个REVISION修订版本号,版本从 1 开始递增。
helm history my‑nginx -n nginx‑ns
字段:REVISION 修订号、STATUS、CHART 版本、APP VERSION 业务镜像版本
4. rollback 版本回滚
升级出问题,回退到历史修订版本
#回退到revision=1版本
helm rollback my‑nginx 1 -n nginx‑ns
5. list 查询集群已经安装的 release
helm list -n nginx‑ns
helm list -A #全部命名空间
6. uninstall 卸载 release
删除 helm 创建的全部 k8s 资源(pod、svc、deployment 等)
helm uninstall my‑nginx -n nginx‑ns
#--keep‑history:卸载保留历史记录
helm uninstall my‑nginx -n nginx‑ns --keep‑history
7. show 查看 chart 信息
#查看chart元信息
helm show chart bitnami/nginx
#查看完整values.yaml默认配置
helm show values bitnami/nginx
重要区分
helm repo list:本地客户端配置的软件仓库列表,不等于集群安装应用helm list:k8s 集群内部已经部署的 Release 实例
五、Chart 目录结构(解压后)
nginx/
├── Chart.yaml ✅【必选】Chart元数据文件
├── values.yaml ✅ 默认配置参数
├── Chart.lock 依赖锁定文件,锁定子chart精确版本
├── values.schema.json values配置格式校验
├── README.md chart说明文档
├── charts/ 存放依赖的子Chart
└── templates/ ✅核心模板目录
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl #模板公共函数片段
├── NOTES.txt #安装完成输出提示文本
└── tests/
1. Chart.yaml 元数据
表格
| 字段 | 作用 |
|---|---|
apiVersion: v2 | helm3 固定版本 |
name | chart 包名称 |
version | Chart 包版本号(helm 包本身版本) |
appVersion | 应用镜像版本,部署业务程序版本 |
dependencies | 子 chart 依赖列表 |
description | 描述 |
⚠区分:
version是 helm 包版本;appVersion是业务镜像版本,二者可以不一样。
2. values.yaml
存放所有可配置参数;模板中通过{{ .Values.xxx }}语法读取变量。 安装时三种覆盖 values 的方式,优先级从低到高:
- chart 自带 values.yaml(最低优先级)
-f my‑values.yaml外部自定义 values 文件--set key=value命令行参数(最高优先级)
3. templates / 模板目录
存放 k8s 资源模板 yaml;helm 结合 values 渲染,把{{ }}变量替换为真实值,输出最终 k8s 资源。
_helpers.tpl:下划线开头文件不会渲染为 k8s 资源,存放可复用模板片段。NOTES.txt:安装结束输出给用户的提示信息。
4. charts/
存放依赖子 chart,例如 wordpress 依赖 mysql 子 chart。 Chart.yaml中dependencies声明依赖。
六、自定义 Chart 开发
1. 创建 chart 骨架
helm create mychart
自动生成完整目录结构。
2. 模板编写要点
- 使用
{{ .Values.xxx }}读取 values.yaml 变量
#deployment.yaml片段
spec:
replicas: {{ .Values.replicas }}
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
- 调试模板:
helm install xxx . --dry‑run,看渲染输出 yaml 是否正确。
3. 打包 chart
开发完成,把 chart 目录压缩为.tgz安装包,用于分发。
helm package mychart/
#输出 mychart‑0.1.0.tgz
4. OCI 私有仓库(Harbor)
现在主流使用 OCI 协议存储 chart 包:
#登录harbor oci仓库
helm registry login 192.168.100.149:80 --insecure -u admin -p xxx
#推送tgz包到harbor
helm push mychart‑0.1.0.tgz oci://192.168.100.149:80/helm --plain‑http
#从oci仓库安装
helm install my‑oci‑nginx oci://192.168.100.149:80/helm/mychart --plain‑http
七、离线部署流程(无外网环境)
helm pull把远程 chart 下载到本地- 解压或者直接使用 tgz 包
- 修改 values.yaml 配置镜像地址为内网镜像仓库
- 本地安装,
.代表当前 chart 目录
helm install my‑nginx . -n test‑ns
八、实战:bitnami chart 部署 redis/mysql
bitnami 大量开源中间件提供现成 chart,支持主从复制、持久化存储,配合 StorageClass 动态 PV。
- 修改 values.yaml
global.storageClass:指定动态存储类名称- auth 密码配置,开启主从架构
architecture: replication
- helm install 安装,可以用
--set批量替换镜像仓库地址适配内网。 - helm upgrade 调整副本数量;helm rollback 故障回滚。
九、高频面试题速记
- Helm 三大核心概念 Chart、Release、Repository?
- Chart:helm 应用包,包含 k8s 资源模板 + values 配置;
- Release:Chart 部署到 k8s 集群的运行实例,一个 chart 可以生成多个 release;
- Repository:chart 仓库,存放 tgz 包,公共 / 私有 harbor 仓库。
version和appVersion区别(Chart.yaml)
version:Chart 软件包自身版本号;appVersion:chart 里面封装的业务应用镜像版本。两者互相独立。
- values 配置覆盖优先级? chart 内置 values.yaml <
-f 自定义values.yaml<--set命令行参数。 - helm install /upgrade/rollback /uninstall 作用?
- install:首次安装 chart 生成 release;
- upgrade:升级 release(改配置 / 升级 chart 版本);
- rollback:回退到历史修订 revision 版本;
- uninstall:卸载 release,删除所有 k8s 资源。
helm dry‑run的作用? 模拟安装,不会向 k8s 集群创建任何资源;输出 helm 渲染完成后的 yaml,用于调试模板语法错误。helm repo list和helm list的区别?
- helm repo list:helm 客户端本地记录的软件仓库地址,和集群无关;
- helm list:查询 k8s 集群中已经部署的 release 应用实例。
- helm 工作原理,helm3 有没有集群内组件? helm3 是纯客户端工具;helm 本地读取 chart 和 values 完成模板渲染,调用 kube‑apiserver 提交 yaml,集群内部不需要运行 helm 服务组件。
- templates 目录中下划线开头文件(_helpers.tpl)有什么特点? 不会被渲染成 k8s 资源,用来存放公共可复用模板片段,供其他模板引用。
十、核心命令速查表
#仓库
helm repo add / list / update / remove
helm search repo / hub
helm pull
#release管理
helm install
helm upgrade
helm history
helm rollback
helm list [-A]
helm uninstall
helm show values
#开发调试
helm create
helm package
helm install . --dry‑run
#oci私有仓库
helm registry login
helm push