4. Helm 包管理基础:Helm 安装、Chart 结构、模板语法、values.yaml 配置、release 管理

Helm 是 Kubernetes 生态中最流行的包管理工具,被形象地称为“K8s 的 apt-get 或 yum”。它通过 Chart 将一组相关的 Kubernetes 资源(Deployment、Service、ConfigMap 等)打包、版本化并参数化,实现应用的标准化部署与升级。本章将围绕 Helm 的核心概念,从安装到 release 管理,构建完整的知识体系。

4.1 Helm 安装与核心组件

Helm 采用客户端-服务端架构(v3 版本已移除 Tiller,仅保留客户端)。安装方式支持二进制下载、包管理器或脚本安装。

安装方式 适用平台 命令/步骤
脚本安装 Linux / macOS curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Homebrew macOS brew install helm
Chocolatey Windows choco install kubernetes-helm
二进制下载 所有平台 从 GitHub Releases 下载对应架构的 tar.gz 并解压至 /usr/local/bin
验证安装: 执行 helm version 应返回类似 version.BuildInfo{Version:"v3.15.0"} 的输出。确保已配置好 kubeconfig 并拥有集群访问权限。

4.2 Chart 目录结构

一个 Helm Chart 是一个遵循标准目录结构的文件集合。使用 helm create my-chart 可快速生成脚手架。

my-chart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述、依赖等)
├── values.yaml         # 默认配置值,供模板引用
├── charts/             # 子 Chart 依赖(手动或通过 helm dependency 管理)
├── templates/          # Go 模板文件,渲染后生成 Kubernetes 资源清单
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板辅助函数(命名、标签等)
│   └── tests/          # 测试 Pod 模板
└── .helmignore         # 打包时忽略的文件模式(类似 .gitignore)
关键文件说明:
  • Chart.yaml:必填字段包括 apiVersion(v2)、name、version(Chart 版本)、appVersion(应用版本)。
  • values.yaml:定义所有可配置参数的默认值,是 Chart 参数化的入口。
  • templates/:使用 Go 模板语法({{ .Values.key }})引用 values.yaml 中的值。
Helm Chart 目录结构与渲染流程 Chart 目录结构 my-chart/ ├── Chart.yaml ├── values.yaml ├── charts/ └── templates/ ├── deployment.yaml ├── service.yaml ├── _helpers.tpl └── tests/ Helm 引擎 读取 values.yaml 解析 Go 模板 注入 .Values 渲染 YAML 校验资源 生成 Release Kubernetes 资源清单 apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Values.name }} spec: replicas: {{ .Values.replicaCount }} image: {{ .Values.image.repository }} ... kind: Service spec: type: {{ .Values.service.type }}

4.3 模板语法与 values.yaml 配置

Helm 使用 Go 模板引擎(text/template)结合 Sprig 函数库,在 templates/ 目录下的 YAML 文件中嵌入动态逻辑。核心语法包括:

  • 值引用:{{ .Values.replicaCount }} —— 从 values.yaml 中读取参数。
  • 内置对象:.Release.Name(release 名称)、.Chart.Name(Chart 名称)、.Files.Get(读取文件内容)。
  • 流程控制:{{- if .Values.enabled }} ... {{- end }}、{{- range .Values.items }} ... {{- end }}。
  • 模板函数:{{ .Values.image.repository | quote }}(管道)、{{ default "nginx" .Values.image.repository }}(默认值)。
  • 命名模板:在 _helpers.tpl 中定义 {{- define "my-chart.labels" -}} ... {{- end }},通过 {{ include "my-chart.labels" . }} 复用。
常见陷阱:
  • 缩进问题:模板渲染后的 YAML 必须保持正确的缩进,使用 {{- indent 4 }} 或 {{- nindent 4 }} 控制。
  • 布尔值:true/false 在 YAML 中是小写,但在模板中作为字符串时需用 {{ .Values.enabled | toString }} 转换。
  • 特殊字符:密码等含 $、\ 的值建议使用 --set 或 --values 传递,避免模板转义。

values.yaml 配置示例

# values.yaml
replicaCount: 3

image:
  repository: nginx
  tag: "1.25"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  host: chart-example.local

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

nodeSelector: {}
tolerations: []
affinity: {}

4.4 Release 管理

Release 是 Helm 在 Kubernetes 集群中安装 Chart 后生成的运行实例。每个 release 都有一个唯一的名称,Helm 会记录其状态、版本和配置历史。

命令 功能 示例
helm install 安装一个新的 release helm install my-release ./my-chart
helm upgrade 升级一个已存在的 release helm upgrade my-release ./my-chart -f new-values.yaml
helm rollback 回滚到指定版本 helm rollback my-release 1
helm list 列出所有已部署的 release helm list -n default
helm uninstall 卸载 release 并删除资源 helm uninstall my-release
helm history 查看 release 的版本历史 helm history my-release
最佳实践:
  • 使用 --dry-run --debug 在安装/升级前预览渲染后的 YAML,避免直接操作集群。
  • 为 release 名称添加环境后缀(如 report-service-dev、report-service-prod),便于多环境管理。
  • 利用 helm get values my-release 查看当前 release 使用的实际配置值,用于审计或回滚参考。
Release 生命周期管理 helm install Release v1 helm upgrade Release v2 helm rollback helm uninstall 已删除 helm history 可查看所有版本记录;helm get values 可导出任意版本的配置

4.5 实战:部署报表导出服务 Chart

结合本课程项目,我们为报表导出服务创建一个最小化 Chart。以下为关键步骤:

  1. 创建 Chart:helm create report-export,删除不必要的模板文件,保留 deployment.yaml、service.yaml、_helpers.tpl。
  2. 配置 values.yaml:定义镜像仓库、副本数、数据库连接字符串(通过 Secret 引用)、资源限制等。
  3. 编写模板:在 deployment.yaml 中使用 {{ .Values.image.repository }}:{{ .Values.image.tag }} 引用镜像;使用 {{- include "report-export.labels" . }} 注入标签。
  4. 安装测试:helm install report-export-dev ./report-export --dry-run --debug 验证渲染结果。
  5. 升级与回滚:修改 values.yaml 后执行 helm upgrade report-export-dev ./report-export -f new-values.yaml;若失败则 helm rollback report-export-dev 1。
关键命令速查:
# 安装
helm install report-export ./report-export -n report-ns --create-namespace

# 升级(仅变更部分值)
helm upgrade report-export ./report-export --set image.tag=2.0.0

# 回滚到版本 2
helm rollback report-export 2

# 查看 release 状态
helm status report-export

# 导出当前配置
helm get values report-export -o yaml > current-values.yaml