使用项目命名空间的声明式多租户

本教程介绍了如何将项目命名空间蓝图与 Config Controller 结合使用创建专用命名空间来管理特定项目中的 Google Cloud 资源。如果您是基础架构管理员,并希望内部租户以声明方式管理其项目配置,请按照说明操作。

配置控制器是一个托管式服务,用于预配和编排 Anthos 和 Google Cloud 资源。它提供一个 API 端点,可以作为 Anthos Config Management 的组件预配、启用和编排 Google Cloud 资源。

KRM 蓝图是一种封装常用资源的方法,同时编写可在整个组织中发布的最佳做法。

配置控制器项目命名空间
配置控制器项目命名空间

项目命名空间蓝图是一种 KRM 蓝图,其中包含您在 Config Controller 中预配命名空间所需的全部资源,您或租户可以在其中管理 Google Cloud 项目资源。您可以多次实例化蓝图,以设置多个项目命名空间。

通过项目命名空间蓝图,您可以轻松管理一个或多个项目命名空间,但如果您要查看使用 Google Cloud CLI 的手动步骤,请查看配置 Config Connector 以管理命名空间中的资源

目标

  • 在 Config Controller 中配置项目命名空间。
  • 使用 kpt live apply 应用配置。

费用

本教程使用 Google Cloud 的以下收费组件:

如需查看项目命名空间蓝图中包含的资源的完整列表,请参阅项目命名空间蓝图软件包的“资源”部分

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

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

要求

准备工作

  1. 在 Cloud Console 中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Cloud Console 的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 您可以从 Cloud Shell 运行本教程中的所有命令。

设置环境

在 Cloud Shell 中,运行以下命令:

  1. 安装 Kubernetes 的主要命令行界面 kubectl

    gcloud components install kubectl
    
  2. 安装 KRM 蓝图的主要命令行界面 kpt

    gcloud components install kpt
    
  3. 配置 kubectlkpt 以连接到配置控制器:

    gcloud alpha anthos config controller get-credentials INSTANCE_NAME \
        --location COMPUTE_REGION \
        --project ADMIN_PROJECT_ID
    

    替换以下内容:

    • INSTANCE_NAME:Config Controller 实例的名称。

    • COMPUTE_REGION:配置控制器实例的区域(例如 us-central1)。

    • ADMIN_PROJECT_ID:配置控制器实例的项目 ID。

  4. 启用 Resource Manager API:

    配置连接器使用 Resource Manager API 来管理其他服务 API 的启用操作。

    gcloud services enable cloudresourcemanager.googleapis.com \
        --project TENANT_PROJECT_ID
    

    TENANT_PROJECT_ID 替换为您的租户项目 ID。

  5. 安装 ResourceGroup CRD(如果尚未安装):

    kpt live install-resource-group
    
  6. 验证 config-control 命名空间中是否已配置配置连接器且运行状况良好:

    kubectl get ConfigConnectorContext -n config-control \
        -o "custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HEALTHY:.status.healthy"
    

    预期输出:

    NAMESPACE        NAME                                                HEALTHY
    config-control   configconnectorcontext.core.cnrm.cloud.google.com   true
    
  7. 向配置控制器授予租户项目中的 Google Cloud 资源的权限:

    export TENANT_PROJECT_ID=TENANT_PROJECT_ID
    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
        -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    gcloud projects add-iam-policy-binding "${TENANT_PROJECT_ID}" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/owner" \
        --project "${TENANT_PROJECT_ID}"
    

配置项目命名空间

要创建要在其中管理另一个项目的资源的项目命名空间,请运行以下命令。

  1. 使用所需工作目录中的 kpt 提取项目命名空间蓝图:

    kpt pkg get \
        https://github.com/GoogleCloudPlatform/blueprints.git/catalog/project/kcc-namespace@main \
        TENANT_PROJECT_ID
    

    TENANT_PROJECT_ID 替换为您的租户项目 ID。

    在此蓝图中,项目 ID 也会用作项目命名空间的名称。

  2. 进入软件包目录:

    cd ./TENANT_PROJECT_ID/
    
  3. 通过修改 setters.yaml 文件来配置软件包:

    cat > setters.yaml << EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: setters
      annotations:
        config.kubernetes.io/local-config: "true"
    data:
      project-id: TENANT_PROJECT_ID
      management-project-id: ADMIN_PROJECT_ID
      management-namespace: ADMIN_NAMESPACE
      projects-namespace: PROJECTS_NAMESPACE
      networking-namespace: NETWORKING_NAMESPACE
    EOF
    

    替换以下内容:

    • ADMIN_PROJECT_ID:包含 Config Controller 集群的项目的 ID。

      管理项目将用于引导 Config Connector 工作负载身份。

    • ADMIN_NAMESPACE:用于管理项目命名空间的命名空间(例如 config-control)。

      管理员命名空间将用于在管理项目中引导 Config Connector 工作负载身份。

    • PROJECTS_NAMESPACE:用于管理项目权限的命名空间(例如 config-control)。

      项目的命名空间将用于管理 IAM 政策等内容,以便有权访问租户命名空间的租户无法提升其权限。

      如果您使用着陆区蓝图,则应该已经拥有 projects 命名空间来管理项目。否则,请将其设置为 config-control

    • NETWORKING_NAMESPACE:用于管理共享 VPC 的命名空间(例如 config-control)。

      这样,您可以在选择使用哪个网络或子网时使用跨命名空间资源引用。

      如果您使用了着陆区蓝图,则应该已经拥有 networking 命名空间来管理共享 VPC。否则,请将其设置为 config-control

  4. 将 setter 值呈现为模板化资源:

    kpt fn render
    

    输出示例:

    Package "example-1234":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "cnrm-network-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name"
        [INFO] set field value to "config-control" in file "kcc-namespace-viewer.yaml" in field "metadata.namespace"
        [INFO] set field value to "cnrm-controller-manager-example-1234" in file "kcc-namespace-viewer.yaml" in field "subjects[0].name"
        [INFO] set field value to "cnrm-project-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name"
        ...(20 line(s) truncated, use '--truncate-output=false' to disable)
    
    Successfully executed 1 function(s) in 1 package(s).
    

配置租户权限

如需允许租户在其租户项目中预配 Google Cloud 项目资源,请授予他们使用以下命令使用租户项目命名空间的权限。

  1. 创建一个包含以下 RoleBinding 内容的 project-admin.yaml 文件:

    cat > project-admin.yaml << EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: project-admin
      namespace: TENANT_PROJECT_ID
    roleRef:
      kind: ClusterRole
      name: cnrm-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: User
      name: TENANT_EMAIL
      apiGroup: rbac.authorization.k8s.io
    EOF
    

    TENANT_EMAIL 替换为租户 Google Cloud 用户帐号的电子邮件地址(例如 janedoe@example.com)。

    cnrm-admin 角色将允许租户在项目命名空间中创建 Config Connector 资源。

    如需详细了解如何为群组或服务帐号授权,请参阅使用 RoleBinding 或 ClusterRoleBinding 分配角色

应用配置更改

上述步骤中的本地更改在应用之前不会影响云。

如需应用配置更改,请运行以下命令。

  1. 使用 kpt 初始化工作目录,此操作会创建一个资源来跟踪更改:

    kpt live init --namespace ADMIN_NAMESPACE
    

    ADMIN_NAMESPACE 替换为用于管理项目资源的命名空间(例如 config-control)。

  2. 预览将创建的资源:

    kpt live apply --dry-run
    

    所有资源都应显示“created (dry-run)”。

    输出示例:

    namespace/example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/project-admin created (dry-run)
    configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created (dry-run)
    iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created (dry-run)
    iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created (dry-run)
    iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created (dry-run)
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    0 resource(s) pruned, 0 skipped, 0 failed (dry-run)
    
  3. 使用 kpt 应用资源:

    kpt live apply
    

    所有资源都应显示“已创建”。

    输出示例:

    namespace/example-1234 created
    rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created
    rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created
    rolebinding.rbac.authorization.k8s.io/project-admin created
    configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created
    iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created
    iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created
    iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed
    0 resource(s) pruned, 0 skipped, 0 failed
    

验证成功时的行为

如需验证更改是否已应用并且其指定的资源是否已预配,请运行以下命令。

  1. 等待资源准备就绪:

    kpt live status --output table --poll-until current
    

    此命令将进行轮询,直到所有资源的状态为 Current 且条件为 Ready<None>(对于不支持 Ready 条件的资源)。如果 Ready=true,Ready 将为绿色;如果 Ready=false,则为红色。

    如果需要,请使用 ctrl-c 来中断操作。

    输出示例:

    NAMESPACE   RESOURCE                                  STATUS      CONDITIONS                                AGE     MESSAGE
                Namespace/example-1234                    Current     <None>                                    13s     Resource is current
    config-con  IAMPartialPolicy/example-1234-sa-workloa  Current     Ready                                     11s     Resource is Ready
    config-con  IAMPartialPolicy/kcc-example-1234-owners  Current     Ready                                     11s     Resource is Ready
    config-con  IAMServiceAccount/kcc-example-1234        Current     Ready                                     11s     Resource is Ready
    config-con  RoleBinding/cnrm-network-viewer-example-  Current     <None>                                    13s     Resource is current
    config-con  RoleBinding/cnrm-project-viewer-example-  Current     <None>                                    12s     Resource is current
    example-12  ConfigConnectorContext/configconnectorco  Current     <None>                                    12s     Resource is current
    example-12  RoleBinding/project-admin                 Current     <None>                                    12s     Resource is current
    
  2. 如果出现错误,使用默认事件输出来查看完整的错误消息:

    kpt live status
    

清理

如果您决定停止使用配置控制器,则应先清理使用配置控制器创建的所有资源,然后删除配置控制器本身。

  1. 使用 kpt 从工作目录中删除资源:

    kpt live destroy
    
  2. 等待所有资源删除完毕:

    until [ -z "$(kubectl get -R -f . --ignore-not-found | tee /dev/fd/2)" ]; \
    do sleep 1; done
    

    该命令将进行轮询,直到所有资源的状态为 Deleted

    如果需要,请使用 ctrl-c 来中断操作。

后续步骤