Helm 包管理器:Kubernetes 应用分发与模板化

FreeGuideOnline 最新 2026-06-13

Helm 包管理器:Kubernetes 应用分发与模板化

Helm 是 Kubernetes 生态中的包管理器,类似于 CentOS 的 yum 或 Ubuntu 的 apt。它解决了复杂应用的部署、升级与管理难题,通过 Chart 将一组 Kubernetes 资源定义封装为可复用、可参数化的软件包,实现一键分发、模板化部署和版本控制。

什么是 Helm?

在没有 Helm 时,部署一个应用需要手动维护多个 YAML 文件(Deployment、Service、ConfigMap等),环境差异导致配置散落,版本追踪困难。Helm 提供了:

  • 应用分发:将 K8s 资源打包为 Chart,通过仓库共享。
  • 模板化:抽离可变参数,通过 values.yaml 注入,实现“一份代码,多环境部署”。
  • 生命周期管理:通过 Release 跟踪每次安装、升级、回滚的状态。

Helm 由 CNCF 维护,是生产环境中 Kubernetes 应用交付的事实标准。

核心概念

理解 Helm 必须掌握以下四个核心概念:

  • Chart
    包含创建 Kubernetes 应用所需全部资源定义的 。Chart 是一个目录,内有自描述文件(Chart.yaml)、模板(templates/)和默认值(values.yaml)。

  • Repository
    存放和共享 Chart 的 仓库。官方维护了 https://hub.helm.sh(现已重定向至 Artifact Hub),也可以自建私有仓库。

  • Release
    在 Kubernetes 集群上运行的一个 Chart 实例。通过 helm install 创建,同一 Chart 可安装多个 Release(如 dev-mysqlprod-mysql)。

  • Values
    可配置参数,用于填充模板中的占位符。通过 values.yaml 文件默认值,安装时可用 --set 或自定义 values 文件覆盖,实现环境差异化。

安装 Helm

Helm 采用客户端-服务端架构,Helm v3 移除了 Tiller 服务端,仅需安装客户端二进制文件即可。

Linux / macOS(脚本安装)

curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Windows(包管理)

# Chocolatey
choco install kubernetes-helm

# Scoop
scoop install helm

验证安装

helm version --short

确保已配置好 kubectl 上下文且能访问目标集群,Helm 将自动使用当前上下文。

使用 Helm 仓库

添加官方仓库

# 添加 Bitnami 仓库(常用 Chart 来源)
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新本地仓库缓存
helm repo update

搜索 Chart

helm search repo bitnami/mysql
# 列出仓库中所有 Chart
helm search repo bitnami

查看 Chart 详细信息

helm show chart bitnami/mysql
helm show readme bitnami/mysql
helm show values bitnami/mysql    # 所有可用配置项

安装和管理 Release

安装 Release

# 基本安装,Release 名为 my-app
helm install my-app bitnami/nginx

# 指定命名空间
helm install my-app bitnami/nginx -n production

# 使用自定义 values 文件
helm install my-app bitnami/nginx -f custom-values.yaml

# 命令行直接设置个别值
helm install my-app bitnami/nginx --set service.type=NodePort

安装成功后,命令会输出访问信息、状态说明。

查看 Release

# 列出当前命名空间下的 Release
helm list

# 查看指定 Release 的详细信息(包括部署资源和用户自定义 Values)
helm get all my-app

# 查看 Values 配置
helm get values my-app

升级 Release

修改 values.yaml 或使用 --set 后执行升级:

helm upgrade my-app bitnami/nginx -f new-values.yaml

升级会触发资源更新,并自动保存历史版本以便回滚。

回滚 Release

# 查看历史版本
helm history my-app

# 回滚到上一个版本
helm rollback my-app

# 回滚到指定 REVISION
helm rollback my-app 2

卸载 Release

helm uninstall my-app
# 保留历史记录以便审计(默认保留)
# 彻底清除记录:--no-hooks 禁用钩子,--keep-history 禁用?
# 实际删除记录可加 --no-hooks

Chart 结构详解

一个标准 Chart 目录结构如下:

mychart/
├── Chart.yaml           # Chart 元数据(名称、版本、描述等)
├── values.yaml          # 默认配置值,模板的占位符取值来源
├── templates/           # 模板文件,渲染生成 Kubernetes 资源清单
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl     # 命名模板/辅助函数(局部复用)
│   ├── NOTES.txt        # 安装后显示的使用帮助
│   └── ...
├── charts/              # 依赖的子 Chart(或通过 Chart.lock 管理)
├── .helmignore          # 打包时忽略的文件列表
└── README.md

Chart.yaml

apiVersion: v2
name: my-app
description: A simple application
type: application           # application 或 library
version: 0.1.0             # Chart 自身版本
appVersion: "1.16.0"       # 应用版本

values.yaml

定义可配置参数,例如:

replicaCount: 2
image:
  repository: myapp
  tag: latest
  pullPolicy: IfNotPresent
service:
  type: ClusterIP
  port: 80

Helm 模板化基础

模板文件采用 Go Template 语法,并注入 Helm 内置对象和自定义 Values。

基本占位符

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deploy
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}

此处 . 是上下文,.Values 对应 values.yaml 内容;.Release 包含 Release 相关信息;.Chart 引用 Chart.yaml 中的元数据。

常用函数与管道

# upper 转大写
{{ .Values.appName | upper | quote }}

# default 提供默认值
image: "{{ .Values.image.repository | default "nginx" }}"

条件控制

{{- if .Values.persistence.enabled }}
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: {{ .Release.Name }}-pvc
{{- end }}

{{- 移除模板生成的空白行。

循环与范围

containers:
{{- range .Values.containers }}
  - name: {{ .name }}
    image: {{ .image }}
{{- end }}

与之对应的 values 可能是:

containers:
  - name: app
    image: app:v1
  - name: sidecar
    image: sidecar:v2

命名模板(_helpers.tpl)

定义可复用片段:

{{/* 定义全限定名 */}}
{{- define "mychart.fullname" -}}
{{- .Release.Name }}-{{ .Chart.Name }}
{{- end }}

在 deployment.yaml 中使用:

name: {{ include "mychart.fullname" . }}

自定义 Chart:从零开始

1. 创建 Chart 骨架

helm create my-first-chart
cd my-first-chart

生成标准目录结构,包含基础部署模板与 Nginx 示例。

2. 清理预设内容(可选)

删除 templates/ 下你不想要的模板,或直接重置。

3. 编写核心模板

以部署一个简单 Python 应用为例,修改 values.yaml

replicaCount: 1
image:
  repository: "myorg/python-app"
  tag: "1.0.0"
service:
  type: ClusterIP
  port: 5000

templates/ 创建 deployment.yamlservice.yaml,使用模板变量。

4. 本地验证渲染结果

# 模拟渲染,输出所有生成的 YAML 到控制台
helm template ./my-first-chart

# 使用特定 values 文件验证
helm template ./my-first-chart -f path/to/values.yaml

5. 安装调试

helm install test-release ./my-first-chart --dry-run --debug

--dry-run 不会实际部署,但会输出提交给 K8s 的完整资源清单;--debug 给出详细日志。

6. 打包与分发

# 打成 .tgz 包
helm package ./my-first-chart

# 可以推送到 Chart 仓库(需要配置),或直接通过文件安装
helm install my-app my-first-chart-0.1.0.tgz

最佳实践与技巧

  • 版本管理
    始终在 Chart.yaml 中增加 version 并记录变动。使用 helm package 生成的包名自动包含版本号。

  • 依赖管理
    复杂应用常依赖其他 Chart(如数据库),使用 dependencies 字段或在 Chart.yaml 中定义,配合 helm dependency update 下载子 Chart。

  • 密钥与安全
    敏感信息(密码、Token)不应直接写入 values.yaml,可使用 Kubernetes Secret 并配合模板函数 lookup,或者通过外部密钥管理工具(如 helm-secrets 插件结合 SOPS)处理加密。

  • 保持模板简洁
    将复杂逻辑抽离为命名模板,利用 _helpers.tpl 复用。避免过多条件嵌套,可读性优先。

  • 使用 NOTES.txt 提供指引
    安装完成后自动输出使用说明、访问 URL、下一步操作,提升体验。

  • 升级策略
    生产环境升级前先用 helm diff 插件对比变更,避免意外覆盖。

总结

Helm 通过 Chart 打包、模板化配置和 Release 管理 极大简化了 Kubernetes 应用的部署流程。从搜索社区仓库到自定义私有 Chart,从基础安装到多环境参数化,掌握 Helm 已经成为云原生运维和开发者的必备技能。初学者应从理解核心概念开始,逐步实践 helm create、本地渲染、安装调试,最终构建符合团队规范的 Chart 并纳入 CI/CD 流程。