2. Kustomize 安装与基础配置:安装方式、kubectl 内置集成、初始化项目结构
在开始使用 Kustomize 管理环境差异化镜像配置之前,首先需要正确安装工具并理解其项目结构。Kustomize 提供了多种安装路径,且从 Kubernetes 1.14 开始已原生集成在 kubectl 中。本章将系统讲解三种安装方式、验证方法以及标准项目结构的初始化流程。
2.1 安装方式对比
根据团队工作流和集群版本的不同,可以选择以下三种安装方式之一:
| 安装方式 | 适用场景 | 版本管理 | 推荐度 |
|---|---|---|---|
| kubectl 内置集成 | Kubernetes ≥ 1.14,日常运维 | 随 kubectl 版本绑定 | ⭐⭐⭐⭐⭐ |
| 独立二进制安装 | CI/CD 管道、需要最新特性 | 独立升级,灵活可控 | ⭐⭐⭐⭐ |
| Go 源码编译 | 二次开发、定制化需求 | 完全自主控制 | ⭐⭐⭐ |
推荐策略: 本地开发使用
kubectl 内置集成,CI/CD 环境使用独立二进制,确保版本一致且不受 kubectl 版本限制。
2.2 kubectl 内置集成(默认推荐)
从 Kubernetes 1.14 开始,kustomize 子命令已内置于 kubectl 中。验证方式如下:
# 检查 kubectl 版本(需 ≥ 1.14)
kubectl version --client
# 验证 kustomize 子命令可用
kubectl kustomize --help
# 查看内置 kustomize 版本
kubectl kustomize version
内置集成的核心命令映射关系:
| 独立 kustomize 命令 | kubectl 等效命令 | 说明 |
|---|---|---|
kustomize build . |
kubectl kustomize . |
渲染当前目录的 kustomization |
kustomize build overlay/prod |
kubectl kustomize overlay/prod |
渲染指定 overlay 目录 |
kustomize build . | kubectl apply -f - |
kubectl apply -k . |
直接构建并应用(kubectl 1.21+) |
注意: 内置版本可能落后于独立发布版。若需要使用 Kustomize 最新特性(如 Helm 集成、变量替换增强),建议使用独立二进制。
2.3 独立二进制安装(推荐 CI/CD)
适用于需要精确控制版本或使用最新功能的场景。以下为 Linux/macOS 通用安装步骤:
# 下载指定版本(以 v5.4.3 为例)
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash -s 5.4.3
# 移动至系统 PATH
sudo mv kustomize /usr/local/bin/
# 验证安装
kustomize version
# 预期输出示例
# {kustomize/v5.4.3 (2024-05-20T15:00:00Z) ...}
macOS 用户也可通过 Homebrew 安装:
brew install kustomize
2.4 初始化项目结构
Kustomize 项目遵循 base + overlay 的层级模式。以下为推荐的标准目录结构:
my-app/
├── base/ # 基准配置(环境无关)
│ ├── kustomization.yaml # 基准 kustomization 文件
│ ├── deployment.yaml # Deployment 资源
│ ├── service.yaml # Service 资源
│ └── configmap.yaml # ConfigMap 资源
├── overlay/ # 环境差异化配置
│ ├── dev/ # 开发环境
│ │ ├── kustomization.yaml
│ │ ├── deployment-patch.yaml
│ │ └── configmap-patch.yaml
│ ├── staging/ # 预发布环境
│ │ ├── kustomization.yaml
│ │ └── deployment-patch.yaml
│ └── prod/ # 生产环境
│ ├── kustomization.yaml
│ ├── deployment-patch.yaml
│ └── secrets.yaml
└── README.md
核心原则:
- base/ 存放所有环境共享的基准资源,不包含任何环境特定值。
- overlay/ 每个子目录代表一个独立环境,通过
resources引用 base,并通过patches进行差异化覆盖。 - kustomization.yaml 是每个目录的入口文件,Kustomize 通过它识别配置。
2.5 初始化 kustomization.yaml
在 base/ 目录下创建基准 kustomization.yaml:
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
# 公共标签(所有资源自动注入)
commonLabels:
app: my-app
managed-by: kustomize
# 公共注解
commonAnnotations:
version: "1.0.0"
environment: "base"
在 overlay/dev/ 目录下创建开发环境 kustomization.yaml:
# overlay/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
# 引用 base 目录(相对路径)
resources:
- ../../base
# 环境特定补丁
patches:
- path: deployment-patch.yaml
target:
kind: Deployment
name: my-app
# 环境特定镜像覆盖
images:
- name: my-app-image
newName: registry.dev.example.com/my-app
newTag: dev-20240520
# 环境特定名称前缀
namePrefix: dev-
# 环境特定命名空间
namespace: dev-ns
2.6 验证项目结构
使用以下命令验证项目结构是否正确:
# 构建 base(验证基准配置)
kubectl kustomize base/
# 构建 dev overlay(验证环境差异化)
kubectl kustomize overlay/dev/
# 直接应用 dev 环境(kubectl 1.21+)
kubectl apply -k overlay/dev/
快速检查: 使用
kustomize build overlay/dev/ | yq eval 可以格式化输出,便于人工审查渲染结果。
2.7 常见安装问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
kubectl kustomize 命令不存在 |
kubectl 版本低于 1.14 | 升级 kubectl 或使用独立二进制 |
kustomize build 报 "no such file" |
kustomization.yaml 路径错误 | 检查工作目录是否包含 kustomization.yaml |
| 独立二进制安装后命令找不到 | 未添加到 PATH 或权限不足 | 执行 sudo mv kustomize /usr/local/bin/ |
| Homebrew 安装版本过旧 | brew 源未更新 | 执行 brew update && brew upgrade kustomize |
最佳实践:
- 将
kustomize version写入 CI/CD 管道的日志头部,便于追溯构建版本。 - 在项目根目录创建
.kustomize-version文件,记录项目所需的 Kustomize 版本。 - 使用
kustomize build输出重定向到文件,进行版本对比审计:kustomize build overlay/prod/ > rendered-prod.yaml。