引言
在前面十几天的学习中,我们已经掌握了 Kubernetes 的核心对象:Pod、Deployment、Service、ConfigMap、Secret、PV/PVC 等。随着要部署的应用越来越多,一个现实的问题摆在了我们面前:如果每个应用都要手写一大摞 YAML 文件,还要在开发、测试、生产环境之间反复修改镜像版本、副本数、资源配置,不仅效率低下,而且极易出错。有没有一种工具,能把一组 Kubernetes 资源打包成一个可复用、可参数化、可版本管理的”软件包”呢?答案就是 Helm——Kubernetes 生态中最流行的包管理器,被称为”K8s 世界的 apt/yum”。

本篇文章,我们就从 Helm 的核心概念讲起,一步步带你完成 Chart 的编写、模板化、打包、安装与升级,真正把应用交付变成一件轻松可控的事情。
核心概念
什么是 Helm
Helm 是 CNCF 毕业项目,它的作用是把一个应用的整套 Kubernetes 资源(Deployment、Service、ConfigMap、Ingress 等)组织成一个 Chart(图表/包),并提供安装、升级、回滚、卸载等完整的生命周期管理能力。有了 Helm,部署一个完整的应用只需要一条命令:
helm install my-release ./my-chart
Chart、Release 与 Repository
- Chart:应用的打包格式,本质是一个包含模板文件和元数据的目录,描述了一个应用需要哪些资源以及这些资源的默认配置。
- Release:Chart 在集群中的一次安装实例。同一个 Chart 可以用不同配置安装出多个 Release,例如
dev-mysql和prod-mysql。 - Repository(仓库):存放 Chart 的服务器,类似于 Docker Registry 或 yum 源,例如官方的
artifacthub.io与常见的bitnami仓库。 - values.yaml:Chart 的参数文件,模板中的变量从这里取值,是”一次编写、多环境复用”的关键。
Helm 3 之后移除了服务端组件 Tiller,客户端直接通过 kubeconfig 与 API Server 交互,安全性大幅提升,也简化了部署。
实战步骤
1. 安装 Helm
以 Linux 环境为例,下载二进制并解压到 PATH:
curl -fsSL https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gz -o helm.tgz
tar -zxvf helm.tgz
sudo mv linux-amd64/helm /usr/local/bin/helm
helm version --short
输出类似 v3.14.0+g9fda02b 即表示安装成功。
2. 初始化仓库并搜索 Chart
# 添加 bitnami 官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 搜索可用的 Chart
helm search repo nginx
helm search hub prometheus
helm search repo 只搜索本地已添加的仓库,helm search hub 则搜索整个 Artifact Hub。
3. 安装一个现成的 Chart
以 nginx 为例,安装并暴露服务:
helm install my-nginx bitnami/nginx
--set service.type=NodePort
--set replicaCount=2
安装完成后可以用下面的命令查看 Release 状态与资源:
helm list
helm status my-nginx
kubectl get pods
4. 创建并编写自己的 Chart
helm create 可以快速生成一个标准的 Chart 骨架:
helm create my-app
tree my-app
生成的目录结构如下:
my-app/
├── Chart.yaml # Chart 元数据
├── values.yaml # 默认配置参数
├── charts/ # 依赖的子 Chart
└── templates/ # 资源模板文件
├── deployment.yaml
├── service.yaml
├── hpa.yaml
├── ingress.yaml
├── serviceaccount.yaml
├── NOTES.txt
└── _helpers.tpl # 模板辅助函数
Chart.yaml 描述 Chart 的基本信息:
apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
模板文件使用 Go 模板语法,可以从 values.yaml 中取值。例如 templates/deployment.yaml 中的副本数:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
其中 {{ .Values.replicaCount }}、{{ .Values.image.repository }} 都会在渲染时替换为 values.yaml 里的值。
5. 模板渲染与语法检查
在真正安装前,先用 helm template 查看渲染结果,用 helm lint 检查语法:
# 渲染模板并输出到控制台
helm template my-app ./my-app
# 语法与规范检查
helm lint ./my-app
# 使用自定义 values 覆盖默认值
helm template my-app ./my-app -f production.yaml
6. 安装、升级与回滚
# 安装
helm install my-app ./my-app --namespace default
# 升级(修改 values 或 Chart 后)
helm upgrade my-app ./my-app --set image.tag=1.17.0
# 查看历史版本
helm history my-app
# 回滚到上一个版本
helm rollback my-app 1
# 卸载
helm uninstall my-app
7. 打包与发布到仓库
把写好的 Chart 打成 .tgz 包,便于分发:
helm package ./my-app
# 生成 my-app-0.1.0.tgz
# 为仓库生成索引
helm repo index . --url https://charts.example.com
常见问题
1. 修改 values 后安装没有生效?
使用 helm upgrade 而不是重复 helm install,因为同名 Release 已存在时会报错。另外确认 values 层级写对,可用 helm get values my-app 查看当前生效的配置。
2. helm install 报 release name already exists?
Release 名称在 namespace 内唯一。可以换一个名字,或者先 helm uninstall 旧 Release,再重新安装。
3. 模板渲染结果不符合预期?
先 helm lint 检查语法,再用 helm template --debug 查看渲染过程与最终输出,定位是 values 覆盖问题还是模板逻辑问题。
4. 如何管理敏感配置?
不要在 values.yaml 中明文写密码,可以结合 Secret 与外部值文件,或使用 helm-secrets 插件对 values 文件加密。
总结
Helm 把 Kubernetes 的资源交付从”手写 YAML”提升为”包管理”,通过 Chart 模板化、values 参数化、Release 版本化,让应用在多环境之间快速、一致、可回滚地部署。本文我们从 Helm 的三大核心概念出发,完成了从安装、建 Chart、写模板、渲染校验到打包发布的完整闭环。
掌握了 Helm 之后,下一篇文章我们将继续深入工作负载的世界,讲解 StatefulSet、DaemonSet 与 Job 这三种高级控制器,看看有状态应用、守护进程和一次性任务在 Kubernetes 中是如何被优雅地管理的。
下期预告
第 16 天:工作负载进阶——StatefulSet、DaemonSet 与 Job,我们将详细拆解这三类控制器的使用场景、生命周期与实战案例,敬请期待!


















暂无评论内容