使用 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 的文件作为入口点。此文件包含对各种基本文件和替换文件的引用,以及特定的替换值。

创建一个 kustomization.yaml 文件,该文件将 deployment.yaml 作为基本资源进行引用。

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

bases:

- deployment.yaml

EOF

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

kustomize build chat-app/base

此独立客户端可以与 kubectl 客户端结合使用,以直接应用输出,如以下示例所示。这样做会将 build 命令的输出直接传输到 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. 执行 build 命令

此时执行 build 会发现,生成的 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. 现在,使用以下命令写入生产补丁

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 文件

现在,在终端中执行以下命令,为开发环境和生产环境实现变体。

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 流程来修补基本文件。

运行以下命令(针对开发者)以查看合并结果。

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 并查看开发环境的合并结果

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>