使用 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 文件中添加您的配置。如果不添加这些配置文件,则配置不会同步到集群。
  • 在 Config Sync 1.19.0 之前,所有配置都必须包含在 Kustomization 根目录下。从 1.19.0 版开始,Config Sync 支持根目录之外的文件。

呈现 Kustomize 配置

以下示例演示了如何设置可信来源以使用具有自动呈现功能的 Kustomize 配置。

Kustomize 配置的示例架构

此目录包含四个引用同一个库的叠加层(team-ateam-bteam-cexternal-team),以及 ConfigMap 生成器使用的文件。

下图展示了目录结构:

├── example
│   ├── 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
├── external-team
│   └── kustomization.yaml
└── external-data.txt

以下 kustomization.yaml 文件位于可靠来源的根目录中,其中包含对四个叠加层的引用,以及来自本地文件的 ConfigMap 生成器:

# ./example/kustomization.yaml
resources:
- team-a
- team-b
- team-c
- ../external-team # Starting from 1.19.0, Config Sync allows external resources located outside of the Kustomization root directory.

configMapGenerator:
- name: my-configmap
  namespace: my-namespace
  files:
    - ../external-data.txt # Starting from 1.19.0, Config Sync allows external files located outside of the Kustomization root directory.

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

# ./example/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 库:

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

您可以在 GitHub 的配置命名空间专用政策目录中探索示例仓库。

通过 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

呈现远程 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)拉取已发布的版本,在本地进行更改,然后将更改推送到可靠来源。

下图展示了目录结构:

├── base
│   ├── charts
│   │   └── cert-manager
│   └── kustomization.yaml
├── overlays
│   └── stage
│       └── kustomization.yaml
└── base_value_overrides.yaml

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

# ./overlays/stage/kustomization.yaml
...
# This field is optional if your Helm charts are located in the default 'charts' directory.
helmGlobals:
  # Starting from 1.19.0, Config Sync allows loading from an external directory outside of the Kustomization root.
  chartHome: ../../base/charts
helmCharts:
- name: cert-manager
  releaseName: my-cert-manager
  namespace: cert-manager
  # Specify a local path or a remote URL to a values file instead of using the default values in CHART_HOME/NAME/values.yaml.
  valuesFile: ../../base_value_overrides.yaml
...

呈现多个 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
...

后续步骤