为多租户集群创建政策

本教程介绍如何使用 Config Sync 和 Kustomize多租户集群中的命名空间配置政策。

在 Kubernetes 中,租户可以是团队也可为工作负载。对于多租户集群,最佳做法是为每个租户创建一个命名空间。然后,每个命名空间都可以拥有适合其不同需求的政策。您可以使用 Config Sync 以一致的方式将这些政策应用于每个不同的租户。

代码库架构

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

├── configsync
│   ├── tenant-a
│   │   ├── ~g_v1_namespace_default.yaml
│   │   ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│   │   ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│   │   └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
│   ├── tenant-b
│   │   ├── ~g_v1_namespace_default.yaml
│   │   ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│   │   ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│   │   └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
│   └── tenant-c
│       ├── ~g_v1_namespace_default.yaml
│       ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│       ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│       └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
├── configsync-src
│   ├── base
│   │   ├── kustomization.yaml
│   │   ├── namespace.yaml
│   │   ├── networkpolicy.yaml
│   │   ├── rolebinding.yaml
│   │   └── role.yaml
│   ├── tenant-a
│   │   └── kustomization.yaml
│   ├── tenant-b
│   │   └── kustomization.yaml
│   └── tenant-c
│       └── kustomization.yaml
├── README.md
└── scripts
    └── render.sh

此代码库是一个非结构化代码库。这使您可以灵活地以所需的方式整理配置,这在使用 Kustomize 时特别有用。

此代码库中有三个命名空间适用于三个不同的租户:tenant-atenant-btenant-c。每个命名空间目录都包含 Roles、RoleBinding 和 NetworkPolicies 的配置。configsync- src 目录包含 kustomize 格式的配置。目录 configsync-src 包含 kustomize 格式的配置。包括一个基础和三个叠加层 tenant-atenant-btenant-c

目标

  • 更新 Kustomize 叠加层。

  • 创建一个可与 Config Sync 结合使用的集群。

  • 将 Git 代码库中的政策同步到集群。

  • 验证集群是否正在同步到代码库中的配置。

费用

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

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

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

准备工作

在开始学习本教程之前,请完成以下任务:

  1. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

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

  3. 创建或有权访问 GitHub 帐号。
  4. 运行以下命令来安装 Kustomize:

    gcloud components install kustomize
    

对 Git 和 Kustomize 有一定的了解也很有帮助

更新 Kustomize 文件

在下面的部分中,您将更新代码库中的 Kustomize 文件,以更新应用于 tenant-a 的政策。

准备环境

要准备环境,请完成以下步骤:

  1. 创建代码库分支:

    1. 转到 GitHub 中的 Anthos Config Management 示例目录代码库。
    2. 点击创建分支 (Fork)。
  2. 克隆分支代码库:

    git clone https://github.com/GITHUB_USERNAME/anthos-config-management-samples
    

    GITHUB_USERNAME 替换为您的 GitHub 用户名。

  3. 转到包含本教程中使用示例的目录:

    cd anthos-config-management-samples/namespace-specific-policy
    

更新叠加层

在本部分中,您将更新重叠层。叠加层是一个 kustomization,依赖于另一个 kustomization。

以下步骤展示了如何通过更新其叠加层向 tenant-a 授予新角色 acm-samples/namespace-specific-policy/configsync-src/tenant-a。由于您只更新一个配置,因此只需要更新一个叠加层。

如需为 tenant-a 授予此新角色,请完成以下步骤:

  1. 通过导航到 GitHub 中的以下页面创建新文件:

    github.com/GITHUB_USERNAME/anthos-config-management-samples/new/main/namespace-specific-policy/configsync-src/tenant-a
    
  2. 将文件命名为 another-role.yaml

  3. 修改新文件 (Edit new file) 窗口中,粘贴新角色的以下 YAML 清单:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
  4. 点击提交新文件 (Commit new file)。

    现在,您可以将新角色的配置添加到 kustomization.yaml 文件中。

  5. /namespace-specific-policy/configsync-src/tenant-a 文件夹中,打开 kustomization.yaml,然后点击修改图标(铅笔图案)。

  6. kustomization.yaml 的资源部分下,添加 - another-role.yaml

    namespace: tenant-a
    
    resources:
    - ../base
    - another-role.yaml
    # The rest of the file is omitted
    
  7. 点击提交更改

  8. 更新后,运行 render.sh 脚本以为每个命名空间重新构建 Kustomize 输出:

    ./scripts/render.sh
    
  9. 提交并推送更新:

    git add .
    git commit -m 'update configuration'
    git push
    

创建和注册 GKE 集群

在本部分中,您将创建并配置一个可与 Config Sync 结合使用的集群。

创建集群

控制台

如需使用 Google Cloud Console 创建集群,请执行以下任务:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine

  2. 点击 创建

  3. 标准部分中,点击配置

  4. 集群基本信息部分,完成以下操作:

    1. 输入 mt-cluster 作为集群的名称
    2. 可用区下拉列表中选择 us-central1-c
    3. 将其他所有字段保留为建议的默认值。
  5. 在左侧菜单中,点击 default-pool,然后在显示的下拉列表中,点击节点

  6. 节点部分中,完成以下操作:

    1. 机器类型下拉列表中,选择 e2-standard-4
    2. 将其他所有字段保留为默认值。
  7. 在左侧菜单中,选择安全

  8. 安全部分中,选中启用 Workload Identity 复选框。

  9. 点击创建。创建集群可能需要几分钟时间。

gcloud

如需使用 gcloud 命令行工具创建集群,请执行以下任务:

gcloud container clusters create mt-cluster \
    --project PROJECT_ID \
    --zone us-central1-c \
    --release-channel regular \
    --machine-type "e2-standard-4" \
    --workload-pool=PROJECT_ID.svc.id.goog

PROJECT_ID 替换为您的项目 ID。

获取用于集群的身份验证凭据

创建集群后,您需要获取身份验证凭据才能与该集群交互:

gcloud container clusters get-credentials mt-cluster --zone us-central1-c

为您自己授予管理员权限

创建集群后,为您自己授予 Config Sync 所需的 GKE Hub Admin 角色。

控制台

如需通过 Google Cloud Console 为自己授予管理员权限,请执行以下任务:

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM 页面

  2. 点击添加

  3. 新成员字段中,输入电子邮件地址。您可以将个人、服务帐号或 Google 群组添加为成员。

  4. 选择角色下拉列表中,搜索并选择 GKE Hub Admin

  5. 点击保存

gcloud

如需使用 gcloud 命令行工具为自己授予管理员权限,请执行以下任务:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=roles/gkehub.admin

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • MEMBER:成员的标识符,通常格式如下:member-type:id。例如,user:my-user@example.com。如需查看 member 可以采用的值的完整列表,请参阅政策绑定参考文档

注册集群

创建集群后,您可以将集群注册到舰队。

控制台

如要通过 Google Cloud Console 注册您的集群,请执行以下任务:

  1. 在 Google Cloud Console 中,转到 Anthos 集群页面。

    转到“Anthos 集群”页面

  2. 点击注册现有集群

  3. 点击 mt-cluster 旁边的注册。如果列表中未显示此集群,请确保已创建。

    输出示例:

    Cluster mt-cluster registered successfully as mt-cluster in project PROJECT_NAME.
    

gcloud

如需使用 gcloud 命令行工具注册集群,请执行以下任务:

gcloud beta container hub memberships register MEMBERSHIP_NAME \
 --gke-cluster=us-central1-c/mt-cluster \
 --enable-workload-identity

请替换以下内容:

  • MEMBERSHIP_NAME:您选择用来唯一表示要注册到队列的集群的成员资格名称。

配置 Config Sync

在本部分中,您将配置 Config Sync 以同步到 namespace-specific-policy/ 目录中的政策。

如需配置 Config Sync,请完成以下步骤:

控制台

如需使用 Google Cloud Console 配置 Config Sync,请执行以下任务:

  1. 在 Cloud Console 中,转到 Anthos Config Management 页面。

    转到 Anthos Config Management

  2. 选择 mt-cluster,然后点击配置

  3. 针对 ACM 的 Git 代码库身份验证部分中,选择,然后点击继续

  4. 集群的 ACM 设置部分,完成以下操作:

    1. 版本字段中,选择 1.7 或更高版本。
    2. 选中启用 Config Sync 复选框并填写以下字段:
      1. 网址字段中,添加 https://github.com/GITHUB_USERNAME/anthos-config-management-samples
      2. 分支字段中,添加 main
      3. 标记/提交字段中,添加 HEAD
      4. 政策目录字段中,添加 namespace-specific-policy/configsync
      5. 同步等待字段留空。
      6. Git 代理字段留空。
      7. 源格式下拉列表中,选择非结构化
  5. 点击完成。您将返回到 Anthos Config Management 页面。几分钟后,您应该会在配置的集群旁边的状态列中看到 Synced

gcloud

如需使用 gcloud 命令行工具配置 Config Sync,请执行以下任务:

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

    # apply-spec.yaml
    
    applySpecVersion: 1
    spec:
      configSync:
        # Set to true to install and enable Config Sync
        enabled: true
        sourceFormat: unstructured
        syncRepo: https://github.com/GITHUB_USERNAME/anthos-config-management-samples
        syncBranch: main
        secretType: none
        policyDir: namespace-specific-policy/configsync
    

    GITHUB_USERNAME 替换为您的 GitHub 用户名。

  2. 应用 apply-spec.yaml 文件:

     gcloud beta container hub config-management apply \
         --membership=MEMBERSHIP_NAME \
         --config=CONFIG_YAML_PATH \
         --project=PROJECT_ID
    

    请替换以下内容:

    • MEMBERSHIP_NAME:您在注册集群时选择的成员名称,您可以通过 gcloud container hub memberships list 找到该名称。
    • CONFIG_YAML_PATHapply-spec.yaml 文件的路径
    • PROJECT_ID:您的项目 ID}

验证是否已同步特定于命名空间的政策

现在您已安装了 Config Sync,接下来可以使用 nomos status 命令验证特定于命名空间的政策是否已同步到您的集群:

nomos status

您应该会看到类似于以下示例的输出:

gke_PROJECT_ID_us-central1-c_mt-cluster
  --------------------
  <root>   https:/github.com/GITHUB_USERNAME/anthos-config-management-samples/namespace-specific-policy/configsync@main
  SYNCED   bf8655aa
  Managed resources:
     NAMESPACE   NAME                                                             STATUS
                 namespace/foo                                                    Current
                 namespace/istio-system                                           Current
                 namespace/tenant-a                                               Current
                 namespace/tenant-b                                               Current
                 namespace/tenant-c                                               Current
     tenant-a    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-a    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-a    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current
     tenant-b    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-b    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-b    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current
     tenant-c    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-c    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-c    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current

接下来,确认集群中已存在这些资源。以下示例展示了如何检查 tenant-a 的一些资源。

  1. 验证 tenant-a 的 RoleBinding 是否存在:

    kubectl get RoleBinding/tenant-admin-rolebinding -n tenant-a
    

    输出示例:

    NAME                       ROLE                AGE
    tenant-admin-rolebinding   Role/tenant-admin   23h
    
  2. 验证 tenant-a 的 Role 是否存在:

    kubectl get Role/tenant-admin -n tenant-a
    

    输出示例:

    NAME           CREATED AT
    tenant-admin   2021-05-24T21:49:06Z
    
  3. 验证 tenant-a 的 NetworkPolicy 是否存在:

    kubectl get NetworkPolicy/deny-all -n tenant-a
    

    输出示例:

    NAME       POD-SELECTOR   AGE
    deny-all   <none>         23h
    

通过使用这些命令,您可以看到每个命名空间都有自己的一组政策,并遵循多租户集群最佳做法。

清除数据

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

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

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

删除目录

如要为它们清理租户命名空间和政策,我们建议您从 Git 存储库中删除包含其配置的目录:

rm -r acm-samples/namespace-specific-policy/configsync/tenant-*/*
git add .
git commit -m 'clean up'
git push

同步从根代码库的最后一次提交后,系统会从集群中删除 tenant-atenant-btenant-c 这三个命名空间。

后续步骤