AI 协助说明: 本页由 Codex 协助核验和修复站内链接;正文的技术事实和适用范围未因本次修改而改变,仍以文中来源及当前官方文档为准。
本文边界:本文聚焦 Chart、模板与
values、Release 等状态模型;若需要按场景查找具体 CLI 用法,请阅读命令速查文档。推荐深读:Helm 常用命令技术文档。
1. 文档定位#
这篇文档配合 Helm 常用命令技术文档 阅读。命令文档回答“怎么做”,本文回答“这些命令背后的对象、状态和边界是什么”。
Helm 官方文档当前已经进入 Helm 4 文档版本,但实际环境中 Helm 3 仍然非常常见。命令文档中的安装脚本是 get-helm-3,因此本文以 Helm 3/4 都适用的核心概念为主;涉及版本差异时,会尽量用通用说法描述。
2. 一句话理解 Helm#
Helm 是 Kubernetes 的包管理器。它负责把一组 Kubernetes 资源定义组织成可复用、可配置、可版本化的包,然后安装到 Kubernetes 集群中。
更具体地说,Helm 同时做了三件事:
- 把 Kubernetes YAML 打包成
Chart。 - 用
values把模板渲染成最终manifest。 - 把一次安装后的实例记录为
Release,支持升级、回滚、查看历史和卸载。
可以把 Helm 想成下面这条流水线:
flowchart LR A["Chart<br/>模板化的 Kubernetes 包"] --> B["Values<br/>配置输入"] B --> C["Template Rendering<br/>模板渲染"] C --> D["Manifest<br/>最终 Kubernetes YAML"] D --> E["Kubernetes API<br/>创建或更新资源"] E --> F["Release<br/>Helm 记录的安装实例"]
3. 本文覆盖的概念索引#
命令文档中直接或间接出现的概念包括:
HelmKubernetesChartChart.yamlChart API versionvalues.yamlvalues filevalues managementvalues.schema.jsoncomputed valuesglobal values--set--set-string--set-file--set-json--reuse-values--reset-valuesRepositoryArtifact HubChart repositoryOCI registryChart referenceChart packageChart archiveappVersionchart versionReleaserelease namerevisionhistoryrollbacknamespacekubeconfigkube-contextmanifesttemplatedry-rundebugwaittimeoutstatushooksnotesdependencysubchartChart.lockpluginhelm-diffhelm-secretsHELM_NAMESPACEHELM_KUBECONTEXTKubernetes eventlabel selector
下面逐个展开。
4. Helm 与 Kubernetes 的关系#
Helm 不负责运行容器。真正运行容器、调度 Pod、暴露 Service、管理 Deployment 的仍然是 Kubernetes。
Helm 的位置更像是 Kubernetes 上层的“应用交付工具”。你可以手写几十个 YAML 文件并用 kubectl apply 部署,也可以把这些 YAML 变成 Helm Chart,用一条 helm install 安装。
| 工具 | 主要职责 | 典型命令 |
|---|---|---|
kubectl | 直接操作 Kubernetes API 和资源对象 | kubectl get pods、kubectl apply |
helm | 管理打包好的 Kubernetes 应用 | helm install、helm upgrade、helm rollback |
| Kubernetes | 真正运行和协调资源状态 | Deployment、Pod、Service、Ingress |
所以,Helm 的输出最终仍然是 Kubernetes 能理解的资源清单。
5. Helm Client#
命令文档中的 helm version、helm install、helm repo add 都是在使用 Helm CLI,也就是 Helm Client。
Helm Client 做这些事情:
- 读取本地 Helm 配置和仓库缓存。
- 读取
kubeconfig,知道要连接哪个 Kubernetes 集群。 - 下载或读取 Chart。
- 合并 values。
- 渲染模板。
- 调用 Kubernetes API 创建、更新或删除资源。
- 保存和读取 Release 信息。
Helm 3 以后没有 Helm 2 时代的服务端组件 Tiller。现代 Helm 常见工作模式是:本地 CLI 直接通过 Kubernetes API 操作集群。
6. kubeconfig 与 kube-context#
Helm 要访问 Kubernetes 集群,通常依赖和 kubectl 相同的 kubeconfig。
kubeconfig 里通常包含:
- clusters:集群地址和证书信息。
- users:访问集群的身份凭证。
- contexts:把 cluster、user、namespace 组合成一个可切换的上下文。
- current-context:当前默认使用哪个上下文。
命令文档中提到:
export HELM_KUBECONTEXT=prod-cluster这表示让 Helm 默认使用名为 prod-cluster 的 kube-context。也可以在具体命令中使用 --kube-context 指定。
排障时常见命令:
kubectl config view
kubectl cluster-info如果 Helm 安装失败,但错误看起来像权限、连接、证书、集群不可达,问题通常不在 Chart,而在 kubeconfig、当前 context 或集群访问权限。
7. Namespace#
Namespace 是 Kubernetes 的命名空间,用来在同一个集群中隔离资源名称和访问边界。
命令文档中常见写法:
helm install my-nginx bitnami/nginx -n my-namespace
helm list -n my-namespace
helm list --all-namespaces需要区分三层含义:
- Kubernetes 资源所在 namespace。
- Helm Release 记录所在 namespace。
- 命令默认操作的 namespace。
如果你在 production namespace 安装了一个 Release,那么普通的 helm list 可能看不到它,因为默认只查当前 namespace。需要:
helm list -n production或:
helm list -AHELM_NAMESPACE 可以设置 Helm 默认 namespace:
export HELM_NAMESPACE=production注意:-n 指定 namespace 不一定会自动创建 namespace。实际部署时常见做法是先创建 namespace,或在支持的命令中加 --create-namespace。
8. Chart#
Chart 是 Helm 的包。一个 Chart 描述了一个应用、组件或服务在 Kubernetes 中应该如何部署。
官方文档把 Chart 描述为包含一组 Kubernetes 资源定义的包。一个 Chart 可以很简单,比如只部署一个 nginx;也可以很复杂,比如同时包含 Web 服务、数据库、缓存、ServiceAccount、Ingress、ConfigMap 等。
典型目录结构:
my-chart/
Chart.yaml
values.yaml
values.schema.json
templates/
charts/
crds/
README.md
LICENSE
.helmignore这些文件分别承担不同职责。
| 文件或目录 | 作用 |
|---|---|
Chart.yaml | Chart 的元数据,比如名称、版本、依赖、应用版本 |
values.yaml | Chart 的默认配置 |
values.schema.json | 可选,用 JSON Schema 约束 values 结构 |
templates/ | 模板目录,Helm 会渲染这里的模板 |
templates/NOTES.txt | 安装或查看状态时输出的使用说明 |
charts/ | 子 Chart 或依赖 Chart 存放目录 |
crds/ | CRD 定义目录,处理方式比较特殊 |
README.md | Chart 使用说明 |
.helmignore | 打包 Chart 时忽略文件,类似 .gitignore |
9. Chart.yaml#
Chart.yaml 是 Chart 的身份信息文件。
常见内容:
apiVersion: v2
name: my-chart
description: A Helm chart for Kubernetes
type: application
version: 1.2.3
appVersion: "2.0.0"
dependencies:
- name: redis
version: 20.0.0
repository: https://charts.bitnami.com/bitnami重要字段解释:
| 字段 | 含义 |
|---|---|
apiVersion | Chart 文件格式版本,不是 Kubernetes API 版本 |
name | Chart 名称 |
description | Chart 描述 |
type | Chart 类型,常见为 application 或 library |
version | Chart 自身版本 |
appVersion | Chart 部署的应用版本 |
dependencies | 依赖的子 Chart |
10. Chart API Version#
命令文档中出现了:
helm create my-chart --api-version v2这里的 api-version 指 Chart API 版本。它描述 Chart 格式本身,不是 Deployment、Service 这些 Kubernetes 资源的 apiVersion。
常见区别:
| 概念 | 示例 | 含义 |
|---|---|---|
| Chart API version | apiVersion: v2 | Helm Chart 的格式版本 |
| Kubernetes API version | apiVersion: apps/v1 | Kubernetes 资源的 API 版本 |
现代 Helm 3/4 的普通 Chart 通常使用 apiVersion: v2。
11. Application Chart 与 Library Chart#
Chart 类型由 Chart.yaml 中的 type 字段表示。
application Chart 是最常见类型,用于真正安装应用。比如 nginx、redis、wordpress 这些都属于应用 Chart。
library Chart 不直接安装应用资源,而是提供可复用的模板片段、命名模板或辅助函数。它常用于组织多个 Chart 的公共逻辑,例如统一 labels、name 生成规则、image 拼接规则。
如果你只是部署服务,通常写 type: application。只有在抽公共模板能力时,才考虑 library Chart。
12. Repository#
Repository 是 Chart 仓库,用来存放和分发 Chart。
命令文档中:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm repo update
helm repo remove bitnami这些命令管理的是本地 Helm Client 认识哪些 Chart 仓库。
传统 Chart repository 本质上是一个 HTTP 服务,里面至少需要一个 index.yaml。index.yaml 记录了仓库中有哪些 Chart、每个 Chart 的版本、下载地址、摘要等信息。
可以这样理解:
helm repo add -> 记住仓库地址
helm repo update -> 拉取或刷新 index.yaml 到本地缓存
helm search repo -> 在本地缓存中搜索 Charthelm repo update 不会升级集群里的应用,它只更新本地对远程 Chart 仓库的索引认知。
13. stable 仓库与 Bitnami 仓库#
命令文档中有:
helm repo add stable https://charts.helm.sh/stable
helm repo add bitnami https://charts.bitnami.com/bitnamistable 是历史上非常常见的 Helm 仓库名称。现在实际使用时,更多会通过 Artifact Hub 查找维护良好的 Chart,然后添加具体维护方的仓库。例如 Bitnami、Grafana、Prometheus Community、Ingress NGINX 等。
bitnami/nginx 的含义是:
bitnami -> 本地仓库别名
nginx -> 仓库里的 Chart 名称这个组合叫 Chart reference。
14. Artifact Hub#
命令文档中出现:
helm search hub wordpressArtifact Hub 是云原生制品搜索平台。它不是你本地添加的 Helm 仓库,而是一个用于发现公开 Chart 的索引平台。
helm search hub 和 helm search repo 的区别:
| 命令 | 搜索范围 | 是否依赖本地 repo add |
|---|---|---|
helm search hub | Artifact Hub 上公开收录的 Chart | 不依赖 |
helm search repo | 本地已经添加并更新过的仓库缓存 | 依赖 |
常见流程是:
先用 helm search hub 找 Chart
再根据结果 helm repo add 对应仓库
然后 helm search repo 或 helm install15. OCI Registry#
命令文档中出现:
helm install my-app oci://registry.example.com/charts/my-app
helm push my-chart-1.0.0.tgz oci://registry.example.com/chartsOCI 是 Open Container Initiative 的缩写。你可以粗略理解成“容器镜像仓库那套分发协议”。Helm 支持把 Chart 作为 OCI Artifact 存到支持 OCI 的 registry 中。
传统 Chart repository 和 OCI registry 的区别:
| 项目 | 传统 Chart Repository | OCI Registry |
|---|---|---|
| 地址形态 | https://example.com/charts | oci://registry.example.com/charts/app |
| 索引方式 | index.yaml | registry 元数据和 tag |
| 常见操作 | helm repo add、helm repo update | helm registry login、helm pull、helm push |
| 分发体验 | 类似 apt/yum 仓库 | 类似镜像仓库 |
helm push 推送 OCI Chart 时,目标地址一般不写 Chart 文件名和版本标签。Helm 会从 .tgz 包中的 Chart 名称和 Chart 版本推导出 registry 中的 basename 和 tag。
16. Chart Reference#
Chart reference 是 Helm 命令中指定 Chart 来源的方式。
helm install 支持多种 Chart 表达方式:
helm install my-nginx bitnami/nginx
helm install my-app ./my-chart
helm install my-app ./my-chart-1.0.0.tgz
helm install my-app https://example.com/charts/my-chart-1.0.0.tgz
helm install my-app oci://registry.example.com/charts/my-app这些都在表达“我要安装哪个 Chart”。
| 写法 | 含义 |
|---|---|
bitnami/nginx | 本地已添加仓库中的 Chart |
./my-chart | 本地未打包 Chart 目录 |
./my-chart-1.0.0.tgz | 本地打包后的 Chart archive |
https://...tgz | 远程 Chart 包 URL |
oci://... | OCI registry 中的 Chart |
17. Chart Version、App Version 与 Release Revision#
这三个版本很容易混淆。
| 概念 | 示例 | 谁的版本 |
|---|---|---|
| Chart version | version: 1.2.3 | Helm Chart 自己的版本 |
| App version | appVersion: "2.0.0" | 被部署应用的版本 |
| Release revision | REVISION: 3 | 某个 Release 的历史修订号 |
举例:
version: 1.2.3
appVersion: "2.0.0"表示这个 Chart 包版本是 1.2.3,它默认部署的应用版本是 2.0.0。
如果你执行:
helm upgrade my-app ./my-chartHelm 会给 my-app 这个 Release 增加一个新的 revision。这个 revision 是 Release 生命周期里的历史序号,不等于 Chart version,也不等于 appVersion。
18. values.yaml#
values.yaml 是 Chart 的默认配置文件。
模板中常见写法:
replicas: {{ .Values.replicaCount }}对应的 values.yaml:
replicaCount: 3Helm 渲染模板时,会把 .Values.replicaCount 替换成 3。
所以 Chart 的核心思想是:
templates 负责结构
values 负责变量
manifest 是渲染结果19. Values File#
命令文档中经常使用:
helm install my-nginx bitnami/nginx -f custom-values.yaml
helm upgrade my-nginx bitnami/nginx -f new-values.yaml
helm template my-app ./my-chart -f values.yaml-f 或 --values 用来传入额外的 values 文件,覆盖 Chart 内置的 values.yaml。
常见做法是按环境拆分:
values.yaml
values-dev.yaml
values-test.yaml
values-prod.yaml部署生产环境时:
helm upgrade my-app ./my-chart -f values-prod.yaml这样比在命令行中写大量 --set 更容易审查、版本管理和回滚。
20. Values 优先级#
Helm values 通常来自多层输入。越靠后的覆盖能力越强:
Chart 内置 values.yaml
< 父 Chart 给子 Chart 的 values
< 命令行 -f / --values 文件
< 命令行 --set多个 -f 同时出现时,右边的文件优先级更高:
helm install my-app ./chart -f base.yaml -f prod.yaml如果两个文件都定义了同一个 key,以 prod.yaml 为准。
多个 --set 同时出现时,也是右边优先:
helm install my-app ./chart --set image.tag=v1 --set image.tag=v2最终 image.tag 是 v2。
21. –set 与嵌套配置#
命令文档中出现:
helm install my-nginx bitnami/nginx --set replicaCount=3
helm install my-nginx bitnami/nginx --set service.type=LoadBalancer--set service.type=LoadBalancer 对应的 YAML 结构是:
service:
type: LoadBalancer--set 适合临时覆盖少量参数。如果参数很多,推荐使用 values 文件。
常见相关参数:
| 参数 | 作用 |
|---|---|
--set | 设置普通值,Helm 会尝试解析类型 |
--set-string | 强制按字符串处理 |
--set-file | 从文件读取某个值 |
--set-json | 从命令行传 JSON 对象、数组或标量 |
--set-literal | 按字面字符串处理,避免特殊字符被解析 |
例如端口、布尔值、长数字、密码、JSON 数组这类值,使用错误的 --set 形式可能导致类型不符合预期。
22. Values 管理策略#
前面几节解释了 values 是什么、如何覆盖、优先级如何计算。实际项目中更重要的问题是:values 应该放在哪里、怎么分环境、怎么审查、怎么处理密钥、升级时怎么避免旧值污染新版本。
Values 管理要解决的是下面这些问题:
- 同一个 Chart 在开发、测试、预发、生产环境中配置不同。
- 配置需要进入 Git 做审查和追踪。
- 临时参数不能在生产环境里失控扩散。
- 密钥不能明文暴露在仓库、日志和终端历史中。
- 升级 Chart 时能清楚知道新默认值和旧自定义值如何合并。
- 子 Chart、全局配置和应用自身配置边界清楚。
22.1 默认 values 与部署 values 要分开#
Chart 自带的 values.yaml 应该表达“这个 Chart 的默认配置”。它更像 Chart 的配置接口说明,不应该被每个环境直接改来改去。
如果使用第三方 Chart,例如 bitnami/nginx,通常不要修改 Chart 包里的 values.yaml。正确做法是另建覆盖文件:
helm-values/
nginx-dev.yaml
nginx-test.yaml
nginx-prod.yaml部署时传入:
helm upgrade --install my-nginx bitnami/nginx \
-n production \
-f helm-values/nginx-prod.yaml这样可以保持 Chart 来源可升级,同时让你的环境配置独立版本管理。
如果是自研 Chart,可以把默认值放在 Chart 的 values.yaml 中,把不同环境的值放在 Chart 外部或仓库的环境目录中:
charts/
my-app/
Chart.yaml
values.yaml
templates/
environments/
dev/
my-app.yaml
staging/
my-app.yaml
prod/
my-app.yaml22.2 推荐的 values 分层#
Helm 支持多次使用 -f,右侧文件优先级更高。因此可以按“从通用到具体”的顺序组织:
helm upgrade --install my-app ./charts/my-app \
-f values/common.yaml \
-f values/prod.yaml \
-f values/prod-cn.yaml推荐分层:
| 层级 | 示例 | 说明 |
|---|---|---|
| Chart 默认层 | charts/my-app/values.yaml | Chart 自身默认值和配置接口 |
| 公共覆盖层 | values/common.yaml | 所有环境共享的业务配置 |
| 环境覆盖层 | values/dev.yaml、values/prod.yaml | 按环境区分副本数、资源、域名等 |
| 集群或区域覆盖层 | values/prod-cn.yaml、values/prod-us.yaml | 多集群、多地域差异 |
| 密钥覆盖层 | secrets/prod.enc.yaml | 加密保存,部署时解密 |
| 临时覆盖层 | --set image.tag=... | 发布流水线或紧急变更使用 |
关键原则是:越靠后的文件越具体,越具体的文件覆盖越通用的文件。
22.3 values 文件应该进入版本管理#
生产环境 values 文件应该进入 Git 或 GitOps 仓库。这样有几个好处:
- 每次配置变更可以被 code review。
- 可以回溯谁在什么时候改了哪个参数。
- 可以和应用版本、Chart 版本建立对应关系。
- 可以在事故后还原当时部署输入。
- CI/CD 能复现同一次部署。
不推荐在生产环境中长期依赖手写命令:
helm upgrade my-app ./chart --set replicaCount=5 --set image.tag=v2更推荐把稳定配置写入文件:
# values-prod.yaml
replicaCount: 5
image:
tag: v2然后执行:
helm upgrade my-app ./chart -f values-prod.yaml--set 更适合发布流水线传入少量动态值,例如镜像 tag、构建号、Git commit SHA。
22.4 --set 的使用边界#
--set 最大的问题是不可审查、容易进入 shell history、复杂结构可读性差。
适合使用 --set 的场景:
- CI/CD 注入镜像 tag。
- 临时调试一个开关。
- 覆盖一两个简单标量值。
- 本地快速验证。
不适合使用 --set 的场景:
- 大量业务配置。
- 多层嵌套结构。
- Secret、token、password。
- 需要长期维护的生产配置。
- 包含逗号、等号、JSON、特殊字符的复杂值。
复杂值优先写入 values 文件。必须走命令行时,根据类型选择:
| 参数 | 建议用途 |
|---|---|
--set | 少量普通标量值 |
--set-string | 端口号、长数字、布尔字符串、版本号等必须保持字符串的值 |
--set-file | 从文件读取证书、公钥、大段配置 |
--set-json | 覆盖数组或对象 |
--set-literal | 包含特殊字符且希望按字面值处理的字符串 |
例如版本号 1.20、布尔字符串 "false"、长数字 ID,都应该避免被 YAML 或 Helm 类型推断改写:
helm upgrade my-app ./chart --set-string app.version=1.2022.5 Computed Values 与 User-supplied Values#
执行:
helm install my-app ./chart --dry-run --debug输出里通常会看到两类 values:
USER-SUPPLIED VALUES
COMPUTED VALUESUSER-SUPPLIED VALUES 表示用户通过 -f、--set 等方式传入的值。
COMPUTED VALUES 表示 Helm 合并 Chart 默认值、父 Chart 覆盖值、用户 values、命令行参数之后得到的最终 values。
排查配置不生效时,优先看 computed values。因为模板真正读取的是合并后的 .Values,不是某一个单独文件。
22.6 查看已部署 Release 的 values#
安装后可以用:
helm get values my-app查看用户传入过的 values。这个命令默认不展示 Chart 默认值,只展示用户覆盖过的部分。
如果想看合并 Chart 默认值后的完整 values,可以使用:
helm get values my-app --all查看历史 revision 的 values:
helm get values my-app --revision 3这在排查“上次升级到底带了哪些配置”时很有用。
22.7 升级时 values 如何处理#
升级时最容易出问题的是旧 values 和新 Chart 默认 values 的关系。
常见策略:
| 策略 | 适合场景 |
|---|---|
| 默认升级行为 | 小版本升级,Chart values 结构变化不大 |
--reset-values | 想采用新 Chart 默认值,避免旧自定义值影响新版本 |
--reuse-values | 明确希望保留上一次 Release 的用户 values |
--reset-then-reuse-values | 想先加载新默认值,再叠加旧 values 和本次覆盖 |
生产升级建议:
- 先用
helm show values <chart>查看新 Chart 默认 values。 - 和当前环境 values 文件对比,确认 key 是否变更。
- 用
helm diff upgrade查看 manifest 差异。 - 用
helm upgrade --dry-run --debug查看 computed values。 - 再执行正式 upgrade。
如果 Chart 大版本升级,尤其是 values 结构发生变化时,不要盲目 --reuse-values。旧 key 可能已经废弃,或者含义已经改变。
22.8 删除默认值中的某个 key#
Helm 合并 values 时,默认是把 map 合并,而不是简单替换整个对象。某些场景下,你想删除 Chart 默认 values 中的某个 key,需要把它显式设为 null。
例如默认值中有:
livenessProbe:
httpGet:
path: /healthz
port: http
initialDelaySeconds: 30如果你只添加 exec,可能会得到同时包含 httpGet 和 exec 的非法探针配置。此时需要把原来的 httpGet 清掉:
livenessProbe:
httpGet: null
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 30命令行也可以写:
helm upgrade my-app ./chart \
--set livenessProbe.httpGet=null \
--set livenessProbe.exec.command='{cat,/tmp/healthy}'不过这种复杂结构更建议写到 values 文件里。
22.9 values.schema.json#
values.schema.json 用来校验 values 的结构、类型和必填项。它对 Chart 维护非常有价值,尤其是多人协作或提供给其他团队使用的 Chart。
例如:
{
"$schema": "https://json-schema.org/schema#",
"type": "object",
"properties": {
"replicaCount": {
"type": "integer",
"minimum": 1
},
"image": {
"type": "object",
"properties": {
"repository": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"required": ["repository", "tag"]
}
},
"required": ["replicaCount", "image"]
}这样可以提前发现:
replicaCount写成字符串。- 忘记配置
image.tag。 - 某个字段类型不符合预期。
- 必填配置缺失。
如果临时不希望执行 schema 校验,Helm 命令提供了跳过校验的选项,但生产环境不建议长期依赖跳过校验。
22.10 values 的命名和结构设计#
设计 values 时,不只是给自己看,也是在设计 Chart 的配置 API。
推荐规则:
- key 使用小写开头的 camelCase,例如
replicaCount、serviceAccount。 - 避免 key 中使用连字符,例如不要写
service-account。 - 字符串显式加引号,例如
tag: "1.20"。 - 能扁平就不要过度嵌套。
- 强关联的一组配置可以用 map 嵌套。
- 避免用数组表达需要频繁覆盖的配置,优先用 map。
- 每个重要 key 都写注释或在 README 中说明。
不太好覆盖的写法:
servers:
- name: api
port: 8080
- name: admin
port: 9090更容易覆盖的写法:
servers:
api:
port: 8080
admin:
port: 9090这样覆盖 api 端口时更直观:
helm upgrade my-app ./chart --set servers.api.port=808122.11 Subchart 与 global values 管理#
父 Chart 可以通过子 Chart 名称覆盖子 Chart values:
redis:
auth:
enabled: true
password: example这里的 redis 通常对应依赖 Chart 的名称或 alias。
如果多个子 Chart 需要共享同一类配置,可以使用 global:
global:
imageRegistry: registry.example.com
storageClass: fast-ssd但 global 不应滥用。它适合放真正跨 Chart 的公共配置,例如镜像仓库前缀、集群域名、统一 storageClass。业务私有配置仍然应该留在各自 Chart 的 values 作用域内。
22.12 Secret values 管理#
Values 里经常会出现密码、token、证书路径等敏感信息。需要明确一点:values 本身不是安全边界。
风险包括:
- values 文件明文提交到 Git。
--set password=...进入 shell history。helm install --debug输出敏感值。helm get values被有权限的人读取。- 渲染后的 manifest 中包含 Secret 数据。
常见处理方式:
| 方式 | 说明 |
|---|---|
helm-secrets + SOPS | Git 中存加密 values,部署时解密 |
| Sealed Secrets | Git 中存加密后的 Kubernetes Secret |
| External Secrets Operator | 从 Vault、云 Secret Manager 等外部系统同步 |
| CI/CD Secret 注入 | 流水线运行时注入,避免落盘 |
| 预创建 Secret | Helm values 只引用已有 Secret 名称 |
推荐优先让 Helm values 引用 Secret 名称,而不是直接承载 Secret 明文:
database:
existingSecret: my-app-database
usernameKey: username
passwordKey: password模板再引用这个 Secret:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.database.existingSecret }}
key: {{ .Values.database.passwordKey }}这样 Helm 管理的是引用关系,敏感值由专门的 Secret 管理链路负责。
22.13 多环境 values 示例#
一个可维护的多环境结构可以长这样:
deploy/
helm/
values-common.yaml
values-dev.yaml
values-staging.yaml
values-prod.yaml
secrets-prod.enc.yamlvalues-common.yaml:
image:
repository: registry.example.com/my-app
service:
type: ClusterIP
resources:
requests:
cpu: "100m"
memory: "128Mi"values-prod.yaml:
replicaCount: 4
ingress:
enabled: true
hosts:
- host: app.example.com
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"部署:
helm upgrade --install my-app ./charts/my-app \
-n production \
-f deploy/helm/values-common.yaml \
-f deploy/helm/values-prod.yaml \
--set-string image.tag="${IMAGE_TAG}" \
--wait \
--timeout 5m这里公共配置、生产配置和动态镜像 tag 各自有清晰边界。
22.14 values 变更前的检查流程#
生产环境 values 变更建议按这个顺序检查:
helm lint ./charts/my-app -f deploy/helm/values-prod.yaml
helm template my-app ./charts/my-app -f deploy/helm/values-prod.yaml > manifest.yaml
helm upgrade my-app ./charts/my-app -f deploy/helm/values-prod.yaml --dry-run --debug
helm diff upgrade my-app ./charts/my-app -f deploy/helm/values-prod.yaml重点看:
- computed values 是否符合预期。
- manifest 是否出现意外删除或重命名资源。
- Secret 是否被打印到日志。
- Deployment、Service、Ingress、PVC 等关键资源是否变化。
- 不可变字段是否被修改,例如某些 Service 字段、PVC 字段。
22.15 values 管理反模式#
常见反模式:
- 生产配置长期只存在某个人的终端命令历史里。
- 大量
--set拼接成一条很长的发布命令。 - 把第三方 Chart 解压后直接改它的
values.yaml。 - 明文密码写入 values 文件并提交 Git。
- Chart 大版本升级时盲目
--reuse-values。 - 多个环境复制整份 values,只有少数字段不同,导致配置漂移。
- 子 Chart 配置和父 Chart 配置边界混乱,到处依赖
global。 - 不使用
values.schema.json,错误配置只能等安装失败才发现。
一个比较稳的经验是:长期配置进文件,动态发布参数走流水线,敏感信息进密钥系统,升级前看 computed values 和 manifest diff。
23. Template#
Template 是 Helm Chart 中的模板文件,通常放在 templates/ 目录下。
模板不是最终 YAML。模板里可以包含 Go template 语法和 Helm 提供的对象:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}Helm 会在安装、升级或执行 helm template 时渲染这些模板。
模板常用能力:
- 读取
.Values。 - 读取
.Release。 - 读取
.Chart。 - 使用
if、with、range控制结构。 - 使用函数和管道处理字符串、默认值、缩进、YAML 转换。
- 使用命名模板复用 labels、fullname 等片段。
24. Built-in Objects#
Helm 模板中有一些内置对象。
| 对象 | 作用 |
|---|---|
.Values | 当前 Chart 的 values |
.Release | 当前 Release 的信息 |
.Chart | Chart.yaml 的信息 |
.Capabilities | Kubernetes 集群支持的能力和 API 版本 |
.Files | Chart 中部分非模板文件的访问入口 |
.Subcharts | 父 Chart 访问子 Chart 相关作用域 |
.Template | 当前模板文件自身的信息 |
例如:
metadata:
name: {{ .Release.Name }}
labels:
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}这里 .Release.Name 来自安装命令中的 release name,.Chart.Name 和 .Chart.Version 来自 Chart.yaml。
25. Manifest#
Manifest 是 Helm 渲染模板后生成的 Kubernetes YAML。
命令文档中:
helm get manifest my-nginx
helm template my-app ./my-chart > manifest.yamlhelm template 生成的是 manifest,但不会提交给 Kubernetes。helm install 和 helm upgrade 会把生成的 manifest 提交给 Kubernetes API。
要区分三种文件:
| 名称 | 是否含模板语法 | 是否最终提交给 Kubernetes |
|---|---|---|
templates/*.yaml | 是 | 否 |
values.yaml | 否,主要是配置数据 | 否 |
| manifest | 否,是渲染后的 Kubernetes YAML | 是 |
排查模板问题时,先看 manifest 往往比直接看模板更直观。
26. helm template#
命令文档中:
helm template my-app ./my-chart
helm template my-app ./my-chart -f values.yaml
helm template my-app ./my-chart --set replicaCount=2helm template 是本地渲染命令。它不需要真的在集群里创建资源,适合:
- 检查最终 YAML 长什么样。
- 在 CI 中做静态检查。
- 和
kubectl diff、kubeconform等工具配合。 - 排查 values 是否生效。
- 排查模板语法和缩进问题。
不过要注意,helm template 不等价于真实安装。真实安装时,Kubernetes API 还会做权限校验、资源字段校验、准入控制、调度等后续动作。
27. Dry Run#
命令文档中:
helm install my-nginx bitnami/nginx --dry-run
helm install --dry-run --debug my-app ./my-chart--dry-run 表示模拟执行。它会尽量走安装或升级流程,但不真正把结果落到集群资源上。
常见用途:
- 预览安装输出。
- 检查 values 合并结果。
- 检查模板渲染是否失败。
- 与
--debug组合查看更多细节。
需要注意:CRD 场景下 dry-run 可能有局限,因为 CRD 会改变 Kubernetes API 可识别的资源类型,而 dry-run 不会真的先安装 CRD。
28. Debug#
--debug 会输出更多 Helm 内部处理信息,常与 --dry-run、helm template、helm lint 一起使用。
例如:
helm install --debug --dry-run my-app ./my-chart
helm template my-app ./my-chart --debug
helm lint ./my-chart --debug它适合用于模板渲染失败、values 不符合预期、Chart 结构异常等问题。
29. Release#
Release 是一个 Chart 安装到 Kubernetes 集群后的实例。
命令文档中:
helm install my-nginx bitnami/nginx这里 my-nginx 是 release name,bitnami/nginx 是 Chart。
同一个 Chart 可以安装多次,只要 release name 不同:
helm install nginx-a bitnami/nginx
helm install nginx-b bitnami/nginx这会得到两个独立 Release。它们可以有不同 values、不同 namespace、不同生命周期。
可以这样理解:
Chart 是类
Release 是对象实例
values 是实例化参数30. Release Name#
Release name 是一次安装的名字。它会影响:
- Helm 管理该 Release 时的标识。
- 模板中的
.Release.Name。 - 很多 Chart 生成 Kubernetes 资源名称的前缀。
例如:
helm install my-wordpress bitnami/wordpressChart 模板中如果使用:
metadata:
name: {{ .Release.Name }}-service最终资源名可能是:
my-wordpress-serviceRelease name 在同一 namespace 下通常需要唯一。命名要稳定,不建议随意改,否则 Helm 会认为是另一个 Release。
31. Install#
helm install 的本质是创建一个新 Release。
大致流程:
读取 Chart
读取并合并 values
安装 crds/ 中的 CRD
渲染 templates/
执行 pre-install hooks
提交普通资源到 Kubernetes
如果设置 --wait,等待资源 Ready
执行 post-install hooks
保存 Release 记录
输出 NOTES命令文档中:
helm install my-nginx bitnami/nginx --wait --timeout 5m这表示安装后等待资源达到就绪状态,最长等待 5 分钟。
32. Wait 与 Timeout#
--wait 表示 Helm 不只提交资源,还要等待资源进入就绪状态。
常见等待对象包括:
- Pod 是否 Ready。
- Deployment 是否完成 rollout。
- StatefulSet 是否准备好。
- Job 是否完成。
- PVC 是否绑定。
--timeout 表示最长等待时间。
helm install my-app ./my-chart --wait --timeout 5m生产环境推荐使用 --wait 和明确的 --timeout,否则 Helm 可能已经返回成功,但实际 Pod 还在拉镜像、CrashLoop 或等待调度。
33. Status#
helm status 查看 Release 当前状态。
helm status my-nginx它通常会展示:
- Release 名称。
- Namespace。
- 当前状态。
- Revision。
- 最近部署时间。
- Chart 信息。
- 用户说明,也就是
NOTES.txt渲染结果。
常见状态包括:
| 状态 | 含义 |
|---|---|
deployed | 当前 Release 已部署 |
failed | 安装、升级或回滚失败 |
pending-install | 安装进行中 |
pending-upgrade | 升级进行中 |
pending-rollback | 回滚进行中 |
uninstalled | 已卸载,但历史可能保留 |
superseded | 旧 revision 被新 revision 取代 |
如果 helm status 显示成功,但业务不可用,还需要继续用 kubectl get pods、kubectl describe、kubectl logs 检查 Kubernetes 层面的状态。
34. Revision#
Revision 是 Release 的历史修订号。
第一次安装:
REVISION: 1每次成功或失败的升级、回滚都可能产生新的 revision。可以用:
helm history my-nginx查看历史。
Revision 是 Helm 对 Release 生命周期的记录,不是 Git commit,也不是 Chart version。
35. Upgrade#
helm upgrade 用来更新已有 Release。
命令文档中:
helm upgrade my-nginx bitnami/nginx
helm upgrade my-nginx bitnami/nginx --version 13.2.2
helm upgrade my-nginx bitnami/nginx -f new-values.yaml
helm upgrade my-nginx bitnami/nginx --set replicaCount=5升级可能包含多种变化:
- Chart 版本变化。
- 应用镜像版本变化。
- values 变化。
- 模板结构变化。
- Kubernetes 资源字段变化。
- 子 Chart 依赖变化。
升级不是简单地“重新安装”。Helm 会把新 manifest 与当前 Release 记录对比,然后对 Kubernetes 资源执行创建、更新或删除。
36. Reset Values、Reuse Values 与 Reset Then Reuse#
命令文档中出现:
helm upgrade my-nginx bitnami/nginx --reset-values升级时 values 的处理很关键。
| 参数 | 概念 |
|---|---|
--reset-values | 升级时丢弃上一次 Release 的用户自定义 values,回到新 Chart 默认 values,再叠加本次命令输入 |
--reuse-values | 复用上一次 Release 的 values,再叠加本次命令输入 |
--reset-then-reuse-values | 先回到 Chart 默认值,再复用上次 values,最后叠加本次命令输入 |
如果 Chart 默认值在新版本中变化很大,盲目 --reuse-values 可能保留旧配置导致新 Chart 行为异常。如果你希望完全采用新 Chart 默认配置,则使用 --reset-values 更清晰。
37. History#
helm history 查看某个 Release 的 revision 列表。
helm history my-nginx
helm history my-nginx --max 10历史记录中通常能看到:
- revision 编号。
- 更新时间。
- 状态。
- Chart 版本。
- appVersion。
- 描述信息。
它是 rollback 的基础。没有历史,就无法指定过去的 revision 回滚。
38. Rollback#
helm rollback 把 Release 回退到某个历史 revision。
命令文档中:
helm rollback my-nginx
helm rollback my-nginx 2
helm rollback my-nginx 2 --wait需要注意:rollback 本身也会创建一个新的 revision。
例如历史是:
1 deployed
2 superseded
3 failed执行:
helm rollback my-nginx 2成功后可能变成:
4 deployed也就是说,Release 并不是“穿越回 revision 2”,而是“用 revision 2 的配置和 manifest 创建一个新的当前 revision”。
39. Uninstall#
helm uninstall 卸载 Release。
命令文档中:
helm uninstall my-nginx
helm uninstall my-nginx --keep-history
helm uninstall my-nginx --no-hooks默认情况下,Helm 会删除这个 Release 管理的 Kubernetes 资源,并删除 Release 记录。
--keep-history 表示保留 Release 历史,使它仍然能在历史中被看到。
--no-hooks 的准确含义是不执行卸载相关 hooks,并不是“强制删除所有资源”。如果卸载问题来自 hook 卡住,--no-hooks 可能绕开 hook;如果问题来自 Kubernetes 资源 finalizer、权限或 API 异常,则仍需要到 Kubernetes 层面处理。
40. hooks#
Hook 是 Helm 生命周期钩子。Chart 作者可以声明某些资源在安装、升级、回滚、删除、测试等阶段执行。
常见 hook 类型:
| Hook | 触发时机 |
|---|---|
pre-install | 普通资源安装前 |
post-install | 普通资源安装后 |
pre-upgrade | 升级普通资源前 |
post-upgrade | 升级普通资源后 |
pre-rollback | 回滚资源前 |
post-rollback | 回滚资源后 |
pre-delete | 删除资源前 |
post-delete | 删除资源后 |
test | 执行 helm test 时 |
Hook 本质上仍然是 Kubernetes manifest,只是带了特殊 annotation:
metadata:
annotations:
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded常见用途:
- 安装前初始化数据库。
- 升级前备份数据。
- 安装后执行健康检查 Job。
- 删除前做外部系统解绑。
Hook 也容易带来复杂性。尤其要注意:hook 创建的资源不一定像普通资源那样被 Release 生命周期完整管理。需要通过 hook delete policy、Job TTL 或手动清理来避免残留。
41. Notes#
命令文档中出现:
helm get notes my-nginxNotes 来自 Chart 中的:
templates/NOTES.txt安装完成或执行 helm status 时,Helm 会渲染并输出这个文件。它通常用于告诉用户:
- 如何访问服务。
- 如何获取初始密码。
- 下一步该执行什么命令。
- 关键注意事项。
NOTES.txt 也是模板文件,可以使用 .Values、.Release 等对象。
42. helm get#
helm get 系列命令用于查看某个 Release 的细节。
命令文档中:
helm get manifest my-nginx
helm get values my-nginx
helm get all my-nginx
helm get hooks my-nginx
helm get notes my-nginx它们对应不同信息层:
| 命令 | 查看内容 |
|---|---|
helm get manifest | 当前 Release 渲染出来并提交过的 manifest |
helm get values | Release 使用的用户自定义 values |
helm get all | 综合信息,包括 manifest、hooks、notes、values 等 |
helm get hooks | Release 的 hooks |
helm get notes | 渲染后的 notes |
helm show values 看的是 Chart 默认 values。helm get values 看的是某个 Release 实际使用的 values。两者不要混淆。
43. CRD#
CRD 是 CustomResourceDefinition,用来扩展 Kubernetes API,让集群认识新的资源类型。
例如安装 cert-manager 时,可能会引入 Certificate、Issuer 等自定义资源类型。
Helm Chart 中的 CRD 通常放在:
crds/CRD 有特殊处理逻辑:
- 安装时,
crds/中的 CRD 会在普通 templates 前安装。 - CRD 文件不走普通模板渲染。
- 已存在的 CRD 通常不会被重复安装。
- Helm 通常不会在 upgrade 或 rollback 时自动升级 CRD。
- Helm uninstall 通常不会自动删除 CRD。
原因是 CRD 是集群级别能力,删除 CRD 可能会删除所有 namespace 中该类型的自定义资源,风险很高。
44. Dependency#
命令文档中:
helm dependency update ./my-chart
helm dependency build ./my-chart
helm dependency list ./my-chartDependency 是 Chart 依赖。一个 Chart 可以依赖其他 Chart。
例如你的应用需要 Redis,可以在 Chart.yaml 写:
dependencies:
- name: redis
version: 20.0.0
repository: https://charts.bitnami.com/bitnami父 Chart 安装时,依赖 Chart 会作为 subchart 一起渲染和安装。
45. Subchart#
Subchart 是子 Chart,通常来自依赖。
父 Chart 和子 Chart 的 values 有作用域边界:
- 子 Chart 可以有自己的
values.yaml。 - 父 Chart 可以覆盖子 Chart 的 values。
- 普通子 Chart 不应该直接依赖父 Chart 的内部 values。
globalvalues 可以被父子 Chart 共享。
父 Chart 覆盖子 Chart values 的常见写法:
redis:
auth:
enabled: true
password: example这里 redis 通常对应依赖 Chart 名称。具体 key 要看子 Chart 暴露了哪些 values。
46. Chart.lock#
Chart.lock 是依赖锁定文件。它记录依赖解析后的具体版本和摘要,确保不同环境构建出一致的依赖结果。
helm dependency update 和 helm dependency build 的区别:
| 命令 | 概念 |
|---|---|
helm dependency update | 根据 Chart.yaml 解析依赖版本,更新 charts/ 目录和 Chart.lock |
helm dependency build | 根据已有 Chart.lock 重建 charts/ 目录,适合 CI 或可复现构建 |
helm dependency list | 查看依赖状态 |
如果仓库中提交了 Chart.lock,CI 中更推荐 helm dependency build,这样依赖版本更可控。
47. Chart Package 与 Chart Archive#
命令文档中:
helm package ./my-chart
helm package ./my-chart --version 1.2.3
helm package ./my-chart --app-version 2.0.0
helm package ./my-chart --destination ./packageshelm package 会把 Chart 目录打包为 .tgz 文件:
my-chart-1.2.3.tgz这个 .tgz 就是 Chart archive,也就是可以被分发、上传、安装的 Chart 包。
打包时:
--version会覆盖Chart.yaml中的 Chart version。--app-version会覆盖Chart.yaml中的 appVersion。--destination指定输出目录。
发布到传统 Chart repository 或 OCI registry 前,通常都要先 package。
48. Lint#
helm lint 用于检查 Chart 是否符合基本规范。
命令文档中:
helm lint ./my-chart
helm lint ./my-chart --strict
helm lint ./my-chart --debug它会检查:
- Chart 结构是否合理。
Chart.yaml是否有效。- values schema 是否匹配。
- 模板是否能被解析。
- 一些常见最佳实践问题。
--strict 会把某些警告提升为错误,适合 CI。helm lint 不是完整的 Kubernetes 校验,它不能替代真实集群准入校验或策略校验。
49. Plugin#
Helm Plugin 是扩展 Helm CLI 的机制。插件不是 Helm 内置命令,但安装后可以通过 helm <plugin> 使用。
命令文档中:
helm plugin install https://github.com/databus23/helm-diff
helm plugin list
helm plugin update diff
helm plugin uninstall diff常见插件:
| 插件 | 作用 |
|---|---|
helm-diff | 在升级前查看 manifest 差异 |
helm-secrets | 配合加密工具管理敏感 values |
helm-git | 从 Git 仓库读取 Chart |
插件会扩展本地 Helm 行为。生产环境使用插件时要注意版本一致性和安全性,尤其是会处理密钥、仓库凭证或执行外部命令的插件。
50. helm-diff#
命令文档中:
helm diff upgrade my-app ./my-charthelm-diff 的核心价值是“升级前看差异”。它通常会比较当前 Release 和本次升级渲染出的 manifest 差异。
它适合回答:
- 这次升级会改哪些 Deployment、Service、ConfigMap?
- 镜像 tag 有没有变?
- replicas 有没有变?
- 是否会删除某些资源?
- 是否会修改不可变字段?
生产升级前先看 diff,是非常好的习惯。
51. helm-secrets#
命令文档中:
helm secrets install my-app ./my-chart -f secrets.yamlhelm-secrets 常用于管理加密 values。它通常配合 SOPS、age、GPG 或云 KMS 等工具,让 Git 仓库中保存的是加密后的 values 文件,部署时再解密传给 Helm。
需要注意:
- Helm values 最终仍可能进入 Kubernetes Secret 或 manifest。
- 加密 values 文件不等于运行时 Secret 安全。
- CI/CD 中要保护解密密钥。
- 避免在
--debug输出、日志、终端历史中泄露敏感值。
52. HELM_NAMESPACE 与 HELM_KUBECONTEXT#
命令文档中:
export HELM_NAMESPACE=production
export HELM_KUBECONTEXT=prod-cluster这些环境变量影响 Helm 默认行为。
| 变量 | 作用 |
|---|---|
HELM_NAMESPACE | 设置 Helm 默认 namespace |
HELM_KUBECONTEXT | 设置 Helm 默认 kube-context |
可以用:
helm env查看 Helm 当前环境配置。
在多集群、多 namespace 环境中,建议在生产操作前显式确认:
helm env
kubectl config current-context
helm list -n production53. Kubernetes Event#
命令文档中:
kubectl get events --sort-by='.lastTimestamp'Kubernetes Event 是集群记录资源变化和异常原因的一种对象。Helm 安装失败时,Helm 错误信息可能只告诉你等待超时,但真正原因在 Kubernetes events 里。
常见事件原因:
- 镜像拉取失败。
- PVC 无法绑定。
- Pod 调度失败。
- 探针失败。
- 权限不足。
- Ingress 或 LoadBalancer 创建异常。
排障顺序可以是:
helm status
helm get manifest
kubectl get pods
kubectl describe pod
kubectl get events
kubectl logs54. Label Selector#
命令文档中:
kubectl get pods -l app=my-app-l app=my-app 是 label selector。Kubernetes 资源经常通过 labels 建立关联和筛选。
Helm Chart 通常会给资源加标准 labels,例如:
app.kubernetes.io/name: my-app
app.kubernetes.io/instance: my-release
app.kubernetes.io/managed-by: Helm
helm.sh/chart: my-chart-1.2.3这些 labels 的作用:
- 帮助查询某个 Release 相关资源。
- 帮助 Service 选择 Pod。
- 帮助监控、日志、成本分析系统归类资源。
- 标识资源由 Helm 管理。
排查时,比起只看资源名称,使用 labels 查询更稳定。
55. 常见命令背后的概念映射#
| 命令 | 背后概念 |
|---|---|
helm repo add | 给本地 Helm Client 增加 Chart repository 地址 |
helm repo update | 刷新本地 repository index 缓存 |
helm search repo | 搜索本地已添加仓库的 Chart 索引 |
helm search hub | 搜索 Artifact Hub |
helm show chart | 查看 Chart 元数据,也就是 Chart.yaml |
helm show values | 查看 Chart 默认 values |
helm install | 用 Chart 和 values 创建 Release |
helm upgrade | 更新已有 Release,并生成新 revision |
helm rollback | 基于历史 revision 创建新的当前 revision |
helm uninstall | 删除 Release 管理的资源和记录 |
helm list | 按 namespace 查看 Release 列表 |
helm status | 查看单个 Release 当前状态 |
helm get manifest | 查看某个 Release 的渲染结果 |
helm get values | 查看某个 Release 的用户 values |
helm history | 查看 Release 的 revision 历史 |
helm create | 生成 Chart 脚手架 |
helm lint | 检查 Chart 基本规范 |
helm package | 把 Chart 目录打成 .tgz |
helm push | 推送 Chart 包到远端仓库,常见为 OCI registry |
helm dependency update | 解析依赖并更新锁文件和依赖包 |
helm dependency build | 根据锁文件重建依赖包 |
helm template | 本地渲染模板,生成 manifest |
helm plugin install | 安装扩展 Helm CLI 的插件 |
helm env | 查看 Helm 环境配置 |
56. 从概念角度理解一次生产升级#
假设命令是:
helm diff upgrade my-app ./my-chart
helm upgrade my-app ./my-chart \
--values values.yaml \
--set image.tag=v2.0.0 \
--wait \
--timeout 5m概念上发生了这些事:
- Helm 读取当前 kube-context 和 namespace。
- Helm 找到
my-app这个 Release 的当前 revision。 - Helm 读取本地
./my-chart。 - Helm 读取 Chart 默认
values.yaml。 - Helm 合并命令行传入的
values.yaml。 - Helm 再叠加
--set image.tag=v2.0.0。 - Helm 渲染
templates/,生成新的 manifest。 helm-diff展示新旧 manifest 差异。helm upgrade把新 manifest 应用到 Kubernetes。- 如果存在 upgrade hooks,按生命周期执行。
- 如果加了
--wait,Helm 等待资源就绪。 - 成功或失败都会反映到 Release 状态和 revision 历史中。
57. 常见误区#
57.1 helm repo update 不是升级应用#
helm repo update 只是更新本地 Chart 仓库索引。它不会修改任何 Kubernetes 资源,也不会升级任何 Release。
升级应用必须使用:
helm upgrade57.2 helm template 成功不代表安装一定成功#
helm template 只证明模板能渲染。真实安装还可能因为权限、CRD、配额、准入控制、镜像拉取、PVC、调度失败而失败。
57.3 helm uninstall --no-hooks 不是强制删除#
--no-hooks 是不执行 hooks。它不能解决所有资源删除失败问题。
57.4 Chart version 不等于应用版本#
Chart version 变了,应用镜像不一定变。应用版本变了,Chart version 也不一定自动变。生产发布时最好明确记录两者。
57.5 Release name 不是 Kubernetes 资源名的唯一来源#
很多 Chart 会用 release name 生成资源名,但最终资源名还受模板逻辑、fullnameOverride、nameOverride、namespace、labels 等影响。
57.6 values 文件不是 Kubernetes manifest#
values 文件只是输入配置,不会直接提交给 Kubernetes。真正提交的是模板渲染后的 manifest。
58. 建议的学习路径#
如果你已经掌握了常用命令,建议按这个顺序补概念:
- 先理解
Chart、values、template、manifest的关系。 - 再理解
Release、revision、history、rollback。 - 然后学习
Repository、Artifact Hub、OCI registry。 - 接着学习
dependency、subchart、Chart.lock。 - 最后再深入
hooks、CRD、插件、生产排障。
核心主线可以记成:
找 Chart -> 配 values -> 渲染 manifest -> 创建 Release -> 通过 revision 管理生命周期