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)

Kustomize 工作流程:Base + Overlay 模式 Kustomize 工作流程:Base + Overlay 模式 Base 目录 通用资源(Deployment/Service) Overlay 目录 环境补丁(Patches) kustomize build 合并 & 补丁应用 最终 YAML 输出 kubectl apply -k overlays/prod 直接部署合并后的资源

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 支持更完善。