【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" 才是执行工具。

相关推荐
石小千2 小时前
Docker 笔记(九)--离线安装
docker·容器
dazhong20123 小时前
Docker 进阶篇(二) Docker Compose 部署 Nginx 实践
nginx·docker·容器
码--到成功3 小时前
Docker、Kubernetes安装系列 一
docker·容器·kubernetes
是乐乐啊呀3 小时前
常用破解软件
容器
bruce1284 小时前
K8s Pod 异常重启排查
云原生·容器·kubernetes
MetaLite4 小时前
微服务认证选型-SpringSecurity-SaToken与自研方案
微服务·云原生·架构
FoldWinCard5 小时前
基于k8s高可用web集群
前端·容器·kubernetes
cui_hao_nan5 小时前
Docker学习3
docker·容器
玉&心5 小时前
在Docker中部署前端和后端的实现
运维·docker·容器