主题
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/ # 依赖 Chart1.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: 8080yaml
# 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.3bash
# 构建并应用
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 部署