在 Kubernetes 环境中部署应用程序时,开发 (Dev)、暂存 (Staging) 和生产 (Production) 环境的配置有所不同是很常见的。过去,这通常需要复制 YAML 文件或使用复杂的 Helm 模板。Kustomize 作为一种“无模板”的配置管理工具应运而生,解决了这些不便。🛠️

1. Kustomize 是什么?
Kustomize 是一个用于自定义 Kubernetes 对象配置的工具。自 2019 年 Kubernetes 1.14 版本起,它已内置于 kubectl 中,无需单独安装,即可通过 kubectl apply -k 命令直接使用。
Kustomize 最显著的特点是其覆盖 (Overlay) 方式。它保留原始 YAML 文件 (Base) 不变,只将每个环境需要更改的部分定义在单独的文件中,以覆盖的方式应用。
2. 核心概念:Base 和 Overlays
要理解 Kustomize,掌握 Base 和 Overlays 之间的关系至关重要。🏗️
- Base (基础): 在所有环境中通用的标准清单集。包括基本的 Deployment、Service、ConfigMap 等。
- Overlays (覆盖): 根据特定环境重新定义 Base 的层。例如,在生产环境中,您可能会增加副本 (Replicas) 数量或加强资源限制。
3. 标准目录结构
使用 Kustomize 时,建议采用以下目录层次结构。📂
.
└── deploy/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── patch-repl-count.yaml
└── prod/
├── kustomization.yaml
└── resource-limits.yaml
4. 主要功能和代码示例 💻
4.1 kustomization.yaml 组成部分
此文件充当 Kustomize 的引擎。它定义了要包含哪些资源以及要更改哪些设置。
# base/kustomization.yaml 示例
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
4.2 patches (应用补丁)
当您只想修改特定字段时使用。例如,仅在生产环境中将副本数增加到 5 个。
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
- target:
kind: Deployment
name: my-app
patch: |-
- op: replace
path: /spec/replicas
value: 5
4.3 Generators (生成器)
从文件或环境变量列表中自动生成 ConfigMap 和 Secret。当文件内容更改时,哈希值会自动更新,从而触发 Pod 的滚动更新。🔄
# kustomization.yaml
configMapGenerator:
- name: app-config
files:
- config.properties
secretGenerator:
- name: db-secret
envs:
- .env.db
4.4 Transformers (转换器)
将通用属性批量应用于所有资源。
- namePrefix / nameSuffix: 在资源名称前后添加字符串
- commonLabels: 为所有资源分配标签
- commonAnnotations: 为所有资源分配注解
- namespace: 指定所有资源的命名空间
5. Kustomize 的优缺点 📊
| 类别 | 优点 | 缺点 |
| — | — | — |
| 可读性 | 保持纯 YAML 格式,易于阅读 | 无法处理复杂的条件语句 (if-else) |
| 学习曲线 | 无需学习模板语法 (Go template) | 如果目录结构变得复杂,难以追踪 |
| 集成性 | 内置于 kubectl,无需额外工具 | 如果环境差异极大,可能导致代码重复 |
| 运维 | 与 GitOps (ArgoCD 等) 兼容性极佳 | 除了简单的值替换外,难以实现动态逻辑 |
—
6. 执行方法
配置完成后,您可以通过以下命令查看最终渲染的 YAML 或直接部署。
# 检查渲染结果 (Dry-run)
kubectl kustomize ./overlays/prod
# 部署到实际集群
kubectl apply -k ./overlays/prod
Kustomize 是一个强大的工具,可以提高配置的重用性,并清晰地管理环境差异。对于希望在没有模板复杂性的情况下将基础设施作为代码 (IaC) 进行管理的团队来说,它是最佳选择。🚀
发表回复