helm-完整详细讲解

Helm 完整详细讲解

·16 分钟阅读·6092 字
📋 目录

Helm 完整详细讲解

核心概念 Helm 是 Kubernetes 官方包管理工具,解决大量零散 YAML 的批量管理、版本迭代、环境差异化配置问题。

1. 基础定位与核心作用

1.1. 是什么

Helm 是 Kubernetes 官方标准包管理工具,类比 Linux 的 yum/apt、Python 的 pip
K8s 原生资源(Deployment/Service/StatefulSet/PVC/Ingress 等)零散 YAML 难以批量管理、版本迭代、灰度升级、一键卸载,Helm 解决这些痛点。

1.2. 核心解决的问题

  1. 大量零散 YAML 统一打包分发,一套应用只维护一套模板;
  2. 环境差异化配置分离(开发/测试/生产不同参数,不修改模板);
  3. 应用版本管理:升级、回滚、历史版本查看;
  4. 一键安装、卸载、扩容、配置更新;
  5. 依赖管理:一套应用依赖 MySQL/Redis/GPU插件,自动安装依赖 Chart;
  6. 模板渲染能力:循环、判断、变量、函数,避免重复写重复YAML。

1.3. 两代架构区分(重点:Helm3 无 Tiller,生产只用 Helm3)

1.3.1. Helm2(淘汰,禁止线上使用)

分为客户端 helm + 服务端组件 tiller(部署在集群内);
安全缺陷:tiller高权限,多租户权限隔离差,架构臃肿。

1.3.2. Helm3(当前稳定主流)

彻底移除 Tiller,纯客户端运行;
所有操作直接通过 kubeconfig 调用 kube-apiserver;
基于 Namespace 隔离 Release,权限完全复用 K8s RBAC,企业生产标准。

2. 四大核心概念(必须吃透)

2.1. Chart(应用安装包)

封装一套完整K8s应用资源的安装包,目录标准化结构,后缀 .tgz
完整标准目录结构:

mychart/
├── Chart.yaml       # Chart元数据:名称、版本、描述、依赖、K8s版本兼容
├── values.yaml      # 默认全局配置变量(核心!所有可配置参数)
├── values.schema.json # 参数校验规则(helm3.3+,校验参数类型必填)
├── templates/       # 模板文件夹,存放所有渲染YAML
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── statefulset.yaml
│   ├── ingress.yaml
│   ├── pvc.yaml
│   ├── _helpers.tpl # 公共模板函数、标签、注释片段(下划线开头不单独渲染资源)
├── charts/          # 子依赖Chart(本应用依赖的中间件包)
├── crds/            # 自定义资源CRD,安装Chart前自动创建
├── .helmignore      # 打包忽略文件,类似.gitignore
├── README.md        # 使用文档

2.2. Values(配置变量)

应用所有可自定义参数,分层覆盖优先级(从低到高):

  1. chart 内置 values.yaml 默认值
  2. 自定义 values-dev.yaml / values-prod.yaml 环境配置文件
  3. 命令行 --set / --set-string 临时覆盖参数

常用配置:副本数、镜像地址/标签、资源requests/limits、存储大小、域名、GPU数量、密码、开关(是否开启Ingress、监控)。

2.3. Release(集群内安装实例)

在指定 Namespace 中,Chart 安装一次生成一个 Release

  • 同一个Chart可以在同ns安装多套不同Release(不同名称隔离);
  • Release 包含完整渲染后的所有资源、配置版本、更新历史;
  • 支持 helm list 查看、helm history 历史、helm rollback 回滚。

示例:

# 安装mychart,release名称web-prod
helm install web-prod ./mychart -f values-prod.yaml

web-prod 就是Release,所有资源会自动带上 release.name 标签区分。

2.4. Repository(Chart仓库)

Chart 包托管仓库,分三类:

  1. 公有仓库:Bitnami(主流中间件mysql/redis/nginx)、NVIDIA GPU Operator、Prometheus社区仓库;
  2. 私有仓库:Harbor、ChartMuseum,企业内部存储自研业务Chart;
  3. 本地目录:直接 helm install ./chart 本地文件夹安装,无需仓库。

仓库核心操作:helm repo add 添加源、helm repo update 更新索引、helm search repo 搜索应用。

3. Helm 模板核心语法(运维写/改Chart必备)

底层基于 Go Template,内置大量拓展函数(sprig库)。

3.1. 变量取值

# 读取values顶层变量
replicaCount: {{ .Values.replicaCount }}
# 内置全局对象
.Release.Name        # 当前release名称
.Release.Namespace   # 安装命名空间
.Chart.Name          # chart名称
.Chart.Version       # chart包版本
.Capabilities.KubeVersion # 当前集群K8s版本

3.2. 逻辑判断 if / else

{{- if .Values.ingress.enabled }}
# 开启ingress才渲染这段Ingress资源
apiVersion: networking.k8s.io/v1
kind: Ingress
...
{{- end }}

{{- 减号:删除换行空格,避免渲染出多余空行。

3.3. 循环 range(遍历数组)

批量创建Service、环境变量、PVC、节点容忍等:

env:
{{- range .Values.env }}
  - name: {{ .name }}
    value: {{ .value | quote }}
{{- end }}

3.4. 公共模板 _helpers.tpl

定义全局统一标签、annotations,所有模板复用,避免重复:

{{- define "mychart.labels" -}}
app: {{ .Chart.Name }}
release: {{ .Release.Name }}
{{- end -}}

使用:

labels:
{{ include "mychart.labels" . | nindent 4 }}

3.5. 常用管道函数

  • | quote:自动加双引号,规避数字/特殊字符报错
  • | toYaml:完整渲染数组/结构体(资源limits、亲和配置)
  • default "1" .Values.replicaCount:变量为空给默认值
  • b64enc:base64加密(Secret场景)
  • required "镜像地址不能为空" .Values.image.repository:强制必填参数,安装失败直接提示

3.6. 子依赖管理 Chart.yaml

通过 dependencies 字段声明依赖,helm dependency update 自动下载子chart到charts目录:

dependencies:
  - name: mysql
    repository: "oci://harbor.example.com/bitnami"
    version: "9.0.x"
    condition: mysql.enabled # 开关控制是否安装依赖

4. 核心完整命令大全(运维日常高频)

4.1. 仓库管理

# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新仓库索引
helm repo update
# 搜索应用
helm search repo mysql
# 查看chart详情、可配置参数
helm show values bitnami/mysql
# 拉取chart到本地
helm pull bitnami/mysql --untar

4.2. 安装/升级/卸载

# 安装,指定release、命名空间、生产配置文件
helm install web web-chart -n prod -f values-prod.yaml
# 临时覆盖参数(扩容副本)
helm install web web-chart --set replicaCount=3
# 升级(更新镜像/修改配置)
helm upgrade web web-chart -n prod -f values-prod.yaml
# 卸载(保留PVC加--keep-history,彻底删除--purge)
helm uninstall web -n prod

4.3. 版本回滚与历史

# 查看release所有操作历史修订号
helm history web -n prod
# 回滚到第1版
helm rollback web 1 -n prod

4.4. 调试模板(排错神器)

# 仅渲染模板输出YAML,不安装,校验语法
helm template ./mychart -f values-prod.yaml
# 模拟安装dry-run,模拟API提交,校验RBAC/参数合法性
helm install --dry-run web ./mychart
# 查看集群中release当前渲染的完整资源
helm get manifest web -n prod
# 查看当前生效配置
helm get values web -n prod
# 查看指定历史版本配置
helm get values web --revision 1

4.5. Chart 打包、依赖、校验

# 更新下载依赖
helm dependency update
# 语法校验模板、values参数
helm lint ./mychart
# 打包tgz安装包
helm package ./mychart

5. Helm 企业生产高阶能力

5.1. 多环境配置管理

一套Chart,多套values文件区分环境:

  • values.yaml 默认通用
  • values-dev.yaml 开发低资源、单副本
  • values-test.yaml 测试中等规格
  • values-prod.yaml 生产高可用、多副本、持久化、监控开启
    安装命令:
helm install app ./chart -n prod -f values.yaml -f values-prod.yaml

5.2. 配置参数校验 values.schema.json

限制参数类型、必填、取值范围,避免线上填错参数导致发布失败,发布前自动校验。

5.3. OCI 私有仓库(现代标准)

Helm3支持OCI镜像仓库(Harbor)存储Chart,替代老旧ChartMuseum,镜像、Chart统一仓库管理。

5.4. CRD 管理

crds/ 目录下CRD资源会在安装Chart前优先创建,卸载时默认不删除CRD(防止自定义资源丢失),适合Operator类Chart(GPU Operator、Prometheus Operator)。

5.5. 子Chart独立开关

通过 condition 控制依赖中间件是否安装:生产外部独立MySQL,关闭chart内置mysql;测试环境自动内置mysql。

5.6. 集群RBAC权限控制

helm 完全复用kubeconfig权限:

  • 普通开发仅命名空间install/upgrade权限;
  • 管理员拥有集群级Chart操作;
    可限制ServiceAccount禁止创建集群级资源(ClusterRole/ClusterIssuer等)。

5.7. CI/CD 流水线集成

  1. Git存放Chart模板+多环境values;
  2. CI流水线执行 helm lint 校验语法;
  3. 打包推送至私有Harbor OCI仓库;
  4. 线上环境流水线 helm upgrade 灰度发布;
  5. 发布失败自动执行 helm rollback 回滚。

6. Helm 适用场景 & 不适合场景

6.1. 适合

  1. 开源中间件一键部署:MySQL、Redis、Prometheus、ELK、Nginx-Ingress、GPU Operator;
  2. 自研业务标准化交付,多环境统一发布;
  3. Operator类组件部署(包含大量CRD);
  4. 批量管理一整套微服务(依赖联动安装);
  5. 企业统一应用交付平台,屏蔽底层K8s YAML细节。

6.2. 不适合

  1. 一次性临时测试Pod(直接kubectl apply更简单);
  2. 高度个性化、每个实例资源完全不同、无统一模板的业务;
  3. 简单单资源YAML,无复用需求。

7. 线上常见坑与运维注意事项

  1. 升级覆盖手动修改资源
    所有资源变更必须通过values控制,禁止kubectl手动edit修改Deployment,helm upgrade会覆盖重置。
  2. Secret明文存values风险密码、AK/SK不要写values.yaml提交Git,使用外部Secret或CI环境变量 --set 注入。
  3. 回滚仅恢复Chart配置,不回业务数据
    helm rollback只恢复YAML模板配置,PVC存储、数据库数据不会回退,数据需自行备份。
  4. CRD卸载不自动删除
    卸载chart不会清理crd资源,残留自定义资源占用集群,需手动清理。
  5. 模板缩进错误渲染失败使用 helm template / --dry-run 预校验,上线前必调试。
  6. 子依赖版本不锁定
    Chart.yaml指定精确版本号,避免自动拉取不兼容新版本引发故障。
  7. 忽略release命名空间隔离
    不同环境使用独立ns+不同release名称,防止同名资源冲突。

8. 面试精简核心背诵总结

  1. Helm3 是K8s包管理,无Tiller,基于Chart打包K8s资源,Release是集群内安装实例,Repo存放Chart包;
  2. Chart核心结构:Chart.yaml元信息、values.yaml配置、templates模板、_helpers公共片段、charts子依赖;
  3. 基于Go Template模板,支持变量、if判断、range循环、函数管道,实现多环境差异化渲染;
  4. 核心流程:repo管理 → helm install/upgrade发布 → history/rollback版本回滚;
  5. 生产价值:统一应用交付、多环境配置分离、依赖自动管理、CI/CD流水线集成、开源中间件一键部署;
  6. 运维规范:发布前helm template/dry-run校验,业务配置全部走values,禁止手动修改集群资源。