使用 Kustomize 管理 Kubernetes 应用程序配置指南

在 Kubernetes 环境中部署应用程序时,开发 (Dev)、暂存 (Staging) 和生产 (Production) 环境的配置有所不同是很常见的。过去,这通常需要复制 YAML 文件或使用复杂的 Helm 模板。Kustomize 作为一种“无模板”的配置管理工具应运而生,解决了这些不便。🛠️


1. Kustomize 是什么?

Kustomize 是一个用于自定义 Kubernetes 对象配置的工具。自 2019 年 Kubernetes 1.14 版本起,它已内置于 kubectl 中,无需单独安装,即可通过 kubectl apply -k 命令直接使用。

Kustomize 最显著的特点是其覆盖 (Overlay) 方式。它保留原始 YAML 文件 (Base) 不变,只将每个环境需要更改的部分定义在单独的文件中,以覆盖的方式应用。


2. 核心概念:Base 和 Overlays

要理解 Kustomize,掌握 BaseOverlays 之间的关系至关重要。🏗️

  • Base (基础): 在所有环境中通用的标准清单集。包括基本的 Deployment、Service、ConfigMap 等。
  • Overlays (覆盖): 根据特定环境重新定义 Base 的层。例如,在生产环境中,您可能会增加副本 (Replicas) 数量或加强资源限制。

3. 标准目录结构

使用 Kustomize 时,建议采用以下目录层次结构。📂

.
└── deploy/
    ├── base/
    │   ├── deployment.yaml
    │   ├── service.yaml
    │   └── kustomization.yaml
    └── overlays/
        ├── dev/
        │   ├── kustomization.yaml
        │   └── patch-repl-count.yaml
        └── prod/
            ├── kustomization.yaml
            └── resource-limits.yaml

4. 主要功能和代码示例 💻

4.1 kustomization.yaml 组成部分

此文件充当 Kustomize 的引擎。它定义了要包含哪些资源以及要更改哪些设置。

# base/kustomization.yaml 示例
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml

4.2 patches (应用补丁)

当您只想修改特定字段时使用。例如,仅在生产环境中将副本数增加到 5 个。

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

resources:
  - ../../base

patches:
  - target:
      kind: Deployment
      name: my-app
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 5

4.3 Generators (生成器)

从文件或环境变量列表中自动生成 ConfigMap 和 Secret。当文件内容更改时,哈希值会自动更新,从而触发 Pod 的滚动更新。🔄

# kustomization.yaml
configMapGenerator:
  - name: app-config
    files:
      - config.properties
secretGenerator:
  - name: db-secret
    envs:
      - .env.db

4.4 Transformers (转换器)

将通用属性批量应用于所有资源。

  • namePrefix / nameSuffix: 在资源名称前后添加字符串
  • commonLabels: 为所有资源分配标签
  • commonAnnotations: 为所有资源分配注解
  • namespace: 指定所有资源的命名空间

5. Kustomize 的优缺点 📊

类别 优点 缺点
可读性 保持纯 YAML 格式,易于阅读 无法处理复杂的条件语句 (if-else)
学习曲线 无需学习模板语法 (Go template) 如果目录结构变得复杂,难以追踪
集成性 内置于 kubectl,无需额外工具 如果环境差异极大,可能导致代码重复
运维 与 GitOps (ArgoCD 等) 兼容性极佳 除了简单的值替换外,难以实现动态逻辑

6. 执行方法

配置完成后,您可以通过以下命令查看最终渲染的 YAML 或直接部署。

# 检查渲染结果 (Dry-run)
kubectl kustomize ./overlays/prod

# 部署到实际集群
kubectl apply -k ./overlays/prod

Kustomize 是一个强大的工具,可以提高配置的重用性,并清晰地管理环境差异。对于希望在没有模板复杂性的情况下将基础设施作为代码 (IaC) 进行管理的团队来说,它是最佳选择。🚀


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注