1. 目标
Kustomize 是一种工具,可提供一种无需模板即可自定义应用配置的方法,从而简化现成应用的用法。它可作为独立实用程序使用,也可通过 kubectl apply -k 内置到 kubectl 中,还可作为独立的 CLI 使用。如需了解更多详情,请访问 kustomize.io。
在本教程中,您将学习 Kustomize 的一些核心概念,并使用它来管理应用和环境中的变体。
您将学习以下内容:
- 利用 kustomize 命令行客户端
- 替换常见元素
- 修补较大的 YAML 结构
- 利用多层叠加层
2. 准备工作区
- 访问以下网址,打开 Cloud Shell 编辑器
https://ide.cloud.google.com
- 在终端窗口中,为此教程创建一个工作目录
mkdir kustomize-lab
- 切换到相应目录并设置 IDE 工作区
cd kustomize-lab && cloudshell workspace .
3. 利用 kustomize 命令行客户端
Kustomize 的强大之处在于能够使用自定义值覆盖和修改基本 Kubernetes YAML。为此,kustomize 需要一个基本文件,其中包含有关文件位置和要替换的内容的说明。Kustomize 包含在 Kubernetes 生态系统中,可通过多种方法执行。
在本部分中,您将创建一个基本 kustomize 配置,并使用独立的 kustomize 命令行客户端处理文件。
- 首先,您将创建一个文件夹来存放基本配置文件
mkdir -p chat-app/base
- 在基本文件夹中创建简单的 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
- 创建基本
kustomization.yaml
Kustomize 会查找名为 kustomization.yaml 的文件作为入口点。此文件包含对各种基本文件和替换文件的引用,以及特定的替换值。
创建一个 kustomization.yaml 文件,该文件将 deployment.yaml 作为基本资源进行引用。
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
EOF
- 对基础文件夹运行 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 添加一些标签。
- 更新
kustomization.yaml文件,以包含通用标签和命名空间。
在终端中复制并执行以下命令
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
namespace: my-namespace
nameprefix: my-
commonLabels:
app: my-app
EOF
- 执行 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 还支持应用可覆盖基础资源的补丁。此技术通常用于在应用和环境之间提供可变性。
在此步骤中,您将为使用相同基本资源的单个应用创建环境变体。
- 首先,为不同的环境创建文件夹
mkdir -p chat-app/dev
mkdir -p chat-app/prod
- 使用以下命令写入过渡补丁
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
- 现在,使用以下命令写入生产补丁
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 中提供。不过,这些补丁确实包含开发环境和生产环境的独特环境变量。
- 为基本目录实现 kustomize YAML 文件
重写基本 kustomization.yaml,移除命名空间和名称前缀,因为这只是基本配置,没有变体。这些字段很快就会移至环境文件。
cat <<EOF > chat-app/base/kustomization.yaml
bases:
- deployment.yaml
commonLabels:
app: chat-app
EOF
- 为开发目录实现 Kustomize YAML 文件
现在,在终端中执行以下命令,为开发环境和生产环境实现变体。
cat <<EOF > chat-app/dev/kustomization.yaml
bases:
- ../base
namespace: dev
nameprefix: dev-
commonLabels:
env: dev
patches:
- deployment.yaml
EOF
请注意,该文件添加了 patches 部分。这表示 kustomize 应将这些文件叠加在基础资源之上。
- 为 prod 目录实现 kustomize YAML 文件
cat <<EOF > chat-app/prod/kustomization.yaml
bases:
- ../base
namespace: prod
nameprefix: prod-
commonLabels:
env: prod
patches:
- deployment.yaml
EOF
- 运行 kustomize 以合并文件
创建基本文件和环境文件后,您可以执行 kustomize 流程来修补基本文件。
运行以下命令(针对开发者)以查看合并结果。
kustomize build chat-app/dev
请注意,输出包含合并结果,例如来自基本配置和开发配置的标签,以及来自基本文件夹的容器映像名称和来自开发文件夹的环境变量。
6. 利用多层叠加层
许多组织都有一个团队来帮助支持应用团队和管理平台。这些团队通常希望包含特定细节,这些细节将包含在所有环境中的所有应用中,例如日志记录代理。
在此示例中,您将创建一个 shared-kustomize 文件夹和资源,这些文件夹和资源将包含在所有应用中,无论这些应用部署在哪个环境中。
- 创建 shared-kustomize 文件夹
mkdir shared-kustomize
- 在共享文件夹中创建简单的
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
- 在共享文件夹中创建 kustomization.yaml
cat <<EOF > shared-kustomize/kustomization.yaml
bases:
- deployment.yaml
EOF
- 从应用中引用 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
- 运行 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>