1. Helm 基础回顾:Helm 架构、Chart 结构、Release 生命周期、Tiller 与 Helm v3 区别
1.1 Helm 整体架构
Helm 是 Kubernetes 生态中的包管理器,负责将应用打包为 Chart,并通过模板引擎生成 Kubernetes 资源清单,最终部署到集群中。Helm v3 采用客户端-only 架构,不再依赖服务端组件 Tiller。
核心组件: Helm CLI(客户端) + Kubernetes API Server(服务端) + Chart 仓库(存储与分发)
1.2 Chart 结构详解
一个标准的 Helm Chart 是一个目录,包含以下核心文件和子目录:
| 文件/目录 | 用途 | 是否必须 |
|---|---|---|
Chart.yaml |
Chart 元数据:名称、版本、描述、API 版本等 | 是 |
values.yaml |
默认配置值,供模板引用 | 是 |
templates/ |
Go 模板文件,生成 Kubernetes 资源清单 | 是 |
charts/ |
子 Chart 依赖(手动或通过 helm dependency 管理) |
否 |
crds/ |
自定义资源定义(CRD),在模板渲染前安装 | 否 |
README.md |
Chart 使用说明 | 推荐 |
.helmignore |
打包时忽略的文件模式 | 否 |
排查要点: 故障排查时优先检查
Chart.yaml 中的 apiVersion(v2 为 Helm 3 格式)、templates/ 下的语法错误、以及 values.yaml 中缺失的必填字段。
1.3 Release 生命周期
Release 是 Chart 的一次部署实例,每个 Release 都有唯一的名称和版本号。Helm 通过 Release 记录(存储在 Secret 中)追踪每次操作。
Release 状态转换的关键操作:
- helm install:创建 Release,状态从
pending-install变为deployed或failed。 - helm upgrade:创建新版本 Release,旧版本变为
superseded,新版本进入pending-upgrade最终变为deployed或failed。 - helm rollback:回滚到某个
superseded版本,使其重新变为deployed。 - helm uninstall:Release 变为
uninstalled,但历史记录保留(默认)。
1.4 Tiller 与 Helm v3 区别
Helm v2 依赖集群内组件 Tiller,Helm v3 彻底移除 Tiller,改为直接与 Kubernetes API Server 交互。这一变化对安全性和架构有深远影响。
| 对比维度 | Helm v2(Tiller) | Helm v3(无 Tiller) |
|---|---|---|
| 架构 | 客户端 + 服务端 Tiller | 纯客户端,直接调用 API Server |
| 权限模型 | Tiller 拥有集群级权限,存在安全风险 | 使用当前 kubeconfig 用户权限,遵循 RBAC |
| Release 存储 | ConfigMap(默认)或 Secret | Secret(默认),支持自定义存储后端 |
| 命名空间隔离 | Tiller 跨命名空间管理 Release | Release 严格绑定到命名空间 |
| Chart 格式 | apiVersion v1(旧格式) | apiVersion v2(新格式,支持库 Chart) |
| 依赖管理 | requirements.yaml + requirements.lock | Chart.yaml 中 dependencies 字段 + Chart.lock |
| CRD 处理 | 需手动管理或使用 crd-install 钩子 |
支持 crds/ 目录自动安装 |
| OCI 支持 | 不支持 | 原生支持 OCI 镜像仓库存储 Chart |
迁移注意: 从 Helm v2 迁移到 v3 时,务必使用
helm 2to3 插件转换 Release 存储和 Chart 格式。直接使用 v3 管理 v2 遗留的 Release 会导致数据不一致。
1.5 关键命令速查
以下命令在故障排查中高频使用:
# 查看 Release 状态
helm status my-release -n my-namespace
# 查看 Release 历史版本
helm history my-release -n my-namespace
# 渲染模板但不安装(调试语法错误)
helm template my-release ./mychart -f custom-values.yaml
# 检查 Chart 依赖
helm dependency list ./mychart
# 获取 Release 的 values
helm get values my-release -n my-namespace
# 获取 Release 的 manifest
helm get manifest my-release -n my-namespace
# 回滚到指定版本
helm rollback my-release 2 -n my-namespace
故障排查起点: 遇到安装失败时,先执行
helm template 检查模板渲染是否正常,再执行 helm install --dry-run --debug 查看 API Server 返回的错误信息。