将 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 生成,您只需审核对原始配置的更改。

目标

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

费用

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

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

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

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  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 代码库同步

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

  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
    

清理

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

删除项目

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除各个资源

删除您的代码库中的清单

为了帮助防止意外删除,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 文档。

后续步骤