【K8s】Kustomize管理

1.什么是 Kustomize?

Kustomize 是 Kubernetes 原生的配置管理工具,采用 "Base + Overlay(基础 + 覆盖)" 的非侵入式设计。

与 Helm 的"模板参数替换"不同,Kustomize 不引入模板语法(如 {``{ .Values }}),而是直接操作合法的 Kubernetes YAML 文件,通过声明式叠加(Patch) 来生成不同环境的配置。

核心优势:

  • 无模板、无 DSL:所有文件都是标准 K8s YAML,kubectl 可直接识别

  • 原生集成:kubectl apply -k 直接支持 Kustomize,无需安装额外工具

  • GitOps 友好:天然适合与 ArgoCD、Flux 等 GitOps 工具配合

2.核心概念

  1. kustomization.yaml 文件:是 Kustomize 的核心配置文件,定义了如何生成最终的 Kubernetes 资源文件。

  2. Resources :在 kustomization.yaml 文件中定义的 Kubernetes 资源列表,可以是文件、目录或者 远程仓库中的资源。

  3. Generators:如 configMapGenerator 和 secretGenerator,它们可以根据文件或字面值生成 ConfigMap 或 Secret。

  4. Patches :用于修改现有资源的字段。Kustomize支持策略性合并补丁(patchesStrategicMerge) 和JSON补丁(patchesJson6902)。

  • patchesStrategicMerge 补丁方式使用 YAML 文件来定义,它允许直接编辑资源的YAML 结构, 等同于编辑原始资源文件,直观且易于理解,适合于熟悉Kubernetes资源配置的人。
  • patchesJson6902 使用的是 JSON 补丁(JSON Patch)的方式,这是一种更为灵活和强大的补丁应用方式。JSON补丁遵循 JSON Patch 规范(RFC 6902),允许执行更复杂的操作,如添加、 删除、替换、测试等。
  1. Kustomize 将配置分为两层:

|-----------------|--------------|-----------------------------------------------|
| 概念 | 定义 | 存放内容 |
| Base(基础) | 所有环境共享的公共配置 | Deployment、Service、ConfigMap 的骨架(资源定义、标签、端口等) |
| Overlay(覆盖) | 针对特定环境的差异化配置 | 镜像 Tag、副本数、资源限制、环境变量等按环境变化的字段 |

3.目录结构示例:

4.准备Base目录

Base 的定位 :存放所有环境一致的"最小公共结构"。

关键原则 :Base 里不要写死带环境语义的配置(如 :develop、:prod 镜像 Tag),否则 overlay 漏覆盖时会跑错版本。

步骤:

1.准备资源文件(base/deployment.yaml)

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1                      # base 写默认值,overlay 再覆盖
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx              # 注意容器名必须与 overlay 匹配[reference:11]
          image: nginx             # 不带 Tag,留给 overlay 指定
          ports:
            - containerPort: 80

2.准备 Base 的 Kustomization 文件(base/kustomization.yaml)

复制代码
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:                         # 声明 base 包含哪些资源文件
  - deployment.yaml
  - service.yaml
commonLabels:                      # 自动为所有资源添加公共标签
  app: myapp
namespace: default

5.准备Overlay目录

Overlay 的定位 :引用 Base,并通过补丁(Patch) 覆盖环境差异。

1.创建开发环境 Overlay(overlays/dev/kustomization.yaml)

复制代码
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base                      # 引用 base 目录
patches:                            # 声明补丁文件
  - path: deployment-patch.yaml

2.编写补丁文件(overlays/dev/deployment-patch.yaml)

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 2                       # 开发环境 2 个副本
  template:
    spec:
      containers:
        - name: nginx               # 注意:必须与 base 中的容器名完全一致[reference:18]
          image: nginx:dev          # 开发环境用 dev Tag

3.创建生产环境 Overlay(overlays/prod/kustomization.yaml)

复制代码
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
  - grafana-depl.yaml               # 生产环境可额外增加资源[reference:20]
patches:
  - target:                         # 也可使用 JSON 6902 补丁格式[reference:21]
      kind: Deployment
      name: web-deployment
    patch: |
      - op: replace
        path: /spec/replicas
        value: 5

6.验证Overlay成果

发布前必须先验证,避免将错误配置推送到集群。

渲染并检查最终yaml文件:

复制代码
# 渲染开发环境配置,检查镜像 Tag、副本数、容器名
kustomize build overlays/dev | grep -A 6 'containers:'

# 或保存为文件详细检查
kustomize build overlays/dev > /tmp/dev-rendered.yaml

需要验证镜像Tag、容器名、副本数三项关键内容。

检查项 要看的内容 常见问题
镜像 Tag image: 是否是目标环境 Tag 生产环境漏覆盖,继续使用开发 Tag
容器名 overlay 的 containers[].name 是否匹配 base 写错 name 会追加第二个容器
副本数 replicas 是否符合环境预期 base 默认值被误用到正式环境

执行 Dry-Run 校验 Schema:

复制代码
# 校验 YAML 语法和 K8s Schema 是否正确
kustomize build overlays/dev | kubectl apply --dry-run=client -f -

7.发布开发环境

验证通过后,将渲染后的配置应用到集群。

两种方式:

复制代码
#方式一:kustomize build + kubectl apply(最推荐)
kustomize build overlays/dev | kubectl apply -f -

#方式二:kubectl 原生支持(-k 参数)
kubectl apply -k overlays/dev

8.总结与补充

1.完整的工作流程

2.一个描述上的细节

Kustomization" 通常指 kustomization.yaml 这个核心文件及其承载的配置声明,而 "Kustomize" 才是执行工具。

相关推荐
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS4 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun4 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)4 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang4 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren4 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿4 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl4 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、4 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove4 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21