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

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

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

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

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

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

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

目标

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

费用

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

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

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

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

要求

准备工作

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

    激活 Cloud Shell

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

  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
    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 来中断操作。

后续步骤