在本教程中,您将添加将 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的以下收费组件:
如需根据您的预计使用量来估算费用,请使用价格计算器。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
- 创建符合 Config Sync 要求并使用以下 Config Sync 设置的集群,或确保您有权访问此集群:
- 使用非结构化代码库。
RootSync和RepoSyncAPI 已启用。spec.override.enableShellInRendering设置为true,以便 Config Sync 支持在渲染过程中从公共代码库拉取远程库。
- 向舰队注册集群。
- 安装
nomos命令行工具。 如果您已经安装了nomos工具,请确保将其升级到 1.9.0 或更高版本。 - 安装 Helm
如果您对 Git、Kustomize 和 Helm 有一定的了解,将会很有帮助。
配置您的代码库
以下任务展示了如何准备一个所包含的配置可以将 Kustomize 配置与 Helm 图表结合使用的 Git 代码库:
创建 Git 代码库或确保您有权访问 Git 代码库。由于您的代码库使用 Kustomize 和 Helm,因此这是一个非结构化代码库。
在 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 忽略您在集群中创建此对象之后对其执行的任何冲突更改。在 Git 代码库中,创建一个名为
base的目录:mkdir base在
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 图表。
返回 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。将更改提交到代码库:
git add . git commit -m 'Set up manifests.' git push
示例代码库的示例展示了此类代码库。
预览并验证呈现的配置
在 Config Sync 呈现配置并将配置同步到集群之前,请运行 nomos hydrate 来预览呈现的配置并运行 nomos vet 以验证格式是否正确,从而确保配置准确无误。
运行带有以下标志的以下
nomos hydrate:nomos hydrate \ --source-format=unstructured \ --output=OUTPUT_DIRECTORY在此命令中:
--source-format=unstructured允许nomos hydrate处理非结构化代码库。由于您正在使用 Kustomize 配置和 Helm 图表,因此需要使用非结构化代码库并添加此标志。- 利用
--output=OUTPUT_DIRECTORY可以定义所呈现配置的路径。将OUTPUT_DIRECTORY替换为您希望将输出保存的位置。
通过运行带有以下标志的
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 代码库同步
现在您已经创建了包含要使用的配置的代码库,接下来您可以配置从集群到代码库的同步。
如需配置
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 代码库的网址。将
root-sync.yaml文件应用到集群:kubectl apply -f root-sync.yaml
验证安装
安装和配置 Config Sync 后,您可以验证安装是否成功完成。
使用
nomos status验证是否没有其他错误:nomos status输出示例:
*CLUSTER_NAME -------------------- <root> https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init SYNCED fd17dd5a验证 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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除各个资源
删除您的代码库中的清单
为了帮助防止意外删除,Config Sync 不允许在单个提交作业中移除所有命名空间或集群级资源。按照以下说明可以正常卸载组件并在单独的提交作业中移除命名空间:
从代码库中移除 cert-manager 组件:
git rm -rf manifests/cert-manager \ && git commit -m "uninstall cert-manager" \ && git push origin BRANCH将
BRANCH替换为您在其中创建代码库的分支。删除 cert-manager 命名空间:
git rm manifests/namespace-cert-manager.yaml \ && git commit -m "remove the cert-manager namespace" \ && git push origin BRANCH验证 cert-manager 命名空间是否不存在:
kubectl get namespace cert-namespace输出示例:
Error from server (NotFound): namespaces "cert-namespace" not found
删除集群
如需删除集群,请完成以下命令:
控制台
如需使用 Google Cloud 控制台删除集群,请完成以下任务:
在 Google Cloud 控制台中,前往 GKE 页面。
在您要删除的集群旁边,点击 more_vert 操作,然后点击 delete 删除。
当系统提示您确认时,再次点击删除。
gcloud
如需使用 Google Cloud CLI 删除集群,请运行以下命令:
gcloud container clusters delete CLUSTER_NAME
如需了解详情,请参阅 gcloud container clusters delete 文档。
后续步骤
- 详细了解如何使用非结构化代码库。