将 Config Sync 与 Kustomize 和 Helm 搭配使用

了解如何使用 Config Sync 安装现成的 Helm 组件。

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

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

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

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

  • 您的开发工作流将得到简化。如果没有自动渲染,对原始配置所做的更改需要接受两次审核才能合并;一次是在原始仓库中,另一次在渲染仓库中。通过自动呈现,呈现配置由 Config Sync 生成,您只需审核对原始配置的更改。

目标

  • 使用引用 cert-manager 的现成 Helm 图表的 Kustomize 配置来配置代码库。cert-manager 是 Kubernetes 的工具,可帮助您管理证书。
  • 预览并验证您创建的配置。
  • 使用 Config Sync 自动呈现图表,并将您的集群同步到您的代码库。
  • 验证安装是否成功。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 创建符合 Config Sync 要求并使用以下 Config Sync 设置的集群,或确保您有权访问此集群:
  4. 舰队注册集群
  5. 安装 nomos 命令行工具。 如果您已经安装了 nomos 工具,请确保将其升级到 1.9.0 或更高版本。
  6. 安装 Helm

如果您对 Git、Kustomize 和 Helm 有一定的了解,将会很有帮助。

配置您的代码库

以下任务展示了如何准备一个所包含的配置可以将 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 代码库同步

现在您已经创建了包含要使用的配置的代码库,接下来您可以配置从集群到代码库的同步。如果您已安装 Config Sync,请继续验证同步状态

  1. 在 Google Cloud 控制台中,启用 GKE Hub API。

    转到 GKE Hub API

  2. 在 Google Cloud 控制台中,前往功能部分下的配置页面。

    前往“配置”

  3. 点击 安装 Config Sync

  4. 选择自动升级,以启用 Config Sync 以自动升级版本。

  5. 安装选项下,选择在各个集群上安装 Config Sync

  6. 可用集群表中,选择 cs-cluster,然后点击安装 Config Sync。几分钟后,您应该会在设置标签页中看到 cs-cluster 的状态为已启用

  7. Config Sync 信息中心上,点击部署软件包

  8. 选择要部署软件包的集群表中,选择 cs-cluster,然后点击继续

  9. 保留托管在 Git 上的软件包,然后点击继续

  10. 软件包名称字段中,输入 sample-repository

  11. 代码库网址字段中,输入 https://github.com/GoogleCloudPlatform/anthos-config-management-samples

  12. 路径字段中,输入 config-sync-quickstart/multirepo/root

  13. 其他所有字段保留默认值。

  14. 点击部署软件包

    几分钟后,您应该会在 cs-cluster同步状态列中看到已同步

验证安装

安装和配置 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
    

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除各个资源

删除您的代码库中的清单

为了帮助防止意外删除,Config Sync 不允许在单个提交作业中移除所有命名空间或集群级资源。按照以下说明可以正常卸载组件并在单独的提交作业中移除命名空间:

  1. 从代码库中移除 cert-manager 组件:

    git rm -rf manifests/cert-manager \
        && git commit -m "uninstall cert-manager" \
        && git push origin BRANCH
    

    BRANCH 替换为您在其中创建代码库的分支。

  2. 删除 cert-manager 命名空间:

    git rm manifests/namespace-cert-manager.yaml \
        && git commit -m "remove the cert-manager namespace" \
        && git push origin BRANCH
    
  3. 验证 cert-manager 命名空间是否不存在:

    kubectl get namespace cert-namespace
    

    输出示例:

    Error from server (NotFound): namespaces "cert-namespace" not found
    

删除集群

如需删除集群,请完成以下命令:

控制台

如需使用 Google Cloud 控制台删除集群,请完成以下任务:

  1. 在 Google Cloud 控制台中,转到 GKE 页面。

    转到 GKE

  2. 在您要删除的集群旁边,点击 操作,然后点击 删除

  3. 当系统提示您确认时,再次点击删除

gcloud

如需使用 Google Cloud CLI 删除集群,请运行以下命令:

gcloud container clusters delete CLUSTER_NAME

如需了解详情,请参阅 gcloud container clusters delete 文档。

后续步骤