Helm 和 Kustomize
Helm 和 Kustomize 是 Kubernetes 生态中最常用的应用包管理和配置定制工具,用于简化应用部署和环境差异化管理。
概述
Helm 和 Kustomize 是 Kubernetes 中管理应用部署的两大工具。Helm 使用 Chart 作为包格式,支持模板化部署和版本管理;Kustomize 则通过 overlay 机制实现配置定制,无需模板。两者在 CKA 考试中虽然不是重点,但在实际工作中非常重要。
第一部分:Helm
1. Helm 基础概念
1.1 Helm 核心术语
| 术语 | 说明 |
|---|---|
| Chart | Helm 包,包含部署应用所需的 YAML 模板和配置 |
| Release | Chart 在集群中的一次部署实例 |
| Repository | Chart 存储仓库 |
| Values | 传递给模板的配置值 |
| Templates | 生成 Kubernetes 清单的 Go 模板文件 |
1.2 Chart 目录结构
mychart/
├── Chart.yaml # Chart 元数据(名称、版本、描述)
├── values.yaml # 默认配置值
├── values.schema.json # values 的 JSON Schema 验证
├── charts/ # 子 Chart 依赖
├── crds/ # CRD 定义
├── templates/ # Kubernetes 清单模板
│ ├── NOTES.txt # 安装后的使用说明
│ ├── _helpers.tpl # 模板辅助函数
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── hpa.yaml
└── README.md
2. Helm 安装与仓库管理
# 安装 Helm
# Linux
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# macOS
brew install helm
# Windows (choco)
choco install kubernetes-helm
# 验证安装
helm version
# 添加 Helm 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add jetstack https://charts.jetstack.io
# 更新仓库
helm repo update
# 列出仓库
helm repo list
# 搜索 Chart
helm search hub nginx # Artifact Hub 搜索
helm search repo nginx # 本地仓库搜索
helm search repo bitnami/nginx --versions # 列出所有版本
# 查看 Chart 信息
helm show chart bitnami/nginx
helm show values bitnami/nginx
helm show readme bitnami/nginx
helm show all bitnami/nginx
3. Helm 基本操作
3.1 安装与卸载
# 安装 Chart(创建 Release)
helm install my-nginx bitnami/nginx
# 指定命名空间安装
helm install my-nginx bitnami/nginx --namespace my-namespace --create-namespace
# 使用自定义 values 文件安装
helm install my-nginx bitnami/nginx -f custom-values.yaml
# 直接设置 values
helm install my-nginx bitnami/nginx --set replicaCount=3 --set service.type=NodePort
# 从本地 Chart 安装
helm install my-app ./mychart/
# 安装前模拟(dry-run)
helm install my-nginx bitnami/nginx --dry-run --debug
# 卸载 Release
helm uninstall my-nginx
helm uninstall my-nginx --namespace my-namespace
# 查看已安装的 Release
helm list
helm list --all-namespaces
helm list -n my-namespace
3.2 升级与回滚
# 升级 Release
helm upgrade my-nginx bitnami/nginx
# 升级并指定新 values
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
helm upgrade my-nginx bitnami/nginx -f new-values.yaml
# 升级前模拟
helm upgrade my-nginx bitnami/nginx --dry-run --debug
# 检查升级状态
helm status my-nginx
# 查看 Release 历史
helm history my-nginx
# 回滚到上一版本
helm rollback my-nginx
# 回滚到指定版本
helm rollback my-nginx 1
# 查看 Release 版本差异
helm get manifest my-nginx --revision 1 > v1.yaml
helm get manifest my-nginx --revision 2 > v2.yaml
diff v1.yaml v2.yaml
3.3 Release 信息查看
# 获取 Release 状态
helm status my-nginx
# 获取渲染后的清单
helm get manifest my-nginx
# 获取 values
helm get values my-nginx
# 获取所有信息
helm get all my-nginx
# 获取 NOTES.txt 内容
helm get notes my-nginx
# 获取指定版本的清单
helm get manifest my-nginx --revision 2
4. values.yaml 定制
4.1 values 覆盖优先级
--set 指定值 > --set-file/--set-string > -f values 文件 > values.yaml 默认值
4.2 values 文件示例
# my-values.yaml
replicaCount: 3
image:
repository: nginx
tag: "1.25"
pullPolicy: IfNotPresent
service:
type: NodePort
port: 80
ingress:
enabled: true
hostname: example.com
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
persistence:
enabled: true
size: 8Gi
# 使用 values 文件安装
helm install my-nginx bitnami/nginx -f my-values.yaml
# 多个 values 文件合并
helm install my-nginx bitnami/nginx -f base.yaml -f production.yaml
# 设置复杂值
helm install my-nginx bitnami/nginx \
--set replicaCount=3 \
--set image.tag="1.25" \
--set service.type=ClusterIP \
--set ingress.enabled=true \
--set ingress.hostname=myapp.example.com
5. Chart 创建与管理
# 创建 Chart
helm create mychart
# 打包 Chart
helm package mychart/
# 验证 Chart 语法
helm lint mychart/
# 查看 Chart 依赖
helm dependency list mychart/
# 更新 Chart 依赖
helm dependency update mychart/
# 将 Chart 推送到仓库
helm push mychart-0.1.0.tgz my-repo
第二部分:Kustomize
6. Kustomize 基础
Kustomize 从 Kubernetes 1.14 开始内置在 kubectl 中,通过 kubectl apply -k 直接使用。
6.1 Kustomize 核心概念
| 概念 | 说明 |
|---|---|
| kustomization.yaml | Kustomize 配置文件(必需) |
| base | 基础配置目录 |
| overlay | 环境覆盖配置(dev/staging/prod) |
| patch | 对资源的局部修改 |
| transformer | 全局修改(labels/annotations/names 等) |
| generator | 动态生成资源(ConfigMap/Secret) |
6.2 典型目录结构
project/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ └── hpa.yaml
├── overlays/
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── patch-replicas.yaml
│ │ └── configmap-dev.yaml
│ ├── staging/
│ │ ├── kustomization.yaml
│ │ └── patch-resources.yaml
│ └── production/
│ ├── kustomization.yaml
│ ├── patch-ingress.yaml
│ └── secret-generator.yaml
7. Kustomize 典型用法
7.1 base/kustomization.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 引用的资源文件
resources:
- deployment.yaml
- service.yaml
- hpa.yaml
# 给所有资源统一添加标签
commonLabels:
app: my-app
managed-by: kustomize
# 给所有资源统一添加注解
commonAnnotations:
environment: base
project: my-project
# 命名空间
namespace: my-namespace
# 名称前缀
namePrefix: myapp-
7.2 overlays/dev/kustomization.yaml
# overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 继承 base
resources:
- ../../base
# 名称后缀
nameSuffix: -dev
# 环境标签
commonLabels:
env: dev
# 补丁(Patches)
patches:
# 战略合并补丁
- path: patch-replicas.yaml
target:
kind: Deployment
name: my-app
# JSON 补丁(6902 格式)
- patch: |-
- op: replace
path: /spec/replicas
value: 1
target:
kind: Deployment
name: my-app
# 替换镜像
images:
- name: nginx
newName: myregistry.io/myapp
newTag: dev-latest
# 生成 ConfigMap
configMapGenerator:
- name: app-config
literals:
- ENV=dev
- LOG_LEVEL=debug
files:
- configs/app.properties
# 生成 Secret
secretGenerator:
- name: app-secret
literals:
- DB_PASSWORD=dev-password
type: Opaque
7.3 patches 示例
# overlays/dev/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
template:
spec:
containers:
- name: app
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
# overlays/production/patch-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
8. Kustomize 命令
# 构建并输出 YAML
kubectl kustomize base/
kubectl kustomize overlays/dev/
kustomize build overlays/production/
# 应用配置
kubectl apply -k base/
kubectl apply -k overlays/dev/
# 删除配置
kubectl delete -k overlays/dev/
# 查看差异
kubectl diff -k overlays/dev/
# 构建并保存到文件
kubectl kustomize overlays/production/ > production-manifest.yaml
kubectl apply -f production-manifest.yaml
9. Helm vs Kustomize 对比
| 特性 | Helm | Kustomize |
|---|---|---|
| 概念 | 包管理器(Chart) | 配置定制(Overlay) |
| 模板 | Go 模板(template) | 无模板(原生 YAML) |
| 版本管理 | 内置(Release 版本) | 需配合 Git |
| 回滚 | helm rollback | Rollback via Git |
| 参数化 | values.yaml + --set | patches + generators |
| 学习曲线 | 较陡(模板语法) | 较平缓(纯 YAML) |
| 依赖管理 | 支持子 Chart | 不支持(需要用 Helm) |
| 共享 | Helm Hub / ArtifactHub | 需 Git 仓库 |
| 内置 kubectl | 否(需要 helm 命令) | 是(kubectl apply -k) |
| 最佳场景 | 第三方应用部署 | 内部应用环境管理 |
选择建议
# 适合用 Helm 的场景:
# - 部署第三方/社区应用(nginx-ingress, prometheus, cert-manager)
# - 需要版本管理和回滚的应用
# - 需要参数化部署的复杂应用
# 适合用 Kustomize 的场景:
# - 管理多个环境(dev/staging/prod)的配置差异
# - 团队偏好纯 YAML 而非模板
# - 已有大量原生 Kubernetes YAML 文件
# - 需要与 CI/CD 管道集成
10. 日常操作快速参考
# --- Helm 速查 ---
helm repo add <name> <url>
helm repo update
helm search repo <keyword>
helm install <release> <chart> -f values.yaml --set key=value
helm upgrade <release> <chart> -f new-values.yaml
helm rollback <release> <revision>
helm uninstall <release>
helm list
helm history <release>
# --- Kustomize 速查 ---
kustomize build overlays/prod/ > output.yaml
kubectl apply -k overlays/dev/
kubectl diff -k overlays/prod/
kubectl delete -k overlays/staging/
CKA 考试要点
- Helm 和 Kustomize 在 CKA 中占比很小 -- 但基础知识仍然需要
- 知道 Helm 三大概念:Chart、Release、Repository
- 知道 Kustomize 两大概念:Base、Overlay
- 会用
helm install/upgrade/rollback/uninstall - 会用
kubectl apply -k和kustomize build - 能看懂基本的 kustomization.yaml
🧪 完整操作实例:用 Helm 安装 Nginx,用 Kustomize 定制配置
场景描述
使用 Helm 安装 bitnami/nginx Chart,然后使用 Kustomize 创建一个 overlay 对 Deployment 配置进行定制(修改副本数和资源限制)。
前置条件
- 已安装 Helm v3
- 集群正常运行
- kubectl 已配置并可正常访问集群
操作步骤
Step 1: 添加 Helm 仓库并安装 nginx
# 添加 bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# "bitnami" has been added to your repositories
# 更新仓库
helm repo update
# Hang tight while we grab the latest from your chart repositories...
# ...Successfully got an update from the "bitnami" chart repository
# 安装 nginx
helm install my-nginx bitnami/nginx -n default
# NAME: my-nginx
# LAST DEPLOYED: Tue May 27 10:00:00 2026
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
Step 2: 查看 Helm Release
# 查看已安装的 Release
helm list
# NAME NAMESPACE REVISION UPDATED STATUS CHART
# my-nginx default 1 2026-05-27 10:00:00 deployed nginx-xx.x.x
# 查看渲染后的 YAML
helm get manifest my-nginx
# 查看 Release 状态
helm status my-nginx
Step 3: 创建 Kustomize 目录结构
# 创建 kustomize 工作目录
mkdir -p ~/kustomize-nginx/base
mkdir -p ~/kustomize-nginx/overlays/production
Step 4: 创建 base kustomization.yaml
cat <<'EOF' > ~/kustomize-nginx/base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
commonLabels:
app: my-nginx
managed-by: kustomize
namespace: default
EOF
Step 5: 导出 Helm Deployment 和 Service 作为 base
# 从 Helm Release 导出 YAML 作为 base
helm get manifest my-nginx > ~/kustomize-nginx/base/deployment.yaml
# 或使用 kubectl 导出
kubectl get deployment my-nginx -n default -o yaml --export > ~/kustomize-nginx/base/deployment.yaml 2>/dev/null
kubectl get service my-nginx -n default -o yaml --export > ~/kustomize-nginx/base/service.yaml 2>/dev/null
Step 6: 创建 production overlay
# 创建副本数补丁
cat <<'EOF' > ~/kustomize-nginx/overlays/production/patch-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 5
template:
spec:
containers:
- name: nginx
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1
memory: 1Gi
EOF
# 创建 overlay kustomization.yaml
cat <<'EOF' > ~/kustomize-nginx/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
- path: patch-replicas.yaml
target:
kind: Deployment
name: my-nginx
nameSuffix: -prod
commonLabels:
environment: production
EOF
Step 7: 应用 Kustomize overlay
# 预览 Kustomize 构建结果
kubectl kustomize ~/kustomize-nginx/overlays/production/
# ... 查看生成的 YAML(副本数为 5,增加了资源限制)
# 应用 Kustomize 配置
kubectl apply -k ~/kustomize-nginx/overlays/production/
# deployment.apps/my-nginx-prod created
# service/my-nginx-prod created
验证结果
# 验证 Deployment
kubectl get deployment
# NAME READY UP-TO-DATE AVAILABLE AGE
# my-nginx 1/1 1 1 5m
# my-nginx-prod 5/5 5 5 30s
# 验证副本数
kubectl get deployment my-nginx-prod -o jsonpath='{.spec.replicas}'
# 5
# 验证资源限制
kubectl get deployment my-nginx-prod -o json | jq '.spec.template.spec.containers[0].resources'
# {
# "limits": { "cpu": "1", "memory": "1Gi" },
# "requests": { "cpu": "500m", "memory": "512Mi" }
# }
# 验证标签
kubectl get deployment my-nginx-prod --show-labels
# NAME ... LABELS
# my-nginx-prod ... app=my-nginx,environment=production,managed-by=kustomize
考试提示
- Helm 和 Kustomize 在 CKA 中占比很小,但要知道基本用法
- Helm 安装主要记住
helm repo add、helm install、helm list、helm uninstall - Kustomize 内置在 kubectl 中,用
kubectl apply -k和kubectl kustomize即可 - 学会
helm get manifest将 Helm Release 导出为 YAML,再用 Kustomize 定制 kubectl kustomize <dir>只输出 YAML 到标准输出,不会实际应用到集群