K8S-Helm包管理全解-从入门到Chart开发实战指南

K8S Helm 包管理全解:从入门到生产级 Chart 开发实战指南

导读:在 Kubernetes 集群中,一个典型的微服务应用往往包含 Deployment、Service、Ingress、ConfigMap、Secret 等十几个甚至几十个 YAML 资源文件。手动管理这些资源不仅繁琐,而且难以复用和版本化。Helm 作为 K8S 的包管理器(CNCF 毕业项目),通过"模板化 + 参数化"的方式,将应用打包为 Chart,实现一键部署、升级、回滚。本文将从 Helm 的核心概念出发,带你从零完成 Chart 创建、Release 全生命周期管理、两种升级方式、版本回滚、公有仓库管理以及生产环境中的自研 Chart 开发实战。


一、为什么需要 Helm?

1.1 没有 Helm 的痛点

在 K8S 中部署一个应用,通常需要维护多个 YAML 文件:

bash 复制代码
# 一个典型应用的资源清单
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
kubectl apply -f configmap.yaml
kubectl apply -f serviceaccount.yaml
kubectl apply -f hpa.yaml

问题

痛点 说明
配置散落 十几个 YAML 文件散落在不同目录,管理混乱
重复配置 开发/测试/生产环境只有少量参数不同,却要维护多套完整清单
版本管理难 升级时需要手动逐个文件修改镜像版本、副本数等参数
无法回滚 升级失败后没有历史版本记录,难以快速回退
无法复用 每个项目都在"复制粘贴"相似的 YAML 模板

1.2 Helm 的解决方案

Helm 的核心思想:将 K8S 资源清单模板化,参数与模板分离

复制代码
Chart(模板 + 默认参数) + values.yaml(自定义参数) = Release(运行中的应用)

类比理解:Helm之于K8S,如同yum之于CentOS、apt之于Ubuntu、pip之于Python。它不是替代 kubectl,而是在 kubectl 之上提供了一层更高级的"包管理"抽象。

1.3 Helm 版本演进

版本 关键变化 说明
Helm 2 包含 Tiller 服务端组件 Tiller 具有集群管理员权限,存在安全隐患
Helm 3(2019.11) 移除 Tiller,纯客户端架构 直接通过 kubeconfig 与 API Server 通信,更安全
Helm 4(2025.11) 原生 OCI 强化、可观测性集成、CRD 存储 放弃 ConfigMaps/Secrets 存储,改用 CRD 管理版本信息

生产建议:目前推荐使用 Helm 3(稳定成熟),新项目可关注 Helm 4 的 OCI 原生支持能力。


二、Helm 核心概念

2.1 三大核心术语

理解 Helm,必须搞清楚以下三个概念的关系:

复制代码
┌─────────────┐      部署       ┌─────────────┐
│   Chart      │ ──────────→    │   Release    │
│  (软件包)    │               │  (运行实例)  │
└─────────────┘               └─────────────┘
     │ 1个Chart                    │ 可部署多次
     │                             │ 每次产生不同Release
     ├── Release A (dev)           │
     ├── Release B (test)          │
     └── Release C (prod)          │

Chart(软件包)

  • 一组 K8S 资源模板文件的集合,类似"安装包"
  • 包含 Chart.yaml(元信息)、values.yaml(默认参数)、templates/(模板文件)
  • 分为 application(可直接部署)和 library(被其他 Chart 引用的库)

Release(发行版)

  • 基于 Chart 部署后的运行实例
  • 同一个 Chart 可以部署多个 Release(如 dev/test/prod 环境)
  • 每个 Release 独立管理版本历史,支持独立升级和回滚

Repository(仓库)

  • 存放和共享 Chart 的仓库,类似 yum 的 repo
  • 支持公有仓库(Azure、阿里云等)和私有仓库(Harbor、ChartMuseum)

类比:Chart 好比"Nginx 的 RPM 包",Release 好比"安装了 Nginx 的那台服务器",Repository 好比"EPEL 源"。

2.2 Helm 3 架构

复制代码
Helm Client                    Kubernetes API Server
┌──────────────┐                ┌──────────────────┐
│ helm install │ ──kubeconfig──→│   K8S 资源创建   │
│ helm upgrade │                │   (直接通信)      │
│ helm rollback│                │                   │
│ helm template│                │  Release 信息存储  │
│              │                │  (Secrets/CRD)    │
└──────────────┘                └──────────────────┘

Helm 3 采用纯客户端架构,无需在集群内安装任何服务端组件。Release 的版本信息存储在 K8S 集群内的 Secrets(v3)或 CRD(v4)中。


三、安装与配置 Helm

3.1 安装 Helm 4

bash 复制代码
# 下载 Helm
wget https://get.helm.sh/helm-v4.1.4-linux-amd64.tar.gz

# 解压到系统路径
tar xf helm-v4.1.4-linux-amd64.tar.gz -C /usr/local/bin/ linux-amd64/helm --strip-components=1

# 验证版本
helm version
# version.BuildInfo{Version:"v4.1.4", GoVersion:"go1.25.9", ...}

3.2 配置命令补全

bash 复制代码
# 生成自动补全脚本
helm completion bash > /etc/bash_completion.d/helm

# 加载到当前 Shell
source /etc/bash_completion.d/helm
echo 'source /etc/bash_completion.d/helm' >> ~/.bashrc

配置完成后,输入 helm 后连续按两次 Tab 键即可看到所有子命令补全,日常使用非常方便。

3.3 Helm 常用命令速查

bash 复制代码
helm create NAME        # 创建一个新 Chart
helm install RNAME CHART # 安装 Chart(发布 Release)
helm upgrade RNAME CHART # 升级 Release
helm rollback RNAME [REV]# 回滚 Release
helm uninstall RNAME     # 卸载 Release
helm list               # 查看 Release 列表
helm history RNAME       # 查看 Release 历史版本
helm template CHART      # 本地渲染模板(不实际部署)
helm show [all|chart|values|readme] CHART  # 查看 Chart 信息
helm pull CHART          # 拉取 Chart 到本地
helm repo add|list|update|remove  # 管理仓库
helm search repo KEYWORD  # 搜索 Chart
helm package CHART_DIR    # 打包 Chart
helm lint CHART_DIR       # 检查 Chart 语法

四、Chart 结构详解

4.1 创建 Chart

bash 复制代码
helm create myapp

生成的目录结构:

复制代码
myapp/
├── Chart.yaml              # Chart 元信息(名称、版本、描述等)
├── values.yaml             # 默认配置值(核心文件)
├── charts/                 # 依赖的其他 Chart
└── templates/              # 模板文件目录
    ├── deployment.yaml     # Deployment 模板
    ├── service.yaml        # Service 模板
    ├── ingress.yaml        # Ingress 模板
    ├── serviceaccount.yaml # ServiceAccount 模板
    ├── hpa.yaml            # HorizontalPodAutoscaler 模板
    ├── _helpers.tpl        # 自定义模板函数(下划线开头不会渲染为 K8S 资源)
    ├── NOTES.txt           # 安装后的使用说明
    └── tests/
        └── test-connection.yaml  # 测试模板

4.2 关键文件说明

Chart.yaml --- Chart 的"身份证":

yaml 复制代码
apiVersion: v2          # Helm 3 使用 v2
name: myapp             # Chart 名称
description: A Helm chart for Kubernetes
type: application       # application(可部署)或 library(库类型)
version: 0.1.0          # Chart 版本(遵循 SemVer)
appVersion: "1.16.0"    # 应用版本(与 Chart 版本独立)

values.yaml --- 参数化配置的核心:

yaml 复制代码
# 默认配置值
replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: ""

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  hosts: []
  tls: []

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80

4.3 模板渲染原理

Helm 使用 Go 模板语法。在 templates/ 中的 YAML 文件里,通过 {``{ }} 引用 values.yaml 中的变量:

yaml 复制代码
# templates/deployment.yaml(简化版)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
  labels:
    {{- include "myapp.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}              # 引用副本数
  selector:
    matchLabels:
      {{- include "myapp.selectorLabels" . | nindent 6 }}
  template:
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
        # ↑ 镜像地址:tag,tag 为空时使用 Chart.AppVersion
        ports:
        - containerPort: 80

模板值覆盖优先级(从低到高):

复制代码
Chart 内 values.yaml(最低)< -f 自定义 values 文件 < --set 命令行参数(最高)

五、Release 全生命周期管理

5.1 安装(install)

bash 复制代码
# 基础安装
helm -n kube-public install myapp ./myapp

# 指定自定义 values 文件
helm -n kube-public install myapp ./myapp -f my-values.yaml

# 使用 --set 覆盖参数
helm -n kube-public install myapp ./myapp \
  --set replicaCount=3 \
  --set image.tag=v1 \
  --set image.repository=registry.cn-hangzhou.aliyuncs.com/aliyun-container-service/nginx-welcome-page:latest

安装后验证:

bash 复制代码
# 查看 Release 状态
helm list -n kube-public
# NAME   NAMESPACE   REVISION  STATUS    CHART          APP VERSION
# myapp  kube-public 1        deployed  myapp-0.1.0    1.16.0

# 查看 K8S 资源(Helm 自动创建了 Deploy、Svc、SA 等)
kubectl get deploy,svc,sa,pod -n kube-public

5.2 两种升级方式

Helm 提供两种升级方式,适用于不同场景:

方式一:基于 values 文件升级(推荐用于版本化管理)
bash 复制代码
# 1. 修改 values.yaml 中的参数
#    replicaCount: 1 → 3
#    tag: v1 → v2

# 2. 基于文件执行升级
helm -n kube-public upgrade myapp -f ./myapp/values.yaml myapp
# Release "myapp" has been upgraded. Happy Helming!
# REVISION: 2

适用场景 :团队协作时,将自定义的 my-values.yaml 纳入 Git 版本管理,实现"配置即代码"。

方式二:基于 --set 命令行升级(推荐用于临时/快速修改)
bash 复制代码
# 直接通过命令行覆盖参数
helm -n kube-public upgrade myapp \
  --set replicaCount=5 \
  --set image.tag=v3 \
  myapp
# Release "myapp" has been upgraded. Happy Helming!
# REVISION: 3

适用场景:临时测试、快速调试、CI/CD 流水线中动态注入参数。

两种方式对比
维度 -f 文件方式 --set 命令行方式
可追溯性 高,文件可纳入 Git 低,命令行不易留存
复用性 高,同一文件反复使用 低,每次都要重新输入
灵活性 中,需要提前写好文件 高,随时修改任何参数
组合使用 支持,-f a.yaml -f b.yaml --set key=val 支持,后者优先级最高
推荐场景 正式部署、多环境管理 临时调试、快速验证

5.3 版本回滚

Helm 会自动记录每次升级的历史版本,回滚时直接指定目标版本号即可。

查看历史版本
bash 复制代码
helm -n kube-public history myapp
# REVISION  UPDATED                   STATUS      CHART          APP VERSION  DESCRIPTION
# 1         Wed Dec 17 16:09:12 2025  superseded  myapp-0.1.0    1.16.0       Install complete
# 2         Wed Dec 17 16:12:43 2025  superseded  myapp-0.1.0    1.16.0       Upgrade complete
# 3         Wed Dec 17 16:15:29 2025  deployed    myapp-0.1.0    1.16.0       Upgrade complete

注意REVISION 是递增的,即使回滚也会产生新的版本号。每次回滚都是一次"向前"的新部署,不是简单的"撤销"。

回滚到上一个版本
bash 复制代码
# 回滚到上一个版本(即 REVISION 2)
helm -n kube-public rollback myapp
# Rollback was a success! Happy Helming!
# 产生 REVISION 4(内容等于 REVISION 2)
回滚到指定版本
bash 复制代码
# 回滚到 REVISION 1(初始版本)
helm -n kube-public rollback myapp 1
# Rollback was a success! Happy Helming!
# 产生 REVISION 5(内容等于 REVISION 1)
回滚效果验证
bash 复制代码
# 回滚后自动恢复到目标版本的配置
kubectl get deploy -n kube-public -o wide
# myapp → replicas=1, image=v1(回滚到 REVISION 1 的状态)

helm history myapp
# REVISION 5  ...  Rollback to 1    ← 当前运行版本

生产提示:Helm 的回滚比 Deployment 的回滚更强大------它不仅恢复 Pod 模板,还恢复 Service、Ingress、ConfigMap 等所有关联资源的版本。

5.4 卸载(uninstall)

bash 复制代码
# 卸载 Release(删除所有关联的 K8S 资源)
helm -n kube-public uninstall myapp

# 验证:Release 已删除,所有 K8S 资源同时清除
helm list -n kube-public
# (空)

kubectl get deploy,svc,sa -n kube-public
# (只剩下集群默认资源)

注意helm uninstall 会删除 Release 创建的所有 K8S 资源。如果只想暂停而非删除,可以使用 helm uninstall myapp --keep-history 保留历史记录。


六、Chart 模板开发实战

6.1 自定义镜像与参数

修改 values.yaml 使用私有镜像:

yaml 复制代码
# values.yaml
replicaCount: 1

image:
  repository: registry.cn-hangzhou.aliyuncs.com/aliyun-container-service/nginx-welcome-page:latest
  pullPolicy: IfNotPresent
  tag: "v1"

部署并验证:

bash 复制代码
helm -n kube-public install myapp ./myapp

# 验证 Pod 使用的镜像
kubectl get deploy -n kube-public -o wide
# myapp → image: registry.cn-hangzhou.aliyuncs.com/aliyun-container-service/nginx-welcome-page:latest:v1

# 访问测试
curl <CLUSTER-IP>

6.2 values 文件多环境管理

生产中通常为每个环境准备独立的 values 文件:

bash 复制代码
myapp/
├── Chart.yaml
├── values.yaml              # 默认值(开发环境)
├── values-staging.yaml      # 测试环境覆盖值
└── values-production.yaml   # 生产环境覆盖值
yaml 复制代码
# values-staging.yaml
replicaCount: 2
image:
  tag: "v2"

---
# values-production.yaml
replicaCount: 5
image:
  tag: "v2"
resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 200m
    memory: 256Mi
bash 复制代码
# 开发环境部署
helm -n dev install myapp ./myapp

# 测试环境部署
helm -n staging install myapp ./myapp -f values-staging.yaml

# 生产环境部署
helm -n production install myapp ./myapp -f values-production.yaml

6.3 本地渲染预览

在部署前,可以使用 helm template 预览生成的 K8S 资源清单,避免错误配置上线:

bash 复制代码
# 渲染模板(不实际部署)
helm template myapp ./myapp

# 指定 values 文件渲染
helm template myapp ./myapp -f values-production.yaml

# 渲染并输出到文件
helm template myapp ./myapp > rendered.yaml

6.4 语法检查

bash 复制代码
# 检查 Chart 语法错误
helm lint ./myapp
# ==> Linting ./myapp
# [INFO] Chart.yaml: icon is recommended
# 1 chart(s) linted, 0 chart(s) failed

七、公有 Chart 仓库管理

7.1 主流公有仓库

仓库 地址 说明
Artifact Hub https://artifacthub.io CNCF 官方 Chart 索引(推荐)
Bitnami https://charts.bitnami.com/bitnami 最活跃的社区仓库
Azure http://mirror.azure.cn/kubernetes/charts/ 微软维护(已归档)
阿里云 https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 国内访问友好

7.2 仓库管理实战

bash 复制代码
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add azure http://mirror.azure.cn/kubernetes/charts/

# 查看已添加的仓库
helm repo list

# 更新仓库索引(拉取最新的 Chart 列表)
helm repo update

# 搜索 Chart
helm search repo elasticsearch
# NAME                               CHART VERSION  APP VERSION  DESCRIPTION
# bitnami/elasticsearch               21.4.3         8.17.0       ...
# bitnami/elasticsearch-exporter      5.3.0          1.8.0        ...

# 搜索所有版本
helm search repo elasticsearch -l

# 查看 Chart 详情
helm show chart bitnami/elasticsearch
helm show values bitnami/elasticsearch  # 查看默认配置
helm show readme bitnami/elasticsearch  # 查看 README 文档

# 拉取 Chart 到本地
helm pull bitnami/elasticsearch
# 得到 elasticsearch-21.4.3.tgz

# 拉取指定版本
helm pull bitnami/elasticsearch --version 21.4.2

# 删除仓库
helm repo remove azure

7.3 基于公有 Chart 快速部署

bash 复制代码
# 一键部署 elasticsearch-exporter(Prometheus 的 ES 监控导出器)
helm -n monitoring install elasticsearch-exporter bitnami/elasticsearch-exporter

# 自定义参数部署
helm -n monitoring install elasticsearch-exporter bitnami/elasticsearch-exporter \
  --set es.uri=http://elasticsearch:9200

八、Chart 打包与分享

8.1 打包 Chart

bash 复制代码
# 将 Chart 目录打包为 .tgz 文件
helm package ./myapp
# Successfully packaged chart and saved it to: myapp-0.1.0.tgz

8.2 Chart 版本管理

遵循 语义化版本(SemVer) 规范:

复制代码
MAJOR.MINOR.PATCH
  │      │     │
  │      │     └── 补丁版本:Bug 修复,向后兼容
  │      └──────── 次版本:新增功能,向后兼容
  └─────────────── 主版本:Breaking Change,可能不向后兼容

升级 Chart.yaml 中的 version 字段:

yaml 复制代码
# Chart.yaml
version: 0.2.0  # 从 0.1.0 升级到 0.2.0(新增功能)
appVersion: "1.18.0"  # 应用版本独立于 Chart 版本

8.3 模板预渲染最佳实践

在正式部署前,建议先在本地预渲染并检查生成的 YAML:

bash 复制代码
# 预渲染 + 语法检查 + 部署(三步走)
helm lint ./myapp
helm template myapp ./myapp -f values-production.yaml
helm -n production upgrade myapp ./myapp -f values-production.yaml

九、Helm 生产环境最佳实践

9.1 命名规范

bash 复制代码
# Release 命名:应用名-环境名
helm -n production install nginx-prod ./nginx
helm -n staging install nginx-staging ./nginx
helm -n dev install nginx-dev ./nginx

# Chart 命名:team-app
# 例如: platform-redis, backend-api, frontend-web

9.2 配置管理策略

策略 说明 适用场景
默认 values.yaml Chart 内置默认值,适合开发环境 快速启动
环境级 values 文件 每个环境一个 values 文件 多环境管理
--set 覆盖 命令行动态注入 CI/CD 流水线
组合使用 -f base.yaml -f env.yaml --set key=val 最灵活

参数覆盖优先级:Chart values.yaml < -f 文件 < -f 多文件(后者覆盖前者) < --set

9.3 升级与回滚策略

bash 复制代码
# 升级前先预览变更(dry-run)
helm -n production upgrade myapp ./myapp -f values-production.yaml --dry-run

# 确认无误后执行升级
helm -n production upgrade myapp ./myapp -f values-production.yaml

# 升级失败时,立即回滚
helm -n production rollback myapp

9.4 常用操作速查表

操作 命令
创建 Chart helm create myapp
安装 Release helm -n NS install RNAME ./chart
基于文件升级 helm -n NS upgrade RNAME -f vals.yaml ./chart
基于 --set 升级 helm -n NS upgrade RNAME --set key=val ./chart
查看历史 helm -n NS history RNAME
回滚到上一版本 helm -n NS rollback RNAME
回滚到指定版本 helm -n NS rollback RNAME [REVISION]
查看 Release 列表 helm list -n NShelm list -A
卸载 Release helm -n NS uninstall RNAME
预览渲染 helm template RNAME ./chart -f vals.yaml
语法检查 helm lint ./chart
搜索 Chart helm search repo KEYWORD
查看 Chart 详情 `helm show values
拉取 Chart helm pull REPO/CHART [--version VER]
打包 Chart helm package ./chart

十、Helm vs 手动管理对比总结

维度 手动 kubectl apply Helm 管理
部署方式 逐个文件 apply 一条命令
参数管理 修改每个 YAML 修改 values.yaml
多环境 复制多套 YAML 多个 values 文件
版本回滚 依赖 Deployment 回滚 全资源级别回滚
应用分享 复制 YAML 文件 打包 Chart 仓库分发
团队协作 Git 管理 YAML Git 管理 Chart + values
可追溯性 helm history 完整记录
学习成本 中(需学习模板语法)

十一、总结

本文系统讲解了 Helm 包管理的完整知识体系:

模块 核心内容
概念基础 Chart / Release / Repository 三大核心概念、Helm 2/3/4 架构演进
安装配置 Helm 安装、命令补全、常用命令速查
Chart 结构 目录结构、Chart.yaml 元信息、values.yaml 参数化、Go 模板语法
生命周期 install 安装、两种 upgrade 方式(-f 文件 vs --set)、rollback 回滚、uninstall 卸载
模板开发 多环境 values 管理、helm template 预渲染、helm lint 语法检查
仓库管理 公有仓库添加/搜索/拉取、Chart 打包与分享
最佳实践 命名规范、配置管理策略、升级回滚策略、操作速查表
相关推荐
蘋天纬地20 小时前
k8s的控制平面是什么,有什么作用
容器·kubernetes
无级程序员1 天前
clklog地域分析中的地名中英文对照问题解决
kubernetes
加加and减减1 天前
Docker真实安装mysql8教程并优化配置
运维·mysql·docker·容器
qiuziqiqi1 天前
ocker-compose.yml 和Dockerfile 区别
运维·docker·容器
杰克逊的日记1 天前
如何在不影响业务的情况下对K8S集群升级
云原生·容器·kubernetes
逻极1 天前
Kubernetes 从入门到精通:云原生容器编排
kubernetes·k8s·服务发现·容器编排
nvd111 天前
Terraform 避坑:模块下线时,如何不破坏已有的 Instance Template?
云原生·terraform
极客先躯1 天前
高级java每日一道面试题-2026年02月03日-实战篇[Docker]-如何备份和恢复 Docker Volume?
运维·docker·容器·自动化·备份·持久化·恢复
江湖有缘1 天前
自建私有任务管理平台|Docker Compose部署Ticky完整教程
运维·docker·容器
子牙老师1 天前
你管这破玩意叫ChatGPT?
云原生·chatgpt·容器