2. Kustomize 基础:Kustomize 是什么、核心概念与安装
2.1 Kustomize 是什么
Kustomize 是 Kubernetes 生态中原生的配置管理工具,它通过 声明式覆盖(Declarative Overlay) 机制,在不修改原始 YAML 文件的前提下,实现对 Kubernetes 资源的多环境定制。Kustomize 自 kubectl 1.14 起被内置为 kubectl apply -k 子命令,无需额外安装即可使用。
核心设计哲学: 模板无关(Template-Free)。Kustomize 不引入 Go Template、Helm Chart 等模板语法,而是通过纯 YAML 的 补丁(Patch) 和 资源组合(Resource Composition) 实现配置复用,避免模板膨胀与调试困难。
2.2 核心概念
2.2.1 kustomization.yaml
每个 Kustomize 项目的根目录下必须包含一个 kustomization.yaml 文件,它是整个定制过程的 入口清单。该文件声明了所有要管理的资源路径、要应用的补丁、要生成的 ConfigMap/Secret 等。
# 一个典型的 kustomization.yaml 结构
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 1. 资源引用
resources:
- deployment.yaml
- service.yaml
- namespace.yaml
# 2. 名称前缀
namePrefix: prod-
# 3. 通用标签
commonLabels:
app.kubernetes.io/managed-by: kustomize
environment: production
# 4. 镜像替换
images:
- name: nginx
newTag: 1.25.3-alpine
# 5. 补丁(Patches)
patches:
- path: increase-replicas.yaml
target:
kind: Deployment
name: web-app
2.2.2 resources(资源声明)
resources 字段列出所有需要被 Kustomize 管理的原始 Kubernetes YAML 文件路径。这些文件可以是 Deployment、Service、ConfigMap、Namespace 等任意合法资源。Kustomize 会按顺序读取并合并它们,然后应用后续的补丁和转换。
| 字段 | 说明 | 示例 |
|---|---|---|
resources |
引用本地文件或 URL 中的 Kubernetes 资源清单 | resources: [deploy.yaml, svc.yaml] |
components |
引用可复用的组件目录(类似模块化资源包) | components: [../monitoring/prometheus] |
crds |
声明自定义资源定义(CRD),避免校验错误 | crds: [crd/my-crd.yaml] |
2.2.3 patches(补丁)
补丁是 Kustomize 实现 环境差异化 的核心机制。Kustomize 支持两种补丁策略:Strategic Merge Patch(SMP) 和 JSON Patch(RFC 6902)。
- Strategic Merge Patch(推荐):Kubernetes 原生支持的合并策略,可以按
kind、name、namespace等字段精准定位目标资源,并只覆盖指定字段。 - JSON Patch:使用
add、remove、replace操作数组索引或路径,适合对列表字段做精确修改。
# patches 示例:为生产环境增加副本数
# increase-replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 5
最佳实践: 将
base/ 目录存放通用资源,overlays/ 目录存放各环境(dev/staging/prod)的补丁和差异化配置。这种 Base + Overlay 模式是 Kustomize 最推荐的项目结构。
2.3 Kustomize 工作流程(SVG)
2.4 安装与版本选择
2.4.1 安装方式
| 安装方式 | 命令 / 步骤 | 适用场景 |
|---|---|---|
| kubectl 内置(推荐) | kubectl apply -k <dir> |
Kubernetes 1.14+,无需额外安装 |
| 独立二进制 | curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash |
需要独立 CLI 或 CI/CD 流水线 |
| Go 安装 | go install sigs.k8s.io/kustomize/kustomize/v5@latest |
Go 开发者环境 |
| Homebrew(macOS) | brew install kustomize |
macOS 开发机 |
2.4.2 版本选择建议
Kustomize 版本与 Kubernetes API 版本存在对应关系。建议根据集群版本选择兼容的 Kustomize 版本:
| Kustomize 版本 | kubectl 内置版本 | Kubernetes 兼容范围 | 推荐场景 |
|---|---|---|---|
| v5.x | kubectl v1.27+ | 1.24 ~ 最新 | 新项目、生产环境 |
| v4.x | kubectl v1.21 ~ v1.26 | 1.20 ~ 1.26 | 存量集群升级过渡 |
| v3.x | kubectl v1.14 ~ v1.20 | 1.14 ~ 1.20 | 老旧集群维护 |
版本兼容性注意: Kustomize v5 移除了对
patchesStrategicMerge 旧字段的支持,统一使用 patches 字段。如果从 v3 直接升级到 v5,需要将 patchesStrategicMerge 迁移为 patches 格式。建议新项目直接使用 kustomize v5 + kubectl v1.27+ 组合。
2.5 验证安装
安装完成后,运行以下命令验证 Kustomize 是否正常工作:
# 检查 kubectl 内置版本
kubectl version --client
# 检查独立 Kustomize 版本(如果单独安装)
kustomize version
# 快速测试:创建一个空目录并运行 kustomize build
mkdir test-kustomize && cd test-kustomize
cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources: []
EOF
kustomize build . # 应输出空资源列表,无报错
生产环境建议: 在 CI/CD 流水线中使用 固定版本 的独立 Kustomize 二进制,避免因 kubectl 版本升级导致行为变化。推荐使用
kustomize v5.3.0 或更高版本,其对 Helm Chart 转换和原生 Sidecar 支持更完善。