使用 Kustomize 配置 Kubernetes

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

如果您要将 Helm 图表与 Config Sync 结合使用,有两种受支持的方法:通过 Kustomize 呈现 Helm 或使用 Helm API。本页面详细介绍了通过 Kustomize 呈现 Helm 图表的要求。如需详细了解如何使用 Helm API,请参阅从 Artifact Registry 同步 Helm 图表

使用 Kustomize 呈现 Helm 图表时,存在以下差异:

  • 不支持专用和基于 OCI 的 Helm 库。Helm API 支持私有库和基于 OCI 的库。
  • Helm 值可以在可靠来源中管理。使用 Helm API 时,值作为 RootSync 或 RepoSync API 的一部分进行管理。
  • 支持在 RootSync 或 RepoSync 对象中呈现多个 Helm 图表。使用 Helm API 时,您只能在 RootSync 或 RepoSync 对象中呈现一个 Helm 图表。

Kustomize 的 Config Sync 要求

如需自动呈现 Kustomize 配置和 Helm 图表,请确保您的 Config Sync 环境满足以下要求:

  • 使用非结构化可信来源分层来源不支持自动渲染。
  • 如需触发渲染流程,您的可信来源目录的根目录中必须包含 Kustomization 配置文件(kustomization.yamlkustomization.ymlKustomization)。如果根目录中没有 Kustomization 配置文件,则 Config Sync 会按原样同步配置,不需要进行任何呈现。
  • 将您的配置添加到 kustomization.yaml 文件中。如果不添加这些配置文件,则配置不会同步到集群。

通过 Kustomize 呈现 Helm 图表

本部分介绍如何通过 Kustomize 呈现 Helm 图表。捆绑的 Helm 和 Kustomize 版本列出了与对应版本的 Config Sync 捆绑的 Kustomize 和 Helm 版本。

Helm 图表字段

您可以将以下 Helm 图表字段添加到您的 kustomization.yaml 文件中,以支持通过 Kustomize 呈现 Helm 图表:

字段 说明
helmGlobals 应用于所有 Helm 图表的参数
helmGlobals.chartHome 接受字符串。相对于 Kustomization 根目录的路径,指向包含要包含在 Kustomization 中的每个图表的子目录的目录。此字段的默认值为 charts
helmGlobals.configHome 接受字符串。定义 Kustomize 应使用 HELM_CONFIG_HOME 环境变量传递到 Helm 的值。Kustomize 不会尝试读取或写入此目录。如果省略,则使用 TMP_DIR/helm,其中 TMP_DIR 是 Kustomize 为 Helm 创建的临时目录。
helmCharts Helm 图表参数的数组
helmCharts.name 接受字符串。图表的名称。此字段是必填字段。
helmCharts.version 接受字符串。图表的版本
helmCharts.repo 接受字符串。用于定位图表的网址
helmCharts.releaseName 接受字符串。替换图表模板输出中的 RELEASE_NAME
helmCharts.namespace 接受字符串。设置版本的目标命名空间(模板中的 .Release.Namespace)
helmCharts.valuesInline 用于替换图表随附的默认值的值
helmCharts.valuesFile 接受字符串。ValuesFile 是要使用的值文件的本地路径或远程网址,而不是随图表附带的默认值。默认值为 CHART_HOME/NAME/values.yaml
helmCharts.valuesMerge 接受 mergeoverride(default)replace。ValuesMerge 指定如何相对于 Values 处理 ValuesInline。
helmCharts.includeCRDs 接受 truefalse。指定 Helm 是否还应生成 CustomResourceDefinitions。默认值为 false

Kustomize 配置的架构示例

以下示例演示了如何设置可信来源,以将 Kustomize 配置与自动渲染结合使用。此目录包含三个引用同一基础的叠加层(team-ateam-bteam-c)。

下图展示了目录结构:

├── base
│   ├── kustomization.yaml
│   ├── namespace.yaml
│   ├── networkpolicy.yaml
│   ├── rolebinding.yaml
│   └── role.yaml
├── kustomization.yaml
├── README.md
├── team-a
│   └── kustomization.yaml
├── team-b
│   └── kustomization.yaml
└── team-c
    └── kustomization.yaml

以下 kustomization.yaml 文件位于可信来源的根目录中,它包含对三个叠加层的引用:

# ./kustomization.yaml
resources:
- team-a
- team-b
- team-c

以下 kustomize.yaml 位于 team-a 目录中,是 team-a 的叠加层:

# ./team-a/kustomization.yaml
namespace: team-a

resources:
- ../base

patches:
- target:
   kind: RoleBinding
   name: team-admin-rolebinding
 patch: |-
   - op: replace
     path: /subjects/0/name
     value: team-a-admin@mydomain.com
- target:
   kind: Namespace
   name: default
 patch: |-
   - op: replace
     path: /metadata/name
     value: team-a

以下 kustomization.yaml 位于 base 目录中,是 Kustomize 库:

# ./base/kustomization.yaml
resources:
- namespace.yaml
- rolebinding.yaml
- role.yaml
- networkpolicy.yaml

您可以在 GitHub 的配置特定于命名空间的政策目录中浏览示例代码库。

呈现远程 Helm 图表

Config Sync 支持在具有公开互联网访问权限的集群上呈现远程 Helm 图表。

以下 kustomization.yaml 通过设置以下 helmCharts 字段来呈现远程 cert-manager

# ./kustomization.yaml
...
helmCharts:
- name: cert-manager
  repo: https://charts.jetstack.io
  version: v1.5.3
  releaseName: my-cert-manager
  namespace: cert-manager
...

呈现本地 Helm 图表

Config Sync 支持呈现本地 Helm 图表。如需使用 Helm 图表的自定义版本,您可以从 Helm 图表中提取已发布版本(例如 ArtifactHub),在本地进行更改,然后将更改推送到可信来源。

以下 kustomization.yaml 呈现一个本地 cert-manager 图表。Helm 图表的默认目录是 charts,并且由于此图表会签入到 charts 目录中,因此您无需指定 .helmCharts.repo.helmCharts.version

# ./kustomization.yaml
...
helmCharts:
- name: cert-manager
  releaseName: my-cert-manager
  namespace: cert-manager
...

呈现多个 Helm 图表

无论图表是远程还是本地,Config Sync 都支持在一个 kustomization.yaml 文件中呈现多个 Helm 图表。

以下 kustomization.yaml 呈现一个本地 Helm 图表 (cert-manager):

# ./kustomization.yaml
...
helmCharts:
- name: cert-manager
  releaseName: my-cert-manager
  namespace: cert-manager
- name: prometheus
  repo: https://prometheus-community.github.io/helm-charts
  version: 14.3.0
  releaseName: my-prometheus
  namespace: monitoring
...

后续步骤