Skip to content

12 — Helm 与 Kustomize 深度教材

Helm 是 K8s 的包管理器,Kustomize 是配置管理工具。两者各有优劣,生产环境常结合使用。


1. Helm 核心概念

Helm 架构:
  Chart(模板包) → Helm Client → Kubernetes API
  
  Chart 目录结构:
    mychart/
    ├── Chart.yaml        # Chart 元数据
    ├── values.yaml       # 默认值
    ├── templates/        # K8s 资源模板
    │   ├── deployment.yaml
    │   ├── service.yaml
    │   ├── _helpers.tpl  # 模板函数
    │   └── NOTES.txt     # 安装说明
    └── charts/           # 依赖 Chart

1.1 Chart 开发

yaml
# values.yaml
replicaCount: 3
image:
  repository: myapp
  tag: "latest"
  pullPolicy: IfNotPresent
resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 100m
    memory: 128Mi
service:
  type: ClusterIP
  port: 8080
yaml
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        resources:
          {{- toYaml .Values.resources | nindent 10 }}

1.2 生产 Helm 操作

bash
# 安装/升级
helm upgrade --install myapp ./mychart \
  -f values-prod.yaml \
  --namespace production \
  --create-namespace \
  --atomic \
  --timeout 5m \
  --wait

# 版本管理
helm history myapp -n production
helm rollback myapp 2 -n production   # 回滚到 revision 2

# 调试
helm template myapp ./mychart -f values-prod.yaml  # 渲染不安装
helm lint ./mychart                                  # 语法检查
helm diff upgrade myapp ./mychart -f values-prod.yaml  # 对比差异

# 依赖管理
helm dependency update ./mychart   # 更新 charts/ 目录

2. Kustomize 配置管理

Kustomize 核心理念:
  不修改模板,通过 overlay 叠加修改
  
  目录结构:
    base/                  # 基础配置
    ├── kustomization.yaml
    ├── deployment.yaml
    └── service.yaml
    overlays/              # 环境叠加
    ├── dev/
    │   ├── kustomization.yaml   # namePrefix, replicas, patches
    │   └── replica-patch.yaml
    ├── staging/
    └── production/

2.1 Kustomize 生产配置

yaml
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: production
namePrefix: prod-
resources:
- ../../base
replicas:
- name: web-app
  count: 5
patches:
- path: resource-patch.yaml
  target:
    kind: Deployment
    name: web-app
images:
- name: myapp
  newName: harbor.example.com/myapp
  newTag: v1.2.3
bash
# 构建并应用
kubectl apply -k overlays/production/
kustomize build overlays/production/ | kubectl apply -f -

# 查看差异
kustomize build overlays/production/ | kubectl diff -f -

3. Helm + Kustomize 协同

最佳实践:
  Helm 管理第三方组件(Ingress Controller、Prometheus、Cert-Manager)
  Kustomize 管理自研应用(多环境 overlay)

  或者:
  Helm 渲染 → Kustomize 后处理(添加标签、修改命名空间)
bash
# Helm 渲染后用 Kustomize 后处理
helm template myapp ./mychart -f values-prod.yaml > base/rendered.yaml
kustomize build overlays/production/ | kubectl apply -f -

4. 面试高频问题

Q: Helm 和 Kustomize 怎么选?

Helm:
  优势:模板功能强、依赖管理、版本管理、社区 Chart 丰富
  劣势:模板调试难、values 复杂度爆炸
  场景:第三方组件、通用化部署

Kustomize:
  优势:无模板、overlay 清晰、git diff 友好
  劣势:复杂逻辑表达能力弱
  场景:自研应用多环境管理、GitOps

结合使用:
  Helm 打包 → Kustomize overlay → ArgoCD 部署