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
自检问题
- Chart、Release、Repository 分别是什么?
查看答案 **Chart** 是一个 Helm 包,包含一组 K8s 资源模板和默认配置。**Release** 是 Chart 被安装后的实例------同一个 Chart 可以安装多次,每次产生一个独立的 Release。**Repository** 是存放和分发 Chart 的仓库,类似 npm registry。
helm template和helm install --dry-run的区别是什么?
查看答案 `helm template` 在本地渲染模板并输出 YAML,**不连接集群**,适合快速预览模板结果或 CI 中做 lint 检查。`helm install --dry-run` 会连接集群模拟安装(包括资源验证),但不实际创建资源,适合验证 Chart 在当前集群上是否能成功安装。调试模板语法用 `template`,验证安装可行性用 `--dry-run`。
- 你的团队需要把同一个微服务部署到 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 的包管理器。接下来学习怎么"看到"集群里发生了什么:
📚 本文来自 K8s Guide ------ 开源免费的 Kubernetes 中文学习指南
- 🗺️ 初学者轨道 + 面试轨道,从零基础到拿 Offer 一站式覆盖
- 🧪 每篇文章配套 Kind 实验脚本,本地一键运行
- 🔗 本文源码:docs/beginner/17-helm.md
⭐ 如果对你有帮助,欢迎 Star! github.com/callmebg/k8s-guide