09-Helm 包管理

Helm 包管理

概念引入

安装一个应用需要多少 YAML?一个 WordPress 至少需要:Deployment、Service、PVC、ConfigMap、Secret、Ingress......手写 6 个文件,每个几十行,还要处理它们之间的依赖关系。

Helm 就是 K8s 的"包管理器",类似 Linux 的 apt/yum,或 Node.js 的 npm。一条命令就能安装整个应用,所有 YAML 都打包好了。
#mermaid-svg-GoNXL3i9cV8qX5B3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GoNXL3i9cV8qX5B3 .error-icon{fill:#552222;}#mermaid-svg-GoNXL3i9cV8qX5B3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GoNXL3i9cV8qX5B3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .marker.cross{stroke:#333333;}#mermaid-svg-GoNXL3i9cV8qX5B3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GoNXL3i9cV8qX5B3 p{margin:0;}#mermaid-svg-GoNXL3i9cV8qX5B3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster-label text{fill:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster-label span{color:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster-label span p{background-color:transparent;}#mermaid-svg-GoNXL3i9cV8qX5B3 .label text,#mermaid-svg-GoNXL3i9cV8qX5B3 span{fill:#333;color:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .node rect,#mermaid-svg-GoNXL3i9cV8qX5B3 .node circle,#mermaid-svg-GoNXL3i9cV8qX5B3 .node ellipse,#mermaid-svg-GoNXL3i9cV8qX5B3 .node polygon,#mermaid-svg-GoNXL3i9cV8qX5B3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .rough-node .label text,#mermaid-svg-GoNXL3i9cV8qX5B3 .node .label text,#mermaid-svg-GoNXL3i9cV8qX5B3 .image-shape .label,#mermaid-svg-GoNXL3i9cV8qX5B3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-GoNXL3i9cV8qX5B3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .rough-node .label,#mermaid-svg-GoNXL3i9cV8qX5B3 .node .label,#mermaid-svg-GoNXL3i9cV8qX5B3 .image-shape .label,#mermaid-svg-GoNXL3i9cV8qX5B3 .icon-shape .label{text-align:center;}#mermaid-svg-GoNXL3i9cV8qX5B3 .node.clickable{cursor:pointer;}#mermaid-svg-GoNXL3i9cV8qX5B3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .arrowheadPath{fill:#333333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GoNXL3i9cV8qX5B3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GoNXL3i9cV8qX5B3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GoNXL3i9cV8qX5B3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster text{fill:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 .cluster span{color:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GoNXL3i9cV8qX5B3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GoNXL3i9cV8qX5B3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-GoNXL3i9cV8qX5B3 .icon-shape,#mermaid-svg-GoNXL3i9cV8qX5B3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GoNXL3i9cV8qX5B3 .icon-shape p,#mermaid-svg-GoNXL3i9cV8qX5B3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GoNXL3i9cV8qX5B3 .icon-shape .label rect,#mermaid-svg-GoNXL3i9cV8qX5B3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GoNXL3i9cV8qX5B3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GoNXL3i9cV8qX5B3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GoNXL3i9cV8qX5B3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} K8s 世界
Chart.yaml
helm install
完整 K8s 应用
Node.js 世界
package.json
npm install
完整应用

原理讲解

三个核心概念

概念 含义 类比
Chart 一个 Helm 包,包含所有 K8s 资源定义 npm 的 package
Release Chart 的一次安装实例 npm install 后的 node_modules
Repository 存放 Chart 的仓库 npm registry (npmjs.com)

Chart 的结构

复制代码
my-chart/
├── Chart.yaml          # Chart 的元数据(名字、版本、描述)
├── values.yaml         # 默认配置值(用户可以覆盖)
├── templates/          # K8s 资源模板
│   ├── deployment.yaml # Deployment 模板(Go 模板语法)
│   ├── service.yaml    # Service 模板
│   └── ingress.yaml    # Ingress 模板
└── charts/             # 依赖的子 Chart

模板 + Values = 可定制

Helm 的强大之处在于模板化。同一个 Chart,通过传不同的 values,可以部署到不同环境:

yaml 复制代码
# values.yaml(默认值)
replicaCount: 1
image:
  repository: nginx
  tag: "1.27"

# values-prod.yaml(生产环境覆盖)
replicaCount: 3
image:
  tag: "1.27-alpine"
resources:
  limits:
    cpu: 500m
    memory: 256Mi
bash 复制代码
# 开发环境:用默认值
helm install web my-chart

# 生产环境:用自定义值
helm install web my-chart -f values-prod.yaml

# 也可以直接覆盖单个值
helm install web my-chart --set replicaCount=3

常用命令

bash 复制代码
# 创建 Chart
helm create my-chart                  # scaffold 一个标准 Chart

# 安装
helm install my-app ./my-chart/       # 从本地目录安装
helm install my-app bitnami/nginx     # 从仓库安装(需要先 helm repo add)

# 管理
helm list                             # 查看所有 Release
helm status my-app                    # 查看 Release 状态
helm upgrade my-app ./my-chart/       # 升级
helm rollback my-app 1                # 回滚到版本 1
helm uninstall my-app                 # 卸载

# 调试
helm template ./my-chart/             # 预览渲染后的 YAML(不连接集群)
helm install my-app ./my-chart/ --dry-run  # 模拟安装(校验语法)
helm get values my-app                # 查看已安装 Release 的 values
helm history my-app                   # 查看版本历史

Helm 的版本管理

每次 helm upgrade 都会创建一个新的版本(revision)。你可以随时回滚:
#mermaid-svg-tkEPfVAZ9meXmn4D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tkEPfVAZ9meXmn4D .error-icon{fill:#552222;}#mermaid-svg-tkEPfVAZ9meXmn4D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tkEPfVAZ9meXmn4D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tkEPfVAZ9meXmn4D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tkEPfVAZ9meXmn4D .marker.cross{stroke:#333333;}#mermaid-svg-tkEPfVAZ9meXmn4D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tkEPfVAZ9meXmn4D p{margin:0;}#mermaid-svg-tkEPfVAZ9meXmn4D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster-label text{fill:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster-label span{color:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster-label span p{background-color:transparent;}#mermaid-svg-tkEPfVAZ9meXmn4D .label text,#mermaid-svg-tkEPfVAZ9meXmn4D span{fill:#333;color:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D .node rect,#mermaid-svg-tkEPfVAZ9meXmn4D .node circle,#mermaid-svg-tkEPfVAZ9meXmn4D .node ellipse,#mermaid-svg-tkEPfVAZ9meXmn4D .node polygon,#mermaid-svg-tkEPfVAZ9meXmn4D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tkEPfVAZ9meXmn4D .rough-node .label text,#mermaid-svg-tkEPfVAZ9meXmn4D .node .label text,#mermaid-svg-tkEPfVAZ9meXmn4D .image-shape .label,#mermaid-svg-tkEPfVAZ9meXmn4D .icon-shape .label{text-anchor:middle;}#mermaid-svg-tkEPfVAZ9meXmn4D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tkEPfVAZ9meXmn4D .rough-node .label,#mermaid-svg-tkEPfVAZ9meXmn4D .node .label,#mermaid-svg-tkEPfVAZ9meXmn4D .image-shape .label,#mermaid-svg-tkEPfVAZ9meXmn4D .icon-shape .label{text-align:center;}#mermaid-svg-tkEPfVAZ9meXmn4D .node.clickable{cursor:pointer;}#mermaid-svg-tkEPfVAZ9meXmn4D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tkEPfVAZ9meXmn4D .arrowheadPath{fill:#333333;}#mermaid-svg-tkEPfVAZ9meXmn4D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tkEPfVAZ9meXmn4D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tkEPfVAZ9meXmn4D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tkEPfVAZ9meXmn4D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tkEPfVAZ9meXmn4D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tkEPfVAZ9meXmn4D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster text{fill:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D .cluster span{color:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tkEPfVAZ9meXmn4D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tkEPfVAZ9meXmn4D rect.text{fill:none;stroke-width:0;}#mermaid-svg-tkEPfVAZ9meXmn4D .icon-shape,#mermaid-svg-tkEPfVAZ9meXmn4D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tkEPfVAZ9meXmn4D .icon-shape p,#mermaid-svg-tkEPfVAZ9meXmn4D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tkEPfVAZ9meXmn4D .icon-shape .label rect,#mermaid-svg-tkEPfVAZ9meXmn4D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tkEPfVAZ9meXmn4D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tkEPfVAZ9meXmn4D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tkEPfVAZ9meXmn4D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} helm rollback 1
v1: 初始安装
v2: 升级
v3: 改配置
回到 v1 状态
每个 revision 都保留

随时可以回滚

动手实验

配套实验位于 docs/labs/beginner/helm/

本实验不依赖外部 Chart 仓库 ------用 helm create 从零创建本地 Chart,避免网络问题。

步骤 1:创建集群和本地 Chart

bash 复制代码
cd docs/labs/beginner/helm
bash setup.sh

setup.sh 会自动创建一个本地 Helm Chart(my-chart/),镜像使用 nginx:1.27。

步骤 2:认识 Chart 结构

bash 复制代码
# 查看 Chart 的文件结构
ls -R my-chart/

# 查看默认配置
cat my-chart/values.yaml

# 预览渲染后的 YAML(不实际安装)
helm template my-chart/

步骤 3:安装和自定义

bash 复制代码
# 从本地 Chart 安装
helm install my-nginx ./my-chart

# 查看 Release
helm list

# 查看 Helm 创建的资源
kubectl get all -l app.kubernetes.io/instance=my-nginx

# 用自定义值安装第二个实例
helm install custom-nginx ./my-chart \
  --set replicaCount=2 \
  --set service.type=NodePort

# 对比两个 Release 的值
helm get values my-nginx
helm get values custom-nginx

步骤 4:升级和回滚

bash 复制代码
# 升级到 3 个副本
helm upgrade my-nginx ./my-chart --set replicaCount=3

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

# 回滚到版本 1
helm rollback my-nginx 1

# 确认回滚成功
helm history my-nginx
kubectl get pods -l app.kubernetes.io/instance=my-nginx

步骤 5:清理

bash 复制代码
bash teardown.sh

自检问题

  1. Chart、Release、Repository 分别是什么?

查看答案 **Chart** 是一个 Helm 包,包含一组 K8s 资源模板和默认配置。**Release** 是 Chart 被安装后的实例------同一个 Chart 可以安装多次,每次产生一个独立的 Release。**Repository** 是存放和分发 Chart 的仓库,类似 npm registry。

  1. helm templatehelm install --dry-run 的区别是什么?

查看答案 `helm template` 在本地渲染模板并输出 YAML,**不连接集群**,适合快速预览模板结果或 CI 中做 lint 检查。`helm install --dry-run` 会连接集群模拟安装(包括资源验证),但不实际创建资源,适合验证 Chart 在当前集群上是否能成功安装。调试模板语法用 `template`,验证安装可行性用 `--dry-run`。

  1. 你的团队需要把同一个微服务部署到 dev/staging/prod 三个环境。用 Helm 怎么管理?

查看答案 创建一个 Chart,然后用三个 values 文件:`values-dev.yaml`(1 副本,低资源)、`values-staging.yaml`(2 副本)、`values-prod.yaml`(3 副本,高资源,启用 HPA)。部署时 `helm install app my-chart -f values-{env}.yaml`。这样只维护一份模板,环境差异通过 values 管理。

下一步

你掌握了 K8s 的包管理器。接下来学习怎么"看到"集群里发生了什么:

10. 可观测性与排错


📚 本文来自 K8s Guide ------ 开源免费的 Kubernetes 中文学习指南

  • 🗺️ 初学者轨道 + 面试轨道,从零基础到拿 Offer 一站式覆盖
  • 🧪 每篇文章配套 Kind 实验脚本,本地一键运行
  • 🔗 本文源码:docs/beginner/17-helm.md

如果对你有帮助,欢迎 Star! github.com/callmebg/k8s-guide

相关推荐
爱吃龙利鱼4 小时前
K8s 运维体系搭建:全组件监控与日志收集实战(victoria-metrics-k8s-stack 0.87.0)
运维·容器·kubernetes
欢醉4 小时前
踩了个大坑!K8s 挂载目录的日志,居然也在吃容器内存?
kubernetes·springcloud
沉迷学习 日益消瘦4 小时前
10-可观测性与排错
kubernetes
heimeiyingwang1 天前
【架构实战】云原生架构:容器化与Kubernetes落地之路
云原生·架构·kubernetes
张忠琳1 天前
【NVIDIA】k8s-device-plugin v0.19.3 NVIDIA k8s-device-plugin v0.19.3 核心插件模块深度分析之一
云原生·容器·架构·kubernetes·nvidia
运维大师1 天前
【K8S 运维实战】15-链路追踪Jaeger与OTel
运维·容器·kubernetes
潘正翔1 天前
k8s集群命令使用
linux·运维·docker·云原生·容器·kubernetes
名字还没想好☜2 天前
Kubernetes CrashLoopBackOff 排查全流程:从 describe 到日志到 exit code
运维·docker·云原生·容器·kubernetes
spider_xcxc2 天前
Helm 部署 K8s 集群完整笔记
java·开发语言·kubernetes