使用 Kustomize 配置 Kubernetes

本文档旨在帮助您开始使用 Kustomize,了解其预期用例,并查找将其与其他 Google Cloud 工具搭配使用所需的资源。

Kustomize 是一种 Kubernetes 配置转换工具,可让您自定义未模板化的 YAML 文件,同时让原始文件保持不变。Kustomize 还可以根据其他表示法生成 ConfigMap 和 Secret 等资源。Kustomize 专为 Kubernetes API 构建,因此它可以理解和修改 Kubernetes 样式的对象。

Kustomize 简介

Kustomize 由 Google 和 Kubernetes 社区构建,符合 Kubernetes 使用 Kubernetes 对象定义配置文件和以声明方式管理这些配置的原则。Kustomize 配置对象称为 Kustomization,用于描述如何生成或转换其他 Kubernetes 对象。Kustomization 在名为 kustomization.yaml 的文件中以声明方式定义,此文件可由 Kustomize 本身生成和修改。

在 kustomize 中,您可以定义常见、可重复使用的 kustomization(称为基础)并使用多个其他 kustomization(称为叠加层)对其进行修补,这些 kustomization 可以选择性地覆盖基础中定义的设置以生成变体。然后,Kustomize 根据 kustomization 基础和叠加层中定义的配置转换和生成资源,此过程称为融合或渲染。接下来,这些渲染资源会写入标准输出或文件,并保持原始 YAML 文件不变,以便许多不同的叠加层重复使用基础。

映像

这种无模板方法在 Kustomization 库的易用性和可重用性方面非常强大。使用它您能够以几乎任何想要的方式自定义 Kubernetes 配置,而无需为每个单独的用例提供大量值。

Kustomize 的优势

使用 Kustomize 管理 Kubernetes 配置的优势包括:

  • Kustomize 是无模板的。 使用模板和值文件时,YAML 文件中的几乎所有规范都可以成为需要值的参数,并且值文件可能会非常大。Kustomize 处理配置数据,而不是将配置模板化为文本或将配置表示为代码。原始 YAML 可读且可重复使用,无论 Kustomize 是否呈现原始 YAML。Kustomize 模型不同;无需对所有内容进行参数化,因此可以更轻松地重复使用常用配置。

  • Kustomize 可以在 Kubernetes 命令行界面中以原生方式运行。从 1.14 版开始,Kustomize 内置于 kubectl。因此,只要您使用 kubectl,就无需将 Kustomize 作为单独的依赖项来进行安装或管理。

  • Kustomize 完全是声明性的。作为 Kubernetes 原生工具,Kustomize 与 Kubernetes 的声明式配置方法保持一致。您无需以命令方式逐步描述该工具应如何自定义资源,只需声明您想要的内容即可,Kustomize 会提供这些内容。

  • Kustomize 允许您重复使用同一基础配置来管理多项不同的配置。您可以在多个不同环境(例如,开发、预演、生产)中使用一个基础文件,并且使用最小的唯一叠加层为每个环境自定义基础。

  • Kustomize 易于使用。您可以遵循浅显的学习曲线,从非常简单的配置开始,然后逐步构建更复杂的功能(每次构建一层)。

  • Kustomize 可扩展且可自定义。 Kustomize 支持插件框架,可让您以容器化和可执行 Kubernetes 资源模型 (KRM) 函数的方式编写自己的生成器和转换器。如需详细了解如何创建您自己的插件,请参阅官方 Kustomize 插件指南

本地安装

要在本地环境中安装 Kustomize,请运行以下命令:

gcloud components install kustomize

Google Cloud 中的 Kustomize 支持

Kustomize 预安装在 Cloud Shell 中,并且受 Skaffold 支持。系统还支持其作为 Cloud Build 的构建器

从 Anthos Config Management 1.9.0 版开始,如果代码库中包含 kustomization 文件,Config Sync 会自动使用 Kustomize 呈现代码库中的资源。如需详细了解此功能,请参阅将代码库与 Kustomize 配置和 Helm 图表结合使用

了解 Kustomize

基础和叠加层

Kustomize 的配置转换方法使用 Kustomization 层,因此可以跨多个 Kustomization 配置重复使用相同的基础配置文件。它通过基础和叠加层的概念来实现这一点。

  • 基础是包含名为 kustomization.yaml 的文件的目录,可以枚举一组资源以及将应用于它们的一些自定义配置。应在 kustomization 文件的 resources 字段中声明基础。
  • 叠加层是一个目录,该目录将另一个 kustomization 目录引用为它的基础或者它的基础之一。

您可以将基础视为流水线中的初步步骤,而无需了解引用它的叠加层。基础处理完后,会将其资源作为输入发送到叠加层,以根据叠加层的规范进行转换。

以下是 kustomization 基础的示例:

# base/kustomization.yaml
resources:
- deployment.yaml
namePrefix: bar-
#base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
    spec:
      containers:
      - image: nginx
        name: nginx

此基础可以被多个 kustomization 叠加层重复使用。以下是可以引用此基础的叠加层示例:

# overlay/kustomization.yaml
resources:
- ../base
- configmap.yaml
namePrefix: foo-
#overlay/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm
data:
  red: blue

运行 kustomize build overlay 命令会生成以下输出:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo-bar-nginx
spec:
  template:
    metadata:
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-cm
data:
  red: blue

Deployment 从基础 kustomization 接收名称前缀 bar-,然后从叠加层 kustomization 接收另一个名称前缀 foo-。ConfigMap 仅接收名称前缀 foo-,因为它是在叠加层中声明的,因此仅由叠加层处理。

生成 Secret 和 ConfigMap

您可以使用 kustomization 文件中的 secretGeneratorconfigMapGenerator 字段从文件生成 Secret 和 ConfigMap。例如:

# kustomization.yaml
configMapGenerator:
- name: my-app
  files:
  -.properties

生成以下 YAML 输出:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-g82klmn92h
data:
  .properties: |-
      red=blue

修改 kustomization 文件

Kustomize 提供多条命令式命令,用于帮助您管理 Kustomization 文件。

  • 如需将当前目录中的所有 YAML 文件添加到 Kustomization 的 resources 字段中,请运行以下命令:

    kustomize edit add resource *.yaml
    
  • 如需查看 kustomize 修改帮助页面以及其提供的所有子命令,请运行以下命令:

    kustomize edit -h
    
  • 如需获取子命令的特定帮助,请将子命令作为参数添加。例如:

    kustomize edit add -h
    

后续步骤

官方文档

如需详细了解 kustomization.yaml 文件中支持的字段,您可以访问官方 kustomize 文档,其中提供了您可以使用的各种字段的说明和示例。

不支持的特性

如需查看 Kustomize 特意不支持的功能列表,您可以了解 Kustomize 的回避功能