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

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

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

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

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

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

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

代码库架构

在本教程中,您将配置 Config Sync 以同步到 Anthos Config Management 示例代码库的 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
bases:
- ../../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 Console 的“项目选择器”页面上,选择或创建两个 Google Cloud 项目。

    转到“项目选择器”

  2. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  3. gcloud 命令行工具升级到最新版本。

  4. 安装或升级 nomos 命令

创建并注册集群

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

  1. 克隆 Anthos Config Management 示例代码库:

    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 集群,在生产项目中创建一个名为 prod 的 GKE 集群。此脚本还会启用 GKE 和 Anthos API,并连接到您的 devprod 集群,以便您可以使用 kubectl 访问其 API。

    输出示例:

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

    ./register-clusters.sh
    

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

    输出示例:

    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. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

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

后续步骤