使用 Kustomize 进行扩缩

1. 目标

Kustomize 是一款工具,引入了一种无模板的方法,用于自定义应用配置,从而简化现有应用的使用。它可作为独立实用程序使用,通过 kubectl apply -k 内置到 kubectl 中,可作为独立 CLI 使用。如需了解详情,请访问 kustomize.io

在本教程中,您将了解 Kustomize 的一些核心概念,并使用它来管理应用和环境中的变体。

您将学习以下内容:

  • 利用 kustomize 命令行客户端
  • 替换常见元素
  • 修补较大的 yaml 结构
  • 利用多层叠加层

2. 准备工作区

  1. 访问以下网址,打开 Cloud Shell 编辑器

https://ide.cloud.google.com

  1. 在终端窗口中,为本教程创建一个工作目录

mkdir kustomize-lab

  1. 切换到该目录并设置 IDE 工作区

cd kustomize-lab && cloudshell workspace .

3. 利用 kustomize 命令行客户端

kustomize 的强大功能来自使用自定义值叠加和修改基础 Kubernetes yaml 的功能。为此,kustomize 需要一个基础文件,其中包含有关这些文件的位置和要替换的内容的说明。Kustomize 包含在 Kubernetes 生态系统中,可以通过各种方法执行。

在本部分中,您将创建基本 kustomize 配置,并使用独立的 kustomize 命令行客户端处理文件。

  1. 首先,您需要创建一个文件夹来保存基础配置文件

mkdir -p chat-app/base

  1. 在基本文件夹中创建简单的 Kubernetes deployment.yaml

cat <<EOF > chat-app/base/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`metadata:`

  `name: chat-app`

`spec:`

  `containers:`

  `- name: chat-app`

    `image: chat-app-image`

EOF

  1. 创建基本 kustomization.yaml

Kustomize 会查找名为 kustomization.yaml 的文件作为入口点。此文件包含对各种基本文件和替换文件以及特定替换值的引用。

创建一个引用 deployment.yaml 作为基础资源的 kustomization.yaml 文件。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. 对基本文件夹运行 kustomize 命令。这样做可以输出未进行任何更改的部署 YAML 文件,这是因为您尚未添加任何变体。

kustomize build chat-app/base

此独立客户端可与 kubectl 客户端结合使用,以直接应用输出,如以下示例所示。这样,构建命令的输出就会直接流式传输到 kubectl apply 命令。

(不执行 - 提供此信息,仅供参考)

kustomize build chat-app/base | kubectl apply -f -

如果需要特定版本的 kustomize 客户端,此方法很有用。

或者,您也可以使用集成在 kubectl 本身中的工具执行 kustomize。如下例所示。

(不执行 - 提供此信息,仅供参考)

kubectl apply -k chat-app/base

4. 替换常见元素

现在,您的工作区已配置完毕,并且您已验证 kustomize 运行正常,是时候替换一些基本值了。

图像、命名空间和标签通常针对每个应用和环境进行自定义。由于它们经常被更改,因此 Kustomize 允许您直接在 kustomize.yaml 中声明它们,这样您就无需为这些常见场景创建许多补丁。

此方法通常用于创建模板的特定实例。现在,只需更改名称及其命名空间,即可将一组基本资源用于多个实现。

在此示例中,您将添加命名空间和名称前缀,并向 kustomization.yaml 添加一些标签。

  1. 更新 kustomization.yaml 文件以包含常见标签和命名空间。

在您的终端中复制并执行以下命令

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. 执行构建命令

此时执行构建会显示生成的 YAML 文件现在在服务定义和部署定义中都包含命名空间、标签和带前缀的名称。

kustomize build chat-app/base

请注意输出内容如何包含部署 YAML 文件中未包含的标签和命名空间。另请注意是如何将名称从“chat-app”更改为“my-chat-app”的

(不复制输出)

kind: Deployment

metadata:

labels:

`app: my-app`

name: my-chat-app

namespace: my-namespace

5. 修补较大的 yaml 结构

Kustomize 还提供应用补丁以叠加在基础资源上的功能。此技术通常用于提供应用和环境之间的变化。

在此步骤中,您将为使用相同基础资源的单个应用创建环境变体。

  1. 首先为不同的环境创建文件夹

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. 使用以下命令编写阶段补丁

cat <<EOF > chat-app/dev/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: dev`

EOF

  1. 现在,使用以下命令编写 prod 补丁

cat <<EOF > chat-app/prod/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: prod`

EOF

请注意,上述补丁不包含容器映像名称。您在上一步中创建的 base/deployment.yaml 中提供了该值。不过,这些补丁包含针对开发和生产的唯一环境变量。

  1. 为基本目录实现 kustomize YAML 文件

重写基本 kustomization.yaml,移除命名空间和名称前缀,因为这只是没有变化的基本配置。这些字段很快就会移动到环境文件中。

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. 为开发目录实现 kustomize YAML 文件

现在,在终端中执行以下命令,以实现 dev 和 prod 的变体。

cat <<EOF > chat-app/dev/kustomization.yaml

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

请注意,该文件中添加了 patches: 部分。这表示 kustomize 应将这些文件叠加在基础资源之上。

  1. 为 prod 目录实现 kustomize YAML 文件

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. 运行 kustomize 合并文件

创建基本文件和环境文件后,您可以执行 kustomize 进程来修补基础文件。

针对 dev 运行以下命令以查看合并结果。

kustomize build chat-app/dev

请注意,输出结果包含合并结果,例如来自基本配置和开发者配置的标签,以及来自基础配置的容器映像名称和来自开发文件夹的环境变量。

6. 利用多层叠加层

许多组织都有一支团队,负责为应用团队提供支持并管理平台。这些团队通常希望包含要添加到所有环境的全部应用内的特定详细信息,例如日志记录代理。

在此示例中,您将创建一个 shared-kustomize 文件夹和资源,无论部署的环境如何,所有应用都将包含这些资源。

  1. 创建 shared-kustomize 文件夹

mkdir shared-kustomize

  1. 在共享文件夹中创建简单的 deployment.yaml

cat <<EOF > shared-kustomize/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: logging-agent`

    `image: logging-agent-image`

EOF

  1. 在共享文件夹中创建 kustomization.yaml

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. 从您的应用中引用 shared-kustomize 文件夹

由于您希望 shared-kustomize 文件夹作为所有应用的基础文件夹,因此需要更新 chat-app/base/kustomization.yaml 以使用 shared-kustomize 作为基础文件夹。然后在其上修补自己的 Deployment.yaml。然后,环境文件夹会在此基础上再次修补。

在您的终端中复制并执行以下命令

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. 运行 kustomize 并查看 dev 的合并结果

kustomize build chat-app/dev

请注意,输出包含来自应用库、应用环境和 shared-kustomize 文件夹的合并结果。具体来说,您可以在容器部分查看来自所有三个位置的值。

(不复制输出)

<pre>

`containers:`

      `- env:`

        `- name: ENVIRONMENT`

          `value: dev`

        `name: chat-app`

      `- image: image`

        `name: app`

      `- image: logging-agent-image`

        `name: logging-agent`

</pre>