Kustomize 配置 Kubernetes 应用

Kustomize 是专为 Kubernetes 设计的声明式配置管理工具,允许用户通过分层和声明式方式定制和管理应用程序配置,无需直接修改原始清单文件。Kustomize 已集成到 kubectl ,成为 Kubernetes 原生配置管理方案。

Kustomize 提供多种声明式配置管理能力,适用于复杂的 Kubernetes 应用场景:

  • 配置合并与分层管理

    Kustomize 采用 基础配置( base覆盖配置( overlay 的分层架构:

    • 基础配置(base) :应用的通用资源定义
    • 覆盖配置(overlay) :针对特定环境或需求的定制,支持修改、添加或删除基础内容
  • 声明式配置与复用

    Kustomize 使用 YAML 格式的 kustomization.yaml 文件描述定制规则,支持:

    • 资源引用与组合
    • 名称前后缀统一管理
    • 标签与注释批量添加
    • 环境变量与配置映射替换
    • 镜像标签动态修改

    通过组件与补丁(patches),实现配置的复用与跨项目共享,降低维护成本。

  • 多环境配置管理

    Kustomize 天然支持多环境部署,可为开发、测试、生产等环境创建专属覆盖(overlay)配置,实现一套基础配置适配多环境。

关键特性

  • 无模板定制 :无需模板语言即可修改清单
  • 基于覆盖(overlay)的配置 :通过补丁实现变体
  • 资源生成 :自动生成 ConfigMapsSecrets
  • 资源转换 :内置或自定义转换器
  • 插件系统 :支持多种插件扩展,扩展资源生成与转换能力。插件类型包括:
    • Generators :如 ConfigMapGeneratorSecretGenerator
    • Transformers :如 PatchTransformerNamespaceTransformer
    • Validators :资源校验插件
  • 变量替换 :运行时数据注入

自 Kubernetes 1.14 起,Kustomize 已内置于 kubectl ,提供原生配置管理能力。 kubectl 内置 Kustomize 版本随 Kubernetes 版本变化。

$ kubectl version --client
Client Version: v1.35.0
Kustomize Version: v5.7.1

Kustomize 相关常用命令

直接应用配置:

kubectl apply -k overlays/dev
kubectl apply --kustomize overlays/dev

预览生成的清单:

kubectl kustomize overlays/prod

查看配置差异:

kubectl diff -k overlays/prod

删除应用的资源:

kubectl delete -k overlays/dev

配置结构

基础配置结构示例

base/
├── kustomization.yaml
├── deployment.yaml
├── service.yaml
└── configmap.yaml

base/kustomization.yaml 示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
- service.yaml
- configmap.yaml

commonLabels:
app: webapp

在此基础上的特定环境的配置

overlays/
├── dev/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
└── prod/
├── kustomization.yaml
├── replica-patch.yaml
└── resource-limits.yaml

verlays/dev/kustomization.yaml 示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: webapp-dev

resources:
- ../../base

patchesStrategicMerge:
- replica-patch.yaml

images:
- name: webapp
newTag: dev-latest

overlays/prod/kustomization.yaml 示例:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: webapp-prod

resources:
- ../../base

patchesStrategicMerge:
- replica-patch.yaml
- resource-limits.yaml

images:
- name: webapp
newTag: v1.2.3

replicas:
- name: webapp-deployment
count: 3

核心概念说明

  • Base : 原始(最初版本)未修改的通用配置
  • Overlays : 基于 Base 层为特定环境自定义配置的层
  • Resources : Kubernetes YAML 对象
  • kustomization.yaml : 声明资源与定制规则

Kustomization 对象

Kustomization 官方说明文档参考

kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: my-namespace
namePrefix: dev-
nameSuffix: "-001"
labels:
- pairs:
app: bingo
includeSelectors: true
commonAnnotations:
oncallPager: 800-555-1212
resources:
- deployment.yaml

贯穿性字段 通常用于以下目的:

  • 为所有资源设置相同的名字空间( namespace
  • 为所有对象添加相同的前缀或后缀( namePrefix / nameSuffix
  • 为对象添加相同的标签集合 ( labels )
  • 为对象添加相同的注解集合( commonAnnotations )