使用 Config Controller 管理资源

了解如何创建预装有 Config Connector、Policy Controller 和 Config Sync 的 Config Controller 实例。接下来,通过完成以下任务来了解如何使用实例:

  • 使用 Config Connector 创建和管理 Google Cloud 资源。
  • 创建 Policy Controller 限制条件以强制执行政策,并在部署之前检测是否存在违反政策的情况。
  • 通过将 Config Sync 配置为从包含 Google Cloud 资源的示例代码库进行同步来设置 GitOps。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

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

  6. Enable the KRM、GKE API、Resource Manager 和 Service Usage APIs:

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com
  7. 安装 Google Cloud CLI。
  8. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  9. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

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

  11. Enable the KRM、GKE API、Resource Manager 和 Service Usage APIs:

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com

创建 Config Controller 实例

  1. 在终端中,创建 Autopilot Config Controller 实例:

    gcloud anthos config controller create cc-example \
        --location=us-central1 \
        --full-management
    

    此操作最多可能需要 15 分钟才能完成。

    输出如下所示:

    Created instance [cc-example].
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for krmapihost-cc-example.
    
  2. 如需配置 kubectl 以与 Config Controller 端点通信,请获取所需的身份验证凭据和端点信息:

    gcloud anthos config controller get-credentials cc-example \
        --location us-central1
    
  3. 通过查看 Config Controller 实例列表来验证您的实例是否已创建:

    gcloud anthos config controller list --location=us-central1
    

    输出如下所示:

    NAME                 LOCATION                 STATE
    cc-example           us-central1              RUNNING
    

授予 Config Controller 所需的权限

在本部分中,您将向 Config Controller 授予管理 Google Cloud 资源的权限:

  1. 为您的服务账号电子邮件设置环境变量:

    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
        -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    
  2. 创建政策绑定:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/owner" \
        --project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

    输出类似于以下内容:

    Updated IAM policy for project [PROJECT_ID].
    auditConfigs:
    - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_READ
      - logType: DATA_WRITE
      service: gkehub.googleapis.com
    # Remainder of output omitted
    

使用 Config Controller 实例

以下部分介绍 Config Controller 实例的几种使用方式。

使用 Config Connector 创建 Google Cloud 资源

借助 Config Controller 实例,您可以利用 Config Connector 通过 Kubernetes 工具和 API 管理多项 Google Cloud 服务和资源。在本部分中,您将使用 Config Controller 创建 PubSubTopic 资源

要使用 Config Connector 创建 Pub/Sub 主题,请完成以下步骤:

  1. 使用 Config Connector 启用 Pub/Sub API:

    1. 使用首选文本编辑器创建名为 enable-pubsub.yaml 的文件,并将以下 YAML 复制到其中:

      # enable-pubsub.yaml
      apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
      kind: Service
      metadata:
        name: pubsub.googleapis.com
        namespace: config-control
      spec:
        projectRef:
          external: projects/PROJECT_ID
      

      PROJECT_ID 替换为您的项目 ID。

    2. 如需启用 Pub/Sub API,请将清单应用到集群:

      kubectl apply -f enable-pubsub.yaml
      

      启用此 API 可能需要几分钟时间。

  2. 使用 Config Connector 创建 Pub/Sub 主题:

    1. 创建名为 pubsub-topic.yaml 的文件并将以下 YAML 复制到其中:

      # pubsub-topic.yaml
      apiVersion: pubsub.cnrm.cloud.google.com/v1beta1
      kind: PubSubTopic
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        labels:
          label-one: "value-one"
        name: example-topic
        namespace: config-control
      
    2. 创建 Pub/Sub 主题:

      kubectl apply -f pubsub-topic.yaml
      
  3. 通过查看 Pub/Sub 主题列表,验证 Config Controller 是否已在 Google Cloud 中创建资源:

    gcloud pubsub topics list
    

    输出类似于以下内容:

    ---
    name: projects/PROJECT_ID/topics/start-instance-event
    ---
    labels:
      label-one: value-one
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/example-topic
    

使用 Policy Controller 强制执行政策

借助 Config Controller 实例,您可以使用 Policy Controller 和 Policy Controller 限制条件。在安装 Policy Controller 时,Policy Controller 会自动安装限制条件模板库。您可以使用此库中的模板对 Config Controller 实例强制执行各种常见的安全和合规控制措施。

在本部分中,您将使用 GCPStorageLocationConstraintV1 限制条件模板创建限制条件。您可以通过此模板限制可创建 Cloud Storage 存储分区的位置。使用此模板创建的限制条件会将位置限制为 us-central1。建议使用此限制条件来确保在最具性价比的区域创建存储桶。

如需创建限制条件,请执行以下操作:

  1. 创建名为 bucket-constraint.yaml 的文件并将以下 YAML 复制到其中:

    # bucket-constraint.yaml
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GCPStorageLocationConstraintV1
    metadata:
      name: storage-only-in-us-central1
    spec:
      match:
        kinds:
        - apiGroups:
          - storage.cnrm.cloud.google.com
          kinds:
          - StorageBucket
      parameters:
        locations:
        - us-central1
    
  2. 创建限制条件:

    kubectl apply -f bucket-constraint.yaml
    

    输出如下所示:

    gcpstoragelocationconstraintv1.constraints.gatekeeper.sh/storage-only-in-us-central1 created`
    
  3. 通过尝试使用 Config Connector 在 asia-southeast1 中创建 StorageBucket 资源,来演示限制条件是否有效:

    1. 创建名为 asia-storage-bucket.yaml 的文件并将以下 YAML 复制到其中:

      # asia-storage-bucket.yaml
      apiVersion: storage.cnrm.cloud.google.com/v1beta1
      kind: StorageBucket
      metadata:
        name: bucket-in-disallowed-location
        namespace: config-control
      spec:
        location: asia-southeast1
      
    2. 尝试创建 Cloud Storage 存储桶:

      kubectl apply -f asia-storage-bucket.yaml
      

      输出如下所示:

      Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [storage-only-in-us-central1] Cloud Storage bucket <bucket-in-disallowed-location> uses a disallowed location <asia-southeast1>, allowed locations are ["us-central1"]
      

使用 Config Sync 设置 GitOps

Config Sync 是一项 GitOps 服务,可让您将 Config Controller 实例同步到 Git 代码库、OCI 映像或 Helm 代码库中存储的配置、政策和 Google Cloud 资源。由于 Config Sync 持续将 Config Controller 的状态与来源中的配置进行协调,因此您可以帮助确保您的实例具有一致的配置。

在本部分中,您将 Config Controller 实例同步到公共 GitHub 代码库。此代码库包含另一个 PubSubTopic 资源。从此代码库同步实例后,系统会自动创建资源并将其应用于您的实例。如果您想使用 GitOps 工作流,可以选择使用 Config Sync 来创建资源(而不是直接应用资源)。

  1. 如需从 GitHub 同步,请设置 Cloud NAT。您需要设置 Cloud NAT,因为您的 Config Controller 实例由专用 Google Kubernetes Engine (GKE) 企业版集群提供支持,并且专用集群节点没有出站互联网访问权限:

    1. 创建 Cloud NAT 路由器。您需要使用此路由器来设置 NAT 网关。

      gcloud compute routers create cc-nat-router \
          --network default \
          --region us-central1
      

      输出类似于以下内容:

      Creating router [cc-nat-router]...done.
      NAME           REGION       NETWORK
      cc-nat-router  us-central1  default
      
    2. 在您在上一步中创建的路由器上设置 NAT 网关:

      gcloud compute routers nats create cc-nat-config \
          --router-region us-central1 \
          --router cc-nat-router \
          --nat-all-subnet-ip-ranges \
          --auto-allocate-nat-external-ips
      

      输出如下所示:

      Creating NAT [cc-nat-config] in router [cc-nat-router]...done.
      
  2. 如需将 Config Controller 实例配置为从示例代码库同步,请创建一个名为 cc-rootsync.yaml 的文件,并将以下 YAML 复制到其中:

    # cc-rootsync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
        branch: main
        dir: config-controller-quickstart
        auth: none
    
  3. 应用配置:

    kubectl apply -f cc-rootsync.yaml
    

    您的实例从代码库同步后,Config Sync 会创建 Pub/Sub 主题,并将其应用于您的 Config Controller 实例。

  4. 验证 Config Sync 是否正在将 Git 代码库同步到 Config Controller 实例:

    nomos status --contexts gke_PROJECT_ID_us-central1_krmapihost-cc-example
    

    输出类似于以下内容:

    *gke_PROJECT_ID_us-central1_krmapihost-cc-example
    --------------------
    <root>:root-sync                         https://github.com/GoogleCloudPlatform/anthos-config-management-samples/config-controller-quickstart@main
    SYNCED @ 2023-01-10 18:31:02 +0000 UTC   715b4295d3eac07b057cce2543275c1ee104cad8
    Managed resources:
       NAMESPACE        NAME                                                               STATUS   SOURCEHASH
       config-control   pubsubtopic.pubsub.cnrm.cloud.google.com/pubsub-topic-sample-sync  Current   715b429
       config-control   service.serviceusage.cnrm.cloud.google.com/pubsub.googleapis.com   Current   715b429
    

    如果您没有看到此输出,请等待几分钟,然后重试。

  5. 验证 Policy Controller 是否已创建资源:

    gcloud pubsub topics list
    

    输出类似于以下内容:

    name: projects/PROJECT_ID/topics/start-instance-event
    ---
    labels:
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/sample-topic
    ---
    labels:
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/pubsub-topic-sample-sync
    ---
    labels:
      label-one: value-one
      managed-by-cnrm: 'true'
    name: projects/PROJECT_ID/topics/example-topic
    

    在此输出中,您可以看到您在创建 Config Controller 实例部分中创建的 Pub/Sub,以及通过将实例同步到 GitHub 代码库而创建的 Pub/Sub。

清理

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

删除项目

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

逐个删除资源

  1. 删除 Config Connector PubSubTopic 资源:

    kubectl delete -f pubsub-topic.yaml
    
  2. 删除 Policy Controller 限制条件:

    kubectl delete -f bucket-constraint.yaml
    
  3. 删除 NAT 路由器:

    gcloud compute routers delete cc-nat-router \
        --project=PROJECT_ID \
        --region=us-central1
    

    在看到系统提示时按 y

  4. 删除由 Config Sync 创建的 Pub/Sub 资源:

    kubectl delete PubSubTopic pubsub-topic-sample-sync -n config-control
    
  5. 删除 RootSync 资源:

    kubectl delete rootsync root-sync -n config-management-system
    
  6. 使用您的首选文本编辑器删除您创建的所有 YAML 文件:

    • enable-pubsub.yaml
    • pubsub-topic.yaml
    • bucket-constraint.yaml
    • asia-storage-bucket.yaml
    • cc-rootsync.yaml
  7. 删除 Config Controller 实例:

    gcloud anthos config controller delete --location=us-central1 cc-example
    

    在看到系统提示时按 y

后续步骤