593_Helm包管理器
一句话概述:Helm 是 Kubernetes 的包管理器(相当于 K8s 的 apt/yum),用 Chart 模板打包应用的所有 K8s 资源,一条命令安装、升级、回滚复杂应用,是 K8s 生态最核心的工具之一。
核心知识点表
| 概念 | 白话解释 |
|---|
| Chart | 图表/包,一组 K8s 资源的模板集合(类似 RPM/DEB 包) |
| Release | 发布,Chart 安装到集群后的一个实例 |
| Repository | 仓库,存放 Chart 的地方(类似 apt 源) |
| Values | 值文件,自定义 Chart 参数的 YAML 配置 |
| Template | 模板,用 Go 模板语法生成 K8s YAML |
| Hook | 钩子,在安装/升级/删除的特定阶段执行操作 |
| OCI Registry | 用容器镜像仓库存储 Chart(新标准) |
安装配置
安装 Helm
# macOS
brew install helm # Homebrew 安装
# Linux(官方脚本)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 脚本会自动检测系统架构并安装最新版
# Ubuntu/Debian
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update && sudo apt install helm
# 验证安装
helm version # 查看版本(当前 v4.x)
添加 Chart 仓库
# 添加官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami # Bitnami(最大第三方仓库)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx # Nginx Ingress
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # Prometheus
# 更新仓库索引
helm repo update # 拉取最新 Chart 列表
# 查看已添加的仓库
helm repo list # 列出所有仓库
# 搜索 Chart
helm search repo nginx # 在本地仓库索引中搜索
helm search hub wordpress # 在 Artifact Hub 中搜索
基本使用
安装应用
# 安装 Nginx(最简方式)
helm install my-nginx bitnami/nginx # helm install <发布名> <Chart>
# my-nginx → Release 名称(自定义)
# bitnami/nginx → 仓库名/Chart 名
# 查看安装结果
helm list # 列出所有 Release
helm status my-nginx # 查看 Release 状态
# 自定义参数安装
helm install my-nginx bitnami/nginx \
--set service.type=ClusterIP \ # 设置 Service 类型
--set replicaCount=3 # 设置副本数
# 使用 values 文件安装(推荐)
helm install my-nginx bitnami/nginx \
-f my-values.yaml # 指定自定义值文件
# 安装到指定命名空间
helm install my-nginx bitnami/nginx \
--namespace web \ # 目标命名空间
--create-namespace # 不存在则自动创建
Values 文件
# my-values.yaml — 自定义 Nginx 配置
replicaCount: 3 # 3 个副本
image:
tag: "1.27" # 指定镜像版本
service:
type: LoadBalancer # Service 类型
port: 80 # 端口
resources:
requests:
memory: "64Mi" # 最低内存
cpu: "100m" # 最低 CPU
limits:
memory: "128Mi" # 最大内存
cpu: "250m" # 最大 CPU
ingress:
enabled: true # 启用 Ingress
hostname: nginx.example.com # 域名
tls: true # 启用 HTTPS
# 查看 Chart 的所有可配置参数
helm show values bitnami/nginx # 显示默认 values
helm show values bitnami/nginx > default-values.yaml # 保存到文件
升级和回滚
# 升级 Release
helm upgrade my-nginx bitnami/nginx \
--set replicaCount=5 # 修改副本数为 5
# 或
helm upgrade my-nginx bitnami/nginx \
-f my-values.yaml # 使用新的 values 文件
# 查看历史版本
helm history my-nginx # 查看所有版本记录
# 回滚到上一个版本
helm rollback my-nginx # 回滚到前一版本
# 回滚到指定版本
helm rollback my-nginx 2 # 回滚到版本 2
# 卸载 Release
helm uninstall my-nginx # 删除所有相关 K8s 资源
高级用法
创建自己的 Chart
# 创建 Chart 骨架
helm create my-app # 生成标准目录结构
# my-app/
# ├── Chart.yaml → Chart 元信息(名称、版本、描述)
# ├── values.yaml → 默认参数值
# ├── charts/ → 依赖的子 Chart
# ├── templates/ → K8s 资源模板
# │ ├── deployment.yaml → Deployment 模板
# │ ├── service.yaml → Service 模板
# │ ├── ingress.yaml → Ingress 模板
# │ ├── _helpers.tpl → 模板辅助函数
# │ └── NOTES.txt → 安装后提示信息
# └── .helmignore → 打包时忽略的文件
# Chart.yaml — Chart 元信息
apiVersion: v2 # Helm v3+ 使用 v2
name: my-app # Chart 名
description: 我的应用 Helm Chart # 描述
type: application # 类型:application 或 library
version: 0.1.0 # Chart 版本
appVersion: "1.0.0" # 应用版本
# templates/deployment.yaml — 使用 Go 模板语法
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }} # 引用 _helpers.tpl 的函数
labels:
{{- include "my-app.labels" . | nindent 4 }} # 引用标签模板
spec:
replicas: {{ .Values.replicaCount }} # 从 values.yaml 读取副本数
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }} # 使用 Chart 名
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # 镜像
ports:
- containerPort: {{ .Values.service.port }} # 容器端口
{{- if .Values.resources }} # 条件判断
resources:
{{- toYaml .Values.resources | nindent 12 }} # 转为 YAML
{{- end }}
# 调试和测试 Chart
helm template my-app ./my-app # 渲染模板(不安装)
helm template my-app ./my-app -f custom.yaml # 用自定义值渲染
helm lint ./my-app # 检查 Chart 语法
helm install my-app ./my-app --dry-run # 模拟安装(不实际执行)
# 打包和发布
helm package ./my-app # 打包为 .tgz 文件
helm push my-app-0.1.0.tgz oci://registry.example.com/charts # 推送到 OCI 仓库
OCI Registry(新标准)
# 登录 OCI 仓库
helm registry login registry.example.com # 登录镜像仓库
# 推送 Chart 到 OCI 仓库
helm push my-app-0.1.0.tgz oci://registry.example.com/charts
# 从 OCI 仓库安装
helm install my-app oci://registry.example.com/charts/my-app \
--version 0.1.0 # 指定版本
# 拉取 Chart
helm pull oci://registry.example.com/charts/my-app --version 0.1.0
依赖管理
# Chart.yaml — 声明依赖
dependencies:
- name: postgresql # 依赖 PostgreSQL Chart
version: "15.x.x" # 版本范围
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled # 条件启用
- name: redis # 依赖 Redis
version: "19.x.x"
repository: https://charts.bitnami.com/bitnami
# 下载依赖
helm dependency update ./my-app # 下载到 charts/ 目录
helm dependency build ./my-app # 构建依赖
helm dependency list ./my-app # 查看依赖列表
常见报错
| 报错信息 | 原因 | 解决方案 |
|---|
Error: INSTALLATION FAILED: cannot re-use a name | Release 名已存在 | 换名或 helm uninstall 旧的 |
Error: chart requires kubeVersion | K8s 版本不兼容 | 升级集群或使用旧版 Chart |
Error: template: ... not defined | 模板引用了不存在的变量 | 检查 values.yaml 和模板 |
Error: UPGRADE FAILED: has no deployed releases | Release 处于失败状态 | helm uninstall 后重新安装 |
Error: repo not found | 仓库未添加 | helm repo add 添加仓库 |
速查表
# === 仓库管理 ===
helm repo add NAME URL # 添加仓库
helm repo update # 更新索引
helm repo list # 列出仓库
helm repo remove NAME # 删除仓库
helm search repo KEYWORD # 搜索 Chart
# === Release 管理 ===
helm install NAME CHART # 安装
helm upgrade NAME CHART # 升级
helm rollback NAME [REVISION] # 回滚
helm uninstall NAME # 卸载
helm list # 列出 Release
helm status NAME # 查看状态
helm history NAME # 查看历史
# === Chart 开发 ===
helm create NAME # 创建 Chart
helm template NAME PATH # 渲染模板
helm lint PATH # 语法检查
helm package PATH # 打包
helm push FILE REGISTRY # 推送
# === 常用参数 ===
-f values.yaml # 指定 values 文件
--set key=value # 设置单个值
--namespace NS # 指定命名空间
--create-namespace # 自动创建命名空间
--dry-run # 模拟运行
--wait # 等待资源就绪
--timeout 5m # 超时时间
同类对比
| 特性 | Helm | Kustomize | Jsonnet | CDK8s |
|---|
| 方式 | 模板化 | 叠加补丁 | 编程 | 编程 |
| 语言 | Go 模板 | YAML | Jsonnet | TypeScript等 |
| 包管理 | 有(Chart) | 无 | 无 | 无 |
| 学习曲线 | 中等 | 低 | 高 | 中等 |
| 回滚 | 内置 | 需 GitOps | 需 GitOps | 需 GitOps |
| 生态 | 最大 | K8s 内置 | 小 | 发展中 |
| 适合场景 | 通用 | 简单定制 | 复杂配置 | 程序员 |
选型建议:K8s 应用打包分发首选 Helm(生态最成熟、Chart 仓库最丰富);简单的环境差异配置用 Kustomize(K8s 原生支持);两者可以结合使用。