将 Config Sync 与 Kustomize 和 Helm 搭配使用

在本教程中,您将添加将 Helm 图表引用到您的代码库的 Kustomize 配置,然后使用 Config Sync 将集群同步到您的代码库。

使用 Config Sync 时,系统会自动呈现您放置在 Git 代码库中的 Kustomize 配置和 Helm 图表。自动呈现具有以下优势:

  • 您不再需要外部混合流水线。如果没有自动呈现,您将必须在工作站上使用 Kustomize 和 Helm 手动呈现配置,或设置一个步骤以便在 CI 系统中触发混合过程。对于自动呈现,Config Sync 将会处理执行过程。

  • 维护费用将会降低。如果没有自动呈现,您必须维护一个具有原始 Kustomize 配置和 Helm 图表的 Git 代码库,以及另一个包含由外部混合过程生成的输出的 Git 代码库。然后,您必须将 Config Sync 配置为将 Git 代码库与呈现的输出进行同步。通过自动呈现,您只需维护一个具有原始配置的代码库。

  • 您的开发工作流将得到简化。如果没有自动呈现功能,则对原始配置进行的更改需要先经过两次审核,然后才能合并;一次在原始代码库中,另一次在呈现的代码库中。通过自动呈现,呈现配置由 Config Sync 生成,您只需审核对原始配置的更改。

配置您的代码库

以下任务展示了如何准备一个所包含的配置可以将 Kustomize 配置与 Helm 图表结合使用的 Git 代码库:

  1. 创建 Git 代码库或确保您有权访问 Git 代码库。由于您的代码库使用 Kustomize 和 Helm,因此这是一个非结构化代码库。

  2. 在 Git 代码库的根目录中,创建一个名为 kustomization.yaml 的文件,并将以下代码粘贴到其中:

    # ./kustomization.yaml
    resources:
    - base
    
    patches:
    - path: ignore-deployment-mutation-patch.yaml
      target:
        kind: Deployment
    

    此文件是一个指向 Kustomize 库Kustomize 叠加层。此叠加层包含 Helm 图表库的一个补丁程序,用于向所有 Deployment 对象添加 client.lifecycle.config.k8s.io/mutation: ignore 注释。注释会导致 Config Sync 忽略您在集群中创建此对象之后对其执行的任何冲突更改。

  3. 在 Git 代码库中,创建一个名为 base 的目录:

    mkdir base
    
  4. base 目录中,创建另一个名为 kustomization.yaml 的文件,并将以下代码粘贴到其中:

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

    此文件是 Kustomize 库,用于呈现远程 Helm 图表。

  5. 返回 Git 代码库的根目录,创建一个名为 ignore-deployment-mutation-patch.yaml 的文件,并将以下代码粘贴到其中:

    # ./ignore-deployment-mutation-patch.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: any
     annotations:
       client.lifecycle.config.k8s.io/mutation: ignore
    

    此文件是一个应用于基本 Helm 图表的补丁。它将 client.lifecycle.config.k8s.io/mutation: ignore 注释添加到基本目录中的所有 Deployment。

  6. 将更改提交到代码库:

    git add .
    git commit -m 'Set up manifests.'
    git push
    

示例代码库的示例展示了此类代码库。

预览并验证呈现的配置

在 Config Sync 呈现配置并将配置同步到集群之前,请运行 nomos hydrate 来预览呈现的配置并运行 nomos vet 以验证格式是否正确,从而确保配置准确无误。

  1. 运行带有以下标志的以下 nomos hydrate

    nomos hydrate \
        --source-format=unstructured \
        --output=OUTPUT_DIRECTORY
    

    在此命令中:

    • --source-format=unstructured 允许 nomos hydrate 处理非结构化代码库。由于您正在使用 Kustomize 配置和 Helm 图表,因此需要使用非结构化代码库并添加此标志。
    • 利用 --output=OUTPUT_DIRECTORY 可以定义所呈现配置的路径。将 OUTPUT_DIRECTORY 替换为您希望将输出保存的位置。
  2. 通过运行带有以下标志的 nomos vet 来检查配置的语法和有效性:

    nomos vet \
        --source-format=unstructured \
        --keep-output=true \
        --output=OUTPUT_DIRECTORY
    

    在此命令中:

    • --source-format=unstructured 允许 nomos vet 处理非结构化代码库。
    • --keep-output=true 用于保存呈现的配置。
    • --output=OUTPUT_DIRECTORY 是所呈现的配置的路径。

配置从 Git 代码库同步

现在您已经创建了包含要使用的配置的代码库,接下来您可以配置从集群到代码库的同步。

  1. 如需配置 RootSync 对象,请创建 root-sync.yaml 文件:

    # root-sync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: YOUR_GIT_REPOSITORY
        branch: main
        auth: none
      override:
        enableShellInRendering: true
    

    YOUR_GIT_REPOSITORY 替换为您的 Git 代码库的网址。

  2. root-sync.yaml 文件应用到集群:

    kubectl apply -f root-sync.yaml
    

验证安装

安装和配置 Config Sync 后,您可以验证安装是否成功完成。

  1. 使用 nomos status 验证是否没有其他错误:

    nomos status
    

    输出示例:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  2. 验证 Helm 组件是否已成功安装:

    kubectl get all -n cert-manager
    

    输出示例:

    NAME                                              READY   STATUS    RESTARTS   AGE
    pod/my-cert-manager-54f5ccf74-wfzs4               1/1     Running   0          10m
    pod/my-cert-manager-cainjector-574bc8678c-rh7mq   1/1     Running   0          10m
    pod/my-cert-manager-webhook-7454f4c77d-rkct8      1/1     Running   0          10m
    
    NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/my-cert-manager           ClusterIP   10.76.9.35     <none>        9402/TCP   10m
    service/my-cert-manager-webhook   ClusterIP   10.76.11.205   <none>        443/TCP    10m
    
    NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cert-manager              1/1     1            1           10m
    deployment.apps/my-cert-manager-cainjector   1/1     1            1           10m
    deployment.apps/my-cert-manager-webhook      1/1     1            1           10m
    
    NAME                                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/my-cert-manager-54f5ccf74               1         1         1       10m
    replicaset.apps/my-cert-manager-cainjector-574bc8678c   1         1         1       10m
    replicaset.apps/my-cert-manager-webhook-7454f4c77d      1         1         1       10m