为什么选择 Helm

Helm 将 Kubernetes 资源抽象为 Chart(模板 + 默认值),统一安装、升级、回滚与打包分享。对于多环境与可重用需求强的团队,Helm 能显著降低运维与交付复杂度。

安装与基本命令

1
2
3
4
5
6
7
8
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

helm install my-redis bitnami/redis
helm upgrade my-redis bitnami/redis -f values.yaml
helm rollback my-redis 1

Chart 结构详解

1
2
3
4
5
6
7
8
9
myapp/
├── Chart.yaml # 名称、版本、依赖
├── values.yaml # 默认配置
├── values-dev.yaml # 多环境覆盖
├── templates/ # K8s 模板
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # 公共模板/函数
└── charts/ # 子依赖 chart

_helpers.tpl 定义命名规范:

1
2
3
{{- define "myapp.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

deployment.yaml 中复用:

1
2
metadata:
name: {{ include "myapp.fullname" . }}

模板与函数

  • 条件与循环:if/range
  • 内置对象:.Values .Release .Chart .Capabilities
  • 常用函数:default quote toYaml indent

示例(根据开关启用 HPA):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{{- if .Values.hpa.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "myapp.fullname" . }}
spec:
maxReplicas: {{ .Values.hpa.maxReplicas }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
{{- end }}

依赖与子 Chart

Chart.yaml 中声明依赖:

1
2
3
4
5
dependencies:
- name: redis
version: 18.x.x
repository: https://charts.bitnami.com/bitnami
condition: redis.enabled

通过 values.yaml 控制开启:

1
2
redis:
enabled: true

多环境管理与 GitOps

分层配置:

  • values.yaml:基础默认
  • values-dev.yaml/values-prod.yaml:环境覆盖

部署命令:

1
2
3
helm upgrade --install myapp charts/myapp \
-f values.yaml -f values-prod.yaml \
--namespace prod --create-namespace

GitOps:将 Chart 与 values 管理在 Git 仓库,使用 Argo CD/Flux 监听并同步集群状态,实现声明式交付。

Hooks 与发布策略

Helm Hooks(如 pre-install, post-upgrade)可在发布前后执行任务(迁移、数据校验)。谨慎使用,避免失败导致发布卡住。

发布策略:

  • 蓝绿/金丝雀配合 Ingress/Service 实现
  • helm diff 预览差异,降低出错率
  • 通过 --atomic 自动回滚失败

安全与合规

  • 禁止模板硬编码敏感信息,使用 K8s Secret 或密钥管理(Sealed Secrets/External Secrets)
  • 资源限制与安全上下文(securityContext)默认开启
  • Chart 签名与 provenance 校验,防止被篡改

踩坑

  • 模板渲染缩进:多用 toYaml | nindent
  • CRD 管理:通过 crds/ 目录或单独安装,避免升级冲突
  • values 过深:拆分子 Chart 或引入 Schema(values.schema.json)

FAQ

  • 如何回滚?helm rollback <release> <rev>
  • 如何只渲染不安装?helm templatehelm install --dry-run --debug
  • 是否支持多集群?通过 kubeconfig context 或 GitOps 平台统一管理

结语

Helm 提供了强大的模板与依赖机制,配合 GitOps、差异检查与严格的配置规范,能够显著提升交付效率与发布可靠性。