前置知识: 云计算

Helm包管理

2 minIntermediate2026/6/14

Helm包管理:Chart结构、值管理、仓库操作与最佳实践详解。

1. Helm 概述

1.1 什么是 Helm

Helm 是 Kubernetes 的包管理器,将应用定义为 Chart,实现一键部署和版本管理。

1.2 核心概念

概念描述
Chart应用包(模板+默认值)
ReleaseChart 的部署实例
RepositoryChart 仓库
Values配置值

1.3 Helm 3 vs Helm 2

对比项Helm 2Helm 3
Tiller需要不需要
安全模型Tiller 权限kubeconfig 权限
Release 存储ConfigMap/SecretSecret
命名空间Tiller 全局命名空间

2. Chart 结构

2.1 目录结构

my-chart/
├── Chart.yaml          # Chart 元数据
├── values.yaml         # 默认值
├── charts/             # 依赖 Chart
├── templates/          # 模板文件
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── configmap.yaml
│   ├── _helpers.tpl    # 模板辅助
│   └── NOTES.txt       # 安装说明
├── templates/tests/    # 测试模板
└── .helmignore         # 忽略文件

2.2 Chart.yaml

apiVersion: v2
name: my-app
description: My application Helm chart
type: application
version: 1.0.0 # Chart 版本
appVersion: '2.1.0' # 应用版本
dependencies:
  - name: redis
    version: '17.0.0'
    repository: 'https://charts.bitnami.com/bitnami'
    condition: redis.enabled

2.3 values.yaml

replicaCount: 3

image:
  repository: my-app
  pullPolicy: IfNotPresent
  tag: '2.1.0'

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: example.com
      paths:
        - path: /
          pathType: Prefix

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

redis:
  enabled: true
  auth:
    password: ''

3. 模板语法

3.1 基本语法

# 引用值
{{ .Values.replicaCount }}

# 条件判断
{{- if .Values.ingress.enabled }}
# ingress 内容
{{- end }}

# 循环
{{- range .Values.ingress.hosts }}
- host: {{ .host }}
{{- end }}

# 默认值
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

3.2 辅助模板

# templates/_helpers.tpl
{{- define "my-app.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}

{{- define "my-app.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ include "my-app.fullname" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

3.3 使用辅助模板

metadata:
  name: { { include "my-app.fullname" . } }
  labels: { { - include "my-app.labels" . | nindent 4 } }

4. 常用命令

4.1 仓库管理

# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新索引
helm repo update

# 搜索 Chart
helm search repo nginx

4.2 安装与升级

# 安装
helm install my-release bitnami/nginx

# 自定义值
helm install my-release bitnami/nginx -f values.yaml

# 设置单个值
helm install my-release bitnami/nginx --set service.type=NodePort

# 升级
helm upgrade my-release bitnami/nginx -f values.yaml

# 安装或升级
helm upgrade --install my-release bitnami/nginx -f values.yaml

4.3 管理与调试

# 查看已安装
helm list

# 查看状态
helm status my-release

# 查看历史
helm history my-release

# 回滚
helm rollback my-release 1

# 卸载
helm uninstall my-release

# 调试模板
helm template my-release . --debug
helm install --dry-run my-release . --debug

5. Chart 依赖

5.1 声明依赖

# Chart.yaml
dependencies:
  - name: redis
    version: '17.0.0'
    repository: 'https://charts.bitnami.com/bitnami'
    condition: redis.enabled
  - name: postgresql
    version: '12.0.0'
    repository: 'https://charts.bitnami.com/bitnami'
    condition: postgresql.enabled
    alias: db

5.2 更新依赖

helm dependency update
helm dependency build

6. 最佳实践

实践描述
版本控制Chart 和 values 文件纳入 Git
环境分离每个环境独立 values 文件
条件依赖使用 condition 控制可选组件
模板复用使用 _helpers.tpl
资源限制始终设置 resources
健康检查配置 liveness/readiness
镜像标签不使用 latest
测试编写 helm test