1. Helm 概述:Helm 是什么、Helm 3 架构与组件、Helm 与 K8s 原生资源的关系
1.1 Helm 是什么
Helm 是 Kubernetes 生态中事实标准的包管理工具,类比操作系统中的 yum/apt 或编程语言中的 npm/pip。它通过 Chart(图表)将一组相关的 Kubernetes 资源定义打包、版本化、发布,并支持参数化配置与生命周期管理。
核心价值:将分散的 YAML 清单(Deployment、Service、ConfigMap、Ingress 等)整合为一个可重复安装、可升级、可回滚的发布单元。
| 维度 | 传统 YAML 管理 | Helm 管理 |
|---|---|---|
| 复用性 | 复制粘贴,环境差异需手动修改 | 模板 + values.yaml,一次编写多环境复用 |
| 版本控制 | 依赖 Git 仓库文件级管理 | 内置 Release 版本号,支持回滚 |
| 依赖管理 | 手动编排安装顺序 | Chart 依赖自动解析与安装 |
| 操作复杂度 | 逐个 kubectl apply/delete | helm install/upgrade/rollback 一条命令 |
1.2 Helm 3 架构与组件
Helm 3 移除了 Tiller(服务端组件),采用纯客户端架构,大幅提升安全性与简洁性。架构由以下核心组件构成:
- Helm CLI:客户端命令行工具,负责 Chart 打包、仓库管理、发布操作。
- Chart:Kubernetes 资源的模板化打包格式,包含 Chart.yaml、values.yaml、templates/ 目录等。
- Repository:Chart 存储与分发仓库,支持 HTTP/HTTPS 协议。
- Release:Chart 在 Kubernetes 集群中的一次运行实例,每个 Release 有唯一名称和版本号。
- Kubernetes API Server:Helm 通过 kubeconfig 直接与 API Server 交互,创建/更新/删除资源。
1.3 Helm 与 Kubernetes 原生资源的关系
Helm 本身不创造新的 Kubernetes 资源类型,而是通过模板引擎将 Chart 中的 Go 模板渲染为标准的 Kubernetes 资源清单,再通过 kubectl 等效的 API 调用提交给集群。
关键理解:Helm 是 Kubernetes 资源的“编排层”和“生命周期管理层”,底层操作的对象仍然是 Pod、Service、Deployment、ConfigMap 等原生资源。
关系对照表
| Kubernetes 原生资源 | Helm 中的角色 | Helm 管理方式 |
|---|---|---|
| Deployment | 工作负载定义 | 模板化副本数、镜像、环境变量 |
| Service | 网络暴露 | 模板化端口、类型(ClusterIP/NodePort/LB) |
| ConfigMap / Secret | 配置与敏感数据 | 模板化键值对,支持 .Values 注入 |
| Ingress | 七层路由 | 模板化域名、TLS、注解 |
| PersistentVolumeClaim | 存储声明 | 模板化存储类、容量、访问模式 |
| Namespace | 隔离空间 | 通过 --namespace 参数指定,Chart 内可创建 |
Helm 对原生资源的增强能力
- 模板化:使用
{{ .Values.replicaCount }}动态生成资源字段,避免硬编码。 - 依赖管理:通过
Chart.yaml的 dependencies 字段声明子 Chart,自动安装前置资源。 - 资源钩子(Hooks):在 Release 安装、升级、删除等阶段执行 Job 或 Pod,实现数据库迁移、预检查等操作。
- Release 标签与注解:Helm 自动为管理的资源添加
app.kubernetes.io/managed-by: Helm等标签,便于识别与审计。
常见误区:Helm 不是 Kubernetes 的替代品,也不是资源编排的“银弹”。对于极简场景(如单个 Pod),直接使用 kubectl 可能更轻量。Helm 的价值在多资源、多环境、多版本的复杂发布场景中才充分体现。