多租户功能提供了一种在单个 NSX 部署上跨租户隔离安全和网络配置的方法。为了支持多租户功能,NSX 4.0.1.1 引入了组织和项目。

NSX 策略数据模型采用分层结构,并具有两个系统创建的分支:

  • /infra,由基础架构管理员管理。
  • /orgs/default,用于保存多租户结构。
注:NSX 部署设置多租户是可选操作,其实施情况对现有 NSX 配置没有任何影响。

下图说明了多租户的数据模型。

数据模型

组织

NSX 部署具有一个默认组织。您无法创建、修改或删除该组织。组织对象由系统在启动时创建。组织可以访问系统中的所有 Tier-0 网关和 Edge 集群。

组织对象由系统使用以下标识符创建:

/orgs/default

项目

在组织下,您可以为要从 NSX 环境中管理的每个租户创建一个项目。项目在 /orgs/default 下创建,以支持每个租户具有一组独立的配置:

  • 项目在特定的隔离上下文中提供策略层次结构模型。项目配置在 /orgs/default/projects/<project-id>/infra 下进行设置。
  • 无法在项目下创建 Tier-0 网关和 Edge 集群。企业管理员可以与组织共享 /infra 空间中的 Tier-0 网关和 Edge 集群,然后可将其提供给组织下的项目使用。
  • 项目有权访问已从 /infra 空间共享的某些对象和配置。
  • 您可以从 infra 空间创建规则以应用于项目中虚拟机。要从 infra 空间创建这些规则,请利用项目默认组,或者创建具有动态成员资格或虚拟机静态成员资格的组。
  • 除了从 infra 空间创建规则之外,不支持从 infra 空间配置其他项目资源。例如,您无法使用项目中虚拟机/项目默认组以外的静态成员在组织下创建组。不支持从基础架构空间配置属于项目的 Tier-1 网关。必须从项目中配置项目资源。

您可以进行以下 API 调用以在组织下创建项目:

PATCH /policy/api/v1/orgs/default/projects/<project-id>

创建项目时,请指定项目将使用的 Tier-0 网关和 Edge 集群。可将此 Tier-0 网关用于该项目中的所有配置。分配给项目的 Edge 集群必须属于默认传输区域。此传输区域是创建项目网络的位置。

示例请求:

URL:

PATCH https:/{{nsx-manager-ip}}/policy/api/v1/orgs/default/projects/Project-Dev

正文:

{
    "site_infos": [
        {
            "edge_cluster_paths": [
                "/infra/sites/default/enforcement-points/default/edge-clusters/ca1b2a4f-057d-42da-b3b8-cf218b1c1a51"
            ],
            "site_path": "/infra/sites/default"
        }
    ],
    "tier_0s": [
        "/infra/tier-0s/Tier0GatewayTest"
    ]
}

创建项目时,会创建一些默认对象,例如默认域、安全策略和默认组。您可以根据自己的要求选择创建多个项目。

创建项目后,您可以进行 API 调用以完成 DHCP、Tier-1 网关和分段等的网络配置。

注: 要使项目管理员能够将分段或 Tier-1 网关连接到 Tier-0 网关或 Tier-0 VRF,请为具有项目管理员角色的用户分配其他自定义角色。您分配的自定义角色必须对系统 Tier-0 网关具有读取访问权限。这样,项目管理员才能查看系统中的所有 Tier-0 网关。有关创建自定义角色的详细信息,请参见 创建或管理自定义角色

创建自定义角色时,选择网络,并将所有权限重置为 None。在设置权限对话框中,选择网络 > 连接,然后将 Tier-0 网关权限设置为只读。

资源配额

您可以使用限制定义项目中资源的配额。通过配额,您可以对给定项目的特定资源定义最大限制。如果未定义任何限制,则应用系统默认限制。

进行以下 API 调用以定义项目的限制:
PATCH /policy/api/v1/infra/constraints/<contraint-id>
示例请求:
URL:
PATCH https://{{nsx-manager-ip}}/policy/api/v1/infra/constraints/c-1
正文:
{
    "display_name": "TestConstraint",
    "constraint_expression": {
        "resource_type": "EntityInstanceCountConstraintExpression",
        "count": 10,
        "operator": "<="
    },
    "target": {
        "path_prefix": "/orgs/default/projects/project-1",
        "target_resource_type": "Group"
    }
}