在多个环境中使用 Config Sync 实现自动渲染


本教程介绍如何使用适用于 Config Sync 的最佳实践,在两个环境(一个用于开发,一个用于生产)中为 Google Kubernetes Engine (GKE) Enterprise 版本设置 Config Sync。

在此场景中,您是 Foo Corp 的一个平台管理团队的成员。Foo Corpp 应用会部署到 GKE Enterprise,其中资源分布在两个项目中:devproddev 项目包含开发 GKE Enterprise 集群,prod 项目包含生产 GKE Enterprise 集群。作为平台管理员,您的目标是确保这两个环境都符合 Foo Corp 的政策,并且 Kubernetes 命名空间和服务账号等基础级层资源在这两种环境中保持一致。

下图展示了您在本教程中设置的环境概览:

您在本教程中设置的环境概览。

本教程利用 Config Sync 中的自动渲染功能来呈现集群上的资源。每个集群都配置为从包含 Kustomization 配置文件的目录进行同步,该文件将在 Config Sync 中自动触发渲染过程。如需了解详情,请参阅将代码库与 Kustomize 配置和 Helm 图表结合使用

如上图所示,在本教程中,您将创建以下资源:

  • 两个 Google Cloud 项目,分别表示开发和生产环境。
  • 位于不同项目的两个 GKE Enterprise 集群 devprod,都安装了 Config Sync。

代码库架构

在本教程中,您将配置 Config Sync 以同步到示例代码库的 config-source/ 目录中的配置。此目录包含以下目录和文件:

config-source/
├── base
│   ├── foo
│   │   ├── kustomization.yaml
│   │   ├── namespace.yaml
│   │   └── serviceaccount.yaml
│   ├── kustomization.yaml
│   ├── pod-creator-clusterrole.yaml
│   └── pod-creator-rolebinding.yaml
├── cloudbuild.yaml
├── overlays
│   ├── dev
│   │   └── kustomization.yaml
│   └── prod
│       └── kustomization.yaml
└── README.md

config-source 目录包含 base/ 清单以及 dev/prod/ Kustomize 叠加层。每个目录都包含一个 kustomization.yaml 文件,其中列出了 Kustomize 应管理并应用于集群的文件。在 dev/kustomization.yamlprod/kustomization.yaml 中定义了一系列补丁程序。这些补丁程序会操纵该特定环境的 base/ 资源。

例如,开发 RoleBinding 允许所有 Foo Corp 开发者将 Pod 部署到开发集群,而生产 RoleBinding 仅允许持续部署代理 deploy-bot@foo-corp.com 将 Pod 部署到生产环境:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
# ServiceAccount - make name unique per environ
- target:
    kind: ServiceAccount
    name: foo-ksa
  patch: |-
    - op: replace
      path: /metadata/name
      value: foo-ksa-dev
    - op: replace
      path: /metadata/namespace
      value: foo-dev
# Pod creators - give all Foo Corp developers access
- target:
    kind: RoleBinding
    name: pod-creators
  patch: |-
    - op: replace
      path: /subjects/0/name
      value: developers-all@foo-corp.com
commonLabels:
  environment: dev

目标

  • 将 Config Sync 设置为自动呈现和同步两个单独环境的配置。

费用

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

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

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

准备工作

在开始本教程之前,请确保您已完成以下步骤:

  1. 在 Google Cloud 控制台中的项目选择器页面上,选择或创建两个 Google Cloud 项目。

    转到“项目选择器”

  2. Make sure that billing is enabled for your Google Cloud project.

  3. 将 Google Cloud CLI 升级到最新版本。

  4. 安装或升级 nomos 命令

创建并注册集群

为了让您专注于为多个环境配置 Config Sync 时需要使用的工作流,multi-environments-kustomize 目录包含可用于自动配置 Config Sync 的脚本。

  1. 克隆示例代码库:

    git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
    
  2. 导航到包含本教程所需资源的文件夹:

    cd anthos-config-management-samples/multi-environments-kustomize/
    
  3. 如需运行本教程中使用的脚本,请设置以下变量:

    export DEV_PROJECT="DEV_PROJECT_ID"
    export PROD_PROJECT="PROD_PROJECT_ID"
    export DEV_CLUSTER_ZONE="DEV_CLUSTER_ZONE"
    export PROD_CLUSTER_ZONE="PROD_CLUSTER_ZONE"
    export CM_CONFIG_DIR="config-sync-rendering"
    

    请替换以下内容:

    • DEV_PROJECT_ID:您要用作开发项目的 Google Cloud 项目中的项目 ID
    • PROD_PROJECT_ID:您要用作生产项目的 Google Cloud 项目中的项目 ID
    • DEV_CLUSTER_ZONE:您要在其中创建开发集群的 Compute Engine 可用区。例如 us-central1-c
    • PROD_CLUSTER_ZONE:您要在其中创建生产集群的 Compute Engine 可用区
  4. 如需创建两个集群,请运行 ./create-clusters.sh 脚本:

    ./create-clusters.sh
    

    此脚本会在开发项目中创建一个名为 dev 的 GKE Enterprise 集群,在生产项目中创建一个名为 prod 的 GKE Enterprise 集群。此脚本还会启用 GKE Enterprise API 并连接到您的 devprod 集群,以便您可以使用 kubectl 访问其 API。

    输出示例:

    kubeconfig entry generated for dev.
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for prod.
    ⭐️ Done creating clusters.
    
  5. 如需将集群注册到两个单独的舰队,请运行 register-clusters.sh 脚本:

    ./register-clusters.sh
    

    此脚本会创建一个 Google Cloud 服务账号和密钥以用于 GKE Enterprise 集群注册,然后使用 gcloud container fleet memberships register 命令将 devprod 集群注册到其项目中的 GKE Enterprise。

    输出示例:

    Waiting for Feature Config Management to be created...done.
    ⭐️ Done registering clusters.
    

设置 Config Sync

现在您已创建并注册集群,接下来可以安装 Config Sync 并验证安装。

安装 Config Sync

如需在开发和生产集群上安装 Config Sync,请运行 install-config-sync.sh 脚本:

./install-config-sync.sh

预期输出:

🔁 Installing ConfigSync on the dev cluster...
Updated property [core/project].
Switched to context "DEV_CLUSTER".
Waiting for Feature Config Management to be updated...done.
🔁 Installing ConfigSync on the prod cluster...
Updated property [core/project].
Switched to context "PROD_CLUSTER".
Waiting for Feature Config Management to be updated...done.

Config Sync 现在正在同步到代码库中的配置。

验证您的配置

在本部分中,您将检查集群是否同步到代码库中的配置:

  1. 如需检查 Config Sync 安装的状态,请运行 nomos status 命令

    nomos status
    

    您应该会看到开发集群和生产集群现在均已同步到其各自的代码库:

    gke_DEV_PROJECT_ID_us-central1-c_dev
      --------------------
      <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/dev@main
      SYNCED   8f2e196f
      Managed resources:
         NAMESPACE   NAME                                                 STATUS
                     clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                     namespace/default                                    Current
                     namespace/foo                                        Current
         default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
         foo         serviceaccount/foo-ksa-dev                           Current
    
    *gke_PROD_PROJECT_ID_us-central1-c_prod
       --------------------
       <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/prod@main
       SYNCED   c91502ee
       Managed resources:
          NAMESPACE   NAME                                                 STATUS
                      clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                      namespace/default                                    Current
                      namespace/foo                                        Current
          default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
          foo         serviceaccount/foo-ksa-prod                          Current
    
      ```
    
  2. 使用 kubectl 切换到开发集群:

    kubectl config use-context "gke_${DEV_PROJECT}_${DEV_CLUSTER_ZONE}_dev"
    
  3. 如需验证资源是否已同步,请获取命名空间。您应该会看到 foo 命名空间。

    kubectl get namespace
    

    输出示例:

    NAME                           STATUS   AGE
    config-management-monitoring   Active   9m38s
    config-management-system       Active   9m38s
    default                        Active   47h
    foo                            Active   9m5s
    kube-node-lease                Active   47h
    kube-public                    Active   47h
    kube-system                    Active   47h
    resource-group-system          Active   9m30s
    

    现在,您已经为跨多个 Google Cloud 项目和环境的开发和生产环境设置了自动配置渲染。

清除数据

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

删除所有资源

如需删除您在本教程中创建的资源,但要保持开发和生产项目不变,请运行清理脚本:

./cleanup.sh

删除项目

  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.

后续步骤