> For the complete documentation index, see [llms.txt](https://docs.verge.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verge.io/learn-the-platform/zh/mo-kuai-10-chang-jing-shi-yan/lab-multi-tenancy.md).

# 实验：多租户 / MSP 部署

## 目标

在 VergeOS 上构建一个多租户托管服务提供商（MSP）环境。你将使用租户向导和租户配方来创建租户，配置资源配额，设置租户网络（包括二层直通），验证租户之间的隔离，并查看主机级审计日志和使用报告。

## 前置条件

* 已完成所有前置模块（1–9）
* 可访问一个正在运行的 VergeOS 环境，且至少有 2 个节点
* 对主机 VergeOS 系统具有管理员级访问权限
* 至少有 2 个可用的外部 IP 地址（虚拟 IP）供租户 UI 访问
* 至少有 32 GB RAM 和 8 个核心可供租户分配
* 熟悉 VergeOS 网络概念（内部网络、外部网络、VLAN）

## 难度

**中级** — 需要理解 VergeOS 的租户管理、网络和资源管理

## 预计时间

**1.5 小时**

***

## 背景：VergeOS 多租户架构

开始实验前，请先了解 VergeOS 如何实现多租户：

```mermaid
graph TB
    子图 "主机 VergeOS 系统"
        Host["主机仪表板<br/>系统管理"]
        ExtNet["外部网络<br/>虚拟 IP"]
        vSAN["vSAN 存储池<br/>共享物理磁盘"]
    end
    子图 "租户 A（VDC）"
        TA_UI["租户 A UI<br/>唯一 URL"]
        TA_Net["租户 A 网络<br/>完全封装"]
        TA_Store["租户 A 存储<br/>隔离卷"]
        TA_VMs["租户 A 虚拟机"]
    end
    子图 "租户 B（VDC）"
        TB_UI["租户 B UI<br/>唯一 URL"]
        TB_Net["租户 B 网络<br/>完全封装"]
        TB_Store["租户 B 存储<br/>隔离卷"]
        TB_VMs["租户 B 虚拟机"]
    end
    Host --> TA_UI
    Host --> TB_UI
    ExtNet --> TA_UI
    ExtNet --> TB_UI
    vSAN --> TA_Store
    vSAN --> TB_Store
    TA_Net -.- |"无跨租户流量"| TB_Net
```

**关键原则：**

* 每个 **租户** 是一个完整的虚拟数据中心（VDC），拥有自己的 UI、网络、存储和用户管理
* **隔离性** 通过完整的网络封装和独占存储卷来强制实现——而不是基于 VLAN 的分段
* **嵌套多租户** 允许租户基于其分配到的资源创建子租户
* **资源跟踪** 提供按租户划分的使用统计信息，包括用于计费和容量规划的重复数据删除指标
* **租户配方** 自动部署标准化的租户配置，以实现快速接入

***

## 步骤

### 第 1 部分：通过向导创建租户

使用内置的租户向导手动创建你的第一个租户。

1. **导航到租户：**
   * 从主机 VergeOS UI 中，点击 **租户** 在顶部菜单中
   * 单击 **+ 新建租户**
   * 在左上角，选择 **来自向导** 并点击 **下一步**
2. **配置租户设置：**
   * **名称：** 输入 `MSP-Tenant-A`
   * **管理员用户密码：** 设置一个强密码（至少 8 个字符）——请记录下来以便后续使用
   * **要求更改密码：** 实验中保持未勾选
   * **描述：** 输入 `通过向导创建的实验租户`
   * **显示系统快照：** 保持勾选（允许租户浏览主机快照）
   * **主题访问：** 选择 `不能创建新主题，只读访问所有主机主题`
   * 单击 **提交** 以继续进行节点配置
3. **配置租户节点：**
   * **核心：** 选择 `4` 核心
   * **RAM：** 选择 `8192 MB` （8 GB）
   * **集群：** 保持为 `--默认--`
   * **断电时：** 选择 `上次状态`
   * 单击 **提交** 以继续进行存储配置
4. **配置租户存储：**
   * **层级：** 选择你的主存储层级（通常为第 1 层）
   * **已配置：** 输入 `100 GB`
   * 单击 **提交** 以继续进行 UI 管理
5. **分配外部 IP：**
   * 从 **分配外部 IP** 下拉框中选择一个可用的虚拟 IP
   * 如果没有可用的虚拟 IP，点击 **创建新的外部 IP**:
     * **网络：** 选择您的外部网络
     * **类型：** 虚拟 IP
     * **IP 地址：** 输入一个可用 IP，或留空以自动分配
     * **所有者：** 选择 `MSP-Tenant-A`
   * 单击 **提交** 以完成
6. **应用网络规则并开机：**
   * 在租户仪表板上，点击橙色的 **需要应用规则** 消息以应用防火墙规则
   * 单击 **开机** 从左侧菜单启动租户
   * 等待租户启动——仪表板应显示正在运行的状态
7. **验证租户访问：**
   * 单击 **连接到 UI** 从租户仪表板左侧菜单中
   * 使用 `admin` 以及你配置的密码登录
   * 验证该租户拥有自己独立的仪表板、网络和存储视图

### 第 2 部分：通过配方创建租户

使用租户配方进行自动化、标准化部署。

1. **探索可用的租户配方：**
   * 从主机 UI 中，导航到 **仓库** > **租户模板**
   * 浏览可用的目录——注意配方及其说明
   * 如果不存在租户配方，你将从 MSP-Tenant-A 创建一个
2. **创建租户配方（如有需要）：**
   * 首先， **关闭电源** MSP-Tenant-A（必须停止后才能作为配方基础）
   * 导航至 **仓库** > **租户模板** 并点击 **新建**
   * 配置配方：
     * **名称：** `MSP-Standard-Tenant`
     * **描述：** `标准 MSP 租户，包含 4 核、8 GB RAM、100 GB 存储`
     * **目录：** 选择或创建一个目录（例如， `MSP Templates`)
     * **租户：** 选择 `MSP-Tenant-A`
   * 单击 **提交**
3. **审查并自定义配方问题：**
   * 在租户配方仪表板上，点击 **问题**
   * 查看自动生成的系统问题——注意以下部分：
     * **租户部分：** 名称、URL、管理员凭据、主题访问
     * **节点部分：** 核心数量、RAM 分配
     * **网络部分：** 外部 IP 地址
   * 启用你希望公开的任何已禁用问题（例如， `YB_USER_EMAIL`)
   * 单击 **发布** 以使该配方可用
4. **通过配方部署一个租户：**
   * 导航至 **租户** > **+ 新建租户**
   * 选择 **MSP Templates** 左侧的目录
   * 选择 `MSP-Standard-Tenant` 配方，然后点击 **下一步**
   * 填写配方问题：
     * **名称：** `MSP-Tenant-B`
     * **管理员密码：** 设置一个密码
     * **节点 1 核心：** `4`
     * **节点 1 RAM：** `8192`
     * 分配一个外部 IP 地址
   * 单击 **提交** 以创建租户
   * 启动 MSP-Tenant-B，并验证其成功启动
5. **比较这两种创建方式：**

   | 方面       | 向导          | 配方             |
   | -------- | ----------- | -------------- |
   | 速率       | 5–10 分钟手动配置 | 使用预填默认值 1–2 分钟 |
   | 一致性      | 取决于操作员的准确性  | 保证相同的基础配置      |
   | 自定义      | 在创建时具有完全灵活性 | 通过配方问题加以控制     |
   | 最适合      | 一次性或独特租户    | 标准化、可重复的部署     |
   | 包含虚拟机/网络 | 仅基础租户基础设施   | 可包含预配置的虚拟机、网络  |

### 第 3 部分：配置资源配额

练习从主机管理租户资源分配。

1. **查看当前资源分配：**
   * 从主机仪表板中，导航到 **租户**
   * 点击 **MSP-Tenant-A** 以打开其仪表板
   * 注意已分配的资源：核心、RAM 和已配置的存储
   * 向下滚动到 **存储** 部分并观察层级分配
2. **修改租户资源：**
   * 在选中 MSP-Tenant-A 的情况下，点击 **节点** 在左侧菜单中
   * 双击租户节点，然后点击 **编辑**
   * 增加 **核心数** 更改为 `6` 以及 **RAM** 更改为 `12288 MB` （12 GB）
   * 单击 **提交**
   * 注意：租户节点的核心和 RAM 支持热插拔——更改会立即生效，无需重启租户或其工作负载。提交时，系统会验证所请求的资源在主机/集群上是否可用。
3. **向租户添加存储：**
   * 从 MSP-Tenant-A 仪表板中，点击 **添加存储** 在左侧菜单中
   * 如果有第二个层级可用，则配置 `50 GB` 在不同层级上
   * 否则，编辑现有层级并将已配置数量增加到 `150 GB`
   * 注意：VergeOS 中的存储配额是 **软限制** — 系统会在租户接近其已配置阈值时记录警报，但不会在精确边界处硬性阻止写入
   * 验证存储更改已反映在租户仪表板中
4. **了解资源边界：**
   * 注意，主机系统允许资源超分配——你可以分配给租户的核心和 RAM 多于物理可用量
   * 但是，所有已配置资源在以下情况下必须具有物理可用性： **启动** 一个租户节点
   * 记录分配给两个租户的总资源与主机总可用资源的对比

### 第 4 部分：设置租户网络

配置高级网络，包括二层直通。

1. **查看默认租户网络：**
   * 登录 MSP-Tenant-A 的 UI
   * 导航至 **网络** ——观察自动创建的网络：
     * 一个 **内部网络** 用于租户工作负载
     * 一个 **外部网络** 提供与主机的连接
   * 注意租户的网络栈是完全封装且独立的
2. **配置二层网络直通：**
   * 返回到 **host** VergeOS UI
   * 导航至 **租户** > 选择 `MSP-Tenant-A` > **二层网络** > **新建**
   * 配置二层直通：
     * **物理网络：** 选择包含要直通的 VLAN 的物理网络
     * **VLAN ID：** 输入要传递给租户的 VLAN 标签
     * **启用：** 设置为 `是`
   * 单击 **提交**
   * VergeOS 会自动创建相应的 **外部** 以及 **物理** 网络到租户内部
3. **验证租户内部的二层连接：**
   * 登录 MSP-Tenant-A 的 UI
   * 导航至 **网络** ——确认新的外部网络和物理网络已自动创建
   * 在租户内创建一台测试虚拟机，并将其网卡连接到直通网络
   * 验证该虚拟机可以从 VLAN 获取 IP 地址（如果有 DHCP 可用），或配置静态 IP 并测试连通性
4. **记录网络架构：**

   | 网络类型         | 用途                  | 由谁管理    |
   | ------------ | ------------------- | ------- |
   | 内部网络         | 租户工作负载通信（完全封装）      | 租户      |
   | 租户外部网络       | 租户到主机的连接            | 租户      |
   | 主机外部 / 虚拟 IP | 与外部世界的连接            | 主机      |
   | 二层直通         | 来自物理基础设施的直接 VLAN 访问 | 主机 + 自动 |

### 第 5 部分：验证租户隔离

确认租户彼此之间确实是隔离的。

1. **测试网络隔离：**
   * 登录 **MSP-Tenant-A** 并创建一个简单的虚拟机（例如，一个轻量级 Linux 虚拟机）
   * 为其分配一个内部 IP 地址（例如， `10.0.0.10/24`)
   * 登录 **MSP-Tenant-B** 并创建一个类似的虚拟机
   * 为其分配 **相同的** 内部 IP 地址（`10.0.0.10/24`)
   * 验证两台虚拟机都能正常启动且不会冲突——因为每个租户都有完全封装的网络，因此允许相同的 IP 地址
   * 从租户 A 的虚拟机中，尝试 ping 租户 B 的外部 IP——默认应被阻止（不存在跨租户路由）
2. **验证存储隔离：**
   * 从主机仪表板中，查看每个租户的存储分配
   * 确认每个租户都有自己专用的存储卷
   * 验证 Tenant A 无法看到或访问 Tenant B 的存储
   * 登录到每个租户，并验证存储仪表板只显示其自身已配置的容量
3. **测试管理隔离：**
   * 以管理员身份登录 MSP-Tenant-A——验证你在任何菜单中都看不到 MSP-Tenant-B
   * 以管理员身份登录 MSP-Tenant-B——验证你看不到 MSP-Tenant-A
   * 从 **host**，验证你可以查看和管理这两个租户
   * 记录三层隔离模型：
     * **网络：** 完整的二层/三层封装——没有共享广播域
     * **存储：** 每个租户独占存储卷
     * **管理：** 每个租户拥有独立的用户管理和 UI
4. **测试配额强制执行：**
   * 在 MSP-Tenant-A 中，尝试创建一个超出已配置资源的虚拟机（例如，请求超过分配量的 RAM）
   * 观察 VergeOS 如何强制执行资源边界——如果资源不足，虚拟机应无法启动
   * 记录错误信息和行为

### 第 6 部分：查看审计日志和使用报告

使用主机级监控来跟踪租户活动。

1. **查看主机审计日志：**
   * 从主机仪表板中，导航到 **系统** > **日志**
   * 筛选与租户相关的事件——查找：
     * 租户创建事件
     * 租户开机/关机事件
     * 资源修改事件
   * 注意记录的时间戳、用户和操作
   * 验证在租户内执行的管理操作（例如，创建虚拟机）在主机级别可见
2. **生成租户使用报告：**
   * 导航至 **租户** 并选择一个租户
   * 单击 **使用报告** （或导航到报告部分）
   * 查看可用指标：
     * CPU 使用率随时间变化
     * RAM 消耗
     * 存储利用率和重复数据删除统计
     * 网络吞吐量
   * 比较 MSP-Tenant-A 和 MSP-Tenant-B 的使用情况
   * 思考这些报告如何支持真实 MSP 环境中的计费
3. **从主机监控租户健康状况：**
   * 从主机仪表板中，查看租户状态指示器
   * 检查每个租户的节点健康、存储健康和网络状态
   * 导航至 **租户** > **监控** 查看汇总租户健康状况
   * 记录哪些指标对 MSP 运营最重要

***

## 清理

实验结束后：

1. 关闭每个租户内的所有虚拟机
2. 关闭这两个租户（MSP-Tenant-A 和 MSP-Tenant-B）
3. 从主机中移除二层网络直通
4. 从主机中删除这两个租户（租户 > 选择租户 > 删除）
5. 如果创建了租户配方，则将其删除（仓库 > 租户配方 > 删除）
6. 释放分配给这些租户的任何虚拟 IP
7. 在外部网络上应用规则以清理防火墙条目

***

## 验证

当你能够回答以下问题时，你的多租户 / MSP 实验就完成了 **是** 时，你的 VMware 迁移实验就完成了：

* [ ] 已成功使用租户向导创建了一个租户（MSP-Tenant-A）
* [ ] 已成功使用租户配方创建或部署了一个租户（MSP-Tenant-B）
* [ ] 已为租户配置并修改了资源配额（核心、RAM、存储）
* [ ] 已为租户设置二层网络直通并验证连通性
* [ ] 已验证网络隔离——不同租户中的相同 IP 可以并存而不冲突
* [ ] 已验证存储隔离——租户无法访问彼此的存储卷
* [ ] 已验证管理隔离——租户无法看到彼此的资源
* [ ] 已测试资源配额强制执行——当超过分配时，虚拟机无法启动
* [ ] 已查看与租户相关事件的主机审计日志
* [ ] 已生成并查看用于计费指标的租户使用报告
* [ ] 已清理所有实验资源（租户、配方、虚拟 IP、二层网络）


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verge.io/learn-the-platform/zh/mo-kuai-10-chang-jing-shi-yan/lab-multi-tenancy.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
