# 在裸机上构建私有云

您将获得服务器的全部性能，并且可以完全访问硬件层，例如 BIOS/网络适配器驱动程序。

要在 Zenlayer 裸机实例上构建全球 VPC，我们将执行以下步骤：

## **步骤 1 - 配置裸机实例**

1. [**启动裸机实例**](https://docs.console.zenlayer.com/welcome/cn/bare-metal/get-started/create-a-bare-metal-instance) 并配置 IP 地址。\
   \
   初始配置完成后，您的实例将被分配一个 /30 的互联网 IP 地址，并且这是它的运作方式。

   例如，CIDR 地址块 `128.14.148.248/30` 包含 4 个 IP 地址，其中 2 个可供主机使用。服务器将占用一个，而网络交换机将占用另一个作为网关 IP：

   * `128.14.148.248` - 网络标识符（不用于服务器）
   * `128.14.148.249` - 网关
   * `128.14.148.250` - 服务器的互联网 IP 地址
   * `128.14.148.251` - 广播地址
2. 假设用户选择了 Ubuntu 20.04 作为操作系统，这里是控制台中的 `ip a` 输出：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-3e8eb7a465bcd144367b890247ee671044982a31%2FArticle_1%20(12).jpg?alt=media" alt=""><figcaption><p><br></p></figcaption></figure>
3. 为了构建全球 VPC，计划是获得一个服务器作为私有云控制器，两个服务器作为虚拟机，因此下单订购了 3 个裸机实例并让它们运行：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-376310207f1838ac0fdf2612ad4971c3515e5a2b%2FArticle_2%20(4).jpg?alt=media" alt=""><figcaption></figcaption></figure>

***

## **步骤 2 - 创建全球 VPC 并附加实例**

初始配置完成后，3 个实例均已启动并运行，具有互联网访问权限。由于这 3 个实例彼此仍然隔离，下一步是构建私有网络并将它们桥接在一起。Zenlayer 裸机云提供全球 VPC，即 VLAN/VxLAN，这可以帮助您实现此目标。

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-7cf437ac688e0c2bd1a69aa595f0fc05b15ee393%2FArticle_3.jpg?alt=media" alt=""><figcaption></figcaption></figure>

1. [**创建全球 VPC 和子网**](https://docs.console.zenlayer.com/welcome/cn/bare-metal/get-started/create-a-virtual-private-cloud)。
2. 单击 **添加实例** 以将实例附加到您的子网。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-cf6525c2bc8915a4a631f37d66af0c026f2709c8%2FArticle_4.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   您可以在实例详情页面获取全球 VPC 的 MAC 地址，这可能在未来的 DHCP IP 与 MAC 绑定设置中使用。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-980bc345d8d9647ef27270bff818d5fd6124ef5c%2FArticle_5%20(1).jpg?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:blue;">**注意**</mark>

* <mark style="color:blue;">页面显示</mark> <mark style="color:blue;">`pxe 0`</mark> <mark style="color:blue;">，因为 Zenlayer 在您下单时使用相同的接口进行 OS 安装，现在它们是您的内网接口。</mark>
* <mark style="color:blue;">在此例中，VLAN ID 为 1047。所有 Zenlayer 裸机实例的交换机端口都设置为“访问端口”，因此这个 VLAN ID 在您请求支持时可能会被要求提供。</mark>
  {% endhint %}

***

### **结果**

在这种情况下，主机名和内网 IP 地址分配如下所示：

|     主机名     |    内网 IP    |    内网接口 MAC 地址    |
| :---------: | :---------: | :---------------: |
| Test802Q-01 | `10.7.7.11` | 0c:c4:7a:e2:df:42 |
| Test802Q-02 | `10.7.7.12` | 0c:c4:7a:e2:db:1a |
| Test802Q-03 | `10.7.7.13` | 0c:c4:7a:e2:e1:a2 |

分配了内网 IP 地址后，您可以 ping 每个实例以验证内网是否已启动并运行：

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-004a393c6dbb4b54221336298e9ac7d7f1e8da56%2FArticle_6.jpg?alt=media" alt=""><figcaption></figcaption></figure>

## **步骤 3 - 配置控制器服务器**

要构建自己的私有云，控制器服务器是实现虚拟机（VM）配置/部署/销毁自动化的关键模块。有许多选项，从商业软件到开源软件，在本例中，将以 MAAS 为例构建基于 KVM 的私有云。私有云拓扑如下：

* Test802Q-03 服务器 - 配备 MAAS 的控制器服务器（控制平面）
* Test802Q-02 服务器 - KVM 服务器 2（数据平面）
* Test802Q-01 服务器 - KVM 服务器 1（数据平面）

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-5742504246f5325c027f0db56314bbc9e54faaad%2FArticle_7.jpg?alt=media" alt=""><figcaption></figcaption></figure>

1. 请参阅 [**MAAS | 如何安装 MAAS**](https://maas.io/docs/how-to-install-maas) 在 Test802Q-03 实例上安装 MAAS。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-f508d54de2bd41f2271ee7b1f18091ebc68ea843%2FArticle_8.jpg?alt=media" alt=""><figcaption></figcaption></figure>
2. 通过 `https://[$server IP]:5240/MAAS/r/dashboard` 访问实例。出于安全原因，应阻止 MAAS GUI 端口的互联网访问，并通过 SSH 隧道端口转发，以便允许通过 URL <http://127.0.0.1:5240/MAAS/r/dashboard> 访问 GUI。
3. 启用 DHCP 服务 转到 **子网** 标签页，并在 LAN 接口（本例中为 `fabric-0`）上启用 DHCP 服务。选中 **MAAS 提供 DHCP** 并根据需要设置 IP 范围（本例中为 `10.7.7.x/24`）。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-d13678c7bbbdfd0d83bbfb5d046efdb210b82b98%2FArticle_9.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   返回 **控制器** 标签页，确认 DHCP 服务已启动并运行。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-bf18eb0c48f801b8ce473595d8d0ab82512255c6%2FArticle_10.jpg?alt=media" alt=""><figcaption></figcaption></figure>
4. MAAS 用户配置和上传 SSH 公钥 完成 MAAS 设置后，创建了一个名为“`maas`”的用户：

   ```
   root@Test802Q-03:~# cat /etc/passwd | grep maas
   ```

   \
   输出应类似：“`#: maas:x:117:124::/var/lib/maas:/usr/sbin/nologin`”，显示默认情况下 maas 账户没有登录 shell。为了管理 KVM/虚拟化服务器，需要为该账户启用 bash/shell，并创建用于登录 KVM/虚拟化服务器的 SSH 密钥：

   ```
   $: sudo chsh -s /bin/bash maas
   $: sudo su - maas
   $: ssh-keygen -f ~/.ssh/id_rsa -N ''// Some code
   ```

   \
   这将启用 bash 并在 maas 账户的主目录下 .ssh 子文件夹中生成 RSA 密钥对。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-94e0aa45367896dc3f9e1efa882e72635f323e7f%2FArticle_11.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   我们将把 id\_rsa.pub 的内容复制到 KVM 服务器上，以便 maas 账户可以通过密钥认证登录到 KVM/虚拟化服务器。

   MAAS 在部署服务器时将要求你上传另一个公钥，因为 MAAS 部署的机器没有默认的用户名/密码组合，唯一访问 MAAS 部署的机器的方式是通过 SSH 公钥。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-22a225e5a62e5834e3e80ae149fd54c39236af0e%2FArticle_12.jpg?alt=media" alt=""><figcaption></figcaption></figure>
5. NAT 配置 对于类似 cloud-init 的设置，maas libvirt 网络上的 VM 必须能够访问更广泛的网络。应满足以下任一条件：

   * VM 连接的网桥必须包括主机的一个物理网络接口，该接口位于适当的网络上；
   * 必须启用 NAT。

   \
   在本例中，用户使用 NAT 方法，并将网关设置为 10.7.7.13，这是 MAAS 服务器的 IP 地址。以下命令供参考：

   ```
   vim /etc/sysctl.conf
   net.ipv4.ip_forward = 1
   sysctl -p
   ```

   \
   上述设置将启用主机的 IP 转发，然后你可以创建 NAT 规则。命令行选项因 firewall-cmd 到 iptables 而异，以下是使用 firewall-cmd 的示例：

   ```
   # 使用 firewall-cmd 进行 NAT，定义 zone
   firewall-cmd --permanent --zone=external --change-interface=wan0
   firewall-cmd --permanent --zone=internal --change-interface=lan0
   # 设置 NAT 隐藏
   firewall-cmd --zone=external --add-masquerade --permanent
   # NAT 规则
   firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o em1 -j MASQUERADE -s 10.7.7.0/24
   firewall-cmd --reload
   ```

   或者，一条简单的 iptables 规则也可以完成相同的工作：

   ```
   iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
   ```

{% hint style="info" %} <mark style="color:blue;">**注意**</mark>

* <mark style="color:blue;">Zenlayer 裸机云不提供对实例的 IPMI 直接访问，因此您无法使用 IPMI 接口调用来管理实例。</mark>
* <mark style="color:blue;">所有 Zenlayer 裸机实例的 BIOS 默认设置都启用了 LAN 接口上的 PXE 启动。操作系统安装后，LAN 接口将被重新配置为实例的“私有接口”供用户使用。</mark>
  {% endhint %}

{% hint style="success" %} <mark style="color:green;">**提示**</mark>

<mark style="color:green;">您可以启动一个带有 PXE 安装的实例，并使其侦听私有 VLAN，这将成为您的控制器。然后订购其他没有操作系统的实例，将其私有接口连接到您的 PXE 连接的虚拟私有云/VLAN，触发重启后，由于私有接口默认设置为第一启动选项，这些实例将启动 PXE 引导。这可以视为您自己的“裸机级别的 PXE 操作系统安装”。</mark>
{% endhint %}

***

## **步骤 4 - 配置虚拟机管理程序服务器**

您可以通过选中 **注册为 MAAS 管理的 KVM 主机** 来部署一个新的 KVM 服务器，用于 MAAS 管理的裸机实例。详细信息请参阅 [**添加 KVM 主机**](https://github.com/CanonicalLtd/maas-docs/blob/master/en/manage-kvm-add-host.md)。

在这种情况下，操作系统已通过 Zenlayer 控制台安装，并且这是一个概念验证类型的构建，因此需要解释手动方式。

1. 使用命令行安装 qemu-kvm：

   ```
   sudo apt install bridge-utils qemu-kvm libvirt-bin
   ```

   \
   这是原始的 `ip a` 输出：\
   lo/lan0/wan0 分别对应裸机服务器的回环/内网 IP/公网 IP 接口。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-5cecf3c6d01c032aa63f6c7680a4f40d404e87d7%2FArticle_13.jpg?alt=media" alt=""><figcaption></figcaption></figure>
2. 配置桥接设置\
   `brctl show` 的输出显示，virbr0 是 KVM 默认创建的桥接，接口 `virbr0-inc` 已桥接到该桥接。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-e5f84c2dca952e8e15c06ec429fde86932078bff%2FArticle_14.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   假设用户希望将虚拟机的接口桥接到主机（虚拟机管理程序）的内网 IP 接口，这样虚拟机就可以通过 MAAS 服务器的 DHCP 获得 IP 地址（`10.7.7.x/24` 子网）。还需要更改 KVM 默认网络设置，以确保任何新虚拟机都将使用此桥接：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-9b131b9d08e5802a9a3e95fb9505c74bb2c80387%2FArticle_15.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   ```
   brctl addif  virbr0 lan0
   ip addr delete 10.7.7.11/24 dev lan0
   ip addr add 10.7.7.11/24 dev virbr0
   ```

   \
   这将从 lan0 移除原始 IP 地址，将其添加到 virbr0。运行 brctl 确认 lan0 已添加到 virbr0：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-c1abd23a63c1d3d17903351989ab5638d8125cf2%2FArticle_16.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   以下 `ip a` 命令用于验证 IP 地址设置：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-0325a2743a69506d66e150991c2261048c2a13df%2FArticle_17.jpg?alt=media" alt=""><figcaption></figcaption></figure>
3. 编辑 libvirt 默认网络配置\
   MAAS 首先检查是否存在名为 maas 的 libvirt 网络。maas 网络应禁用 DHCP，转而使用 MAAS 启用的 DHCP，以便您的虚拟机能够进行网络启动。如果 MAAS 找不到 maas 网络，它将回退到 libvirt 的默认网络。\
   \
   重要的是要使虚拟机网络能够与 MAAS 通信，这可以通过创建 maas libvirt 网络配置文件或修改 **裸机** 默认网络配置文件来实现。假设用户选择修改默认配置文件：

   ```
   virsh net-edit default
   ```

   \
   原始设置中，KVM 为子网 192.168.x.x 启用了 DHCP。由于虚拟机将通过 virbr0 桥接以获取 MAAS DHCP 分配的 IP 地址，因此需要进行如下更改：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-cc5ea996b98b12e681718676a3322e6bd5ab5ecd%2FArticle_18.jpg?alt=media" alt=""><figcaption></figcaption></figure>
4. 添加 MAAS 用户的 SSH 密钥\
   SSH 访问用于 MAAS 服务器管理。为了方便，可以通过将 maas 账户的公钥添加到 `/root/.ssh/authorized_keys` 文件中来授予 maas 服务器 root 访问权限。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-59a3879147d081cd6b9e68bae0b6db28273fbc37%2FArticle_19.jpg?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="success" %} <mark style="color:green;">**提示**</mark>

<mark style="color:green;">如果希望对不同用户的权限进行严格限制，您可以将 maas 公钥添加到相应的 libvirt KVM 管理账户中。</mark>
{% endhint %}

## **步骤 5 - 在 MAAS 中注册虚拟化服务器**

1. 在将 maas 用户的公钥添加到虚拟化服务器的 root 身份验证后，可以运行 SSH 测试以确保其有效：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-b9f5c384aff37d9f36626dcb31467f0584d1b295%2FArticle_20.jpg?alt=media" alt=""><figcaption></figcaption></figure>
2. bash 命令是 MAAS 服务器与 KVM 虚拟化服务器通信的方式。确保此命令有效：

   ```
   sudo -H -u maas bash -c 'virsh -c qemu+ssh://root@10.7.7.11/system list --all'
   ```

   \
   `10.7.7.11` 是 Test802Q-01 实例的内网 IP 地址，输出如下：

   ```
   Id   Name   State
   ```

   \
   该输出与在虚拟化服务器上运行 `virsh list --all` 的结果完全相同，这意味着 MAAS 与虚拟化服务器（本例中为 KVM）之间的通信工作良好。\\
3. 注册虚拟化服务器\
   转到 **KVM** 标签页并注册 KVM 虚拟化服务器。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-dc213b25cfd9c30c5460661199811679114d7cf8%2FArticle_21.jpg?alt=media" alt=""><figcaption></figcaption></figure>

   \
   在这种情况下，virsh 地址为 `qemu+ssh://root@10.7.7.11/system`。MAAS 将使用 maas 账户登录虚拟化服务器，而不是将其映射到虚拟化服务器上的 root 账户，这是通过将公钥添加到 `/root/.ssh/authorized_keys` 文件中实现的。\
   \
   注册完成后，您可以从 **采取行动** 下拉菜单中选择 **刷新** 来获取 virsh 虚拟机 ID 或虚拟化服务器的状态。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-1d5b5610526ba9a92943f3481a43d93d7b9ef661%2FArticle_22.jpg?alt=media" alt=""><figcaption></figcaption></figure>

## **步骤 6 - 创建和部署虚拟机**

1. 组合虚拟机\
   在这种情况下，10.7.7.11 和 12 服务器都已添加到 MAAS 中，您可以点击其中一台服务器并从 **采取行动** 下拉菜单中选择 **组合** 来生成您的第一台虚拟机：

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-42884bbd813c035f9f869af85313af410039a9a8%2FArticle_23.jpg?alt=media" alt=""><figcaption></figcaption></figure>
2. 部署虚拟机\
   在组合阶段之后，虚拟机将关闭并准备好部署。然后，您可以通过选择操作系统并设置其他选项（例如 cloud-init）来部署服务器。

   <figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-63bd91387c42821502db4fd1a33ae4c3d200401f%2FArticle_24.jpg?alt=media" alt=""><figcaption></figcaption></figure>

\
您已在 MAAS 服务器上设置 NAT 规则，并通过 DHCP 将 VM 网络桥接到 `10.7.7.x`。通过检查 cloud-init 选项，即使您的 cloud-init 元数据服务器位于 Zenlayer 网络之外，VM 也可以在初始设置后获取初始化设置。

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-0e56e3d7fc0f464add9de490df6c4605c661a595%2FArticle_25.jpg?alt=media" alt=""><figcaption></figcaption></figure>

\
\
在配置和部署过程中，您还可以启用 VM 的 VNC 访问，屏幕输出将类似于大多数 PXE 引导：

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-8a5612b2bad875b594b4414e89ee729c5da1b914%2FArticle_26.jpg?alt=media" alt=""><figcaption></figcaption></figure>

\
这是所有已部署 VM 的最终视图：

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-c70bd93f4f29e8ce7acd5baf3341abe27e89fd5b%2FArticle_27.jpg?alt=media" alt=""><figcaption></figcaption></figure>

\
每个 VM 都分配了 DHCP IP 地址。如果您执行 `brctl show` 命令检查网络设置，会看到所有新创建的 vnet0\~2 虚拟网卡都已桥接到 virbr0：

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-69ec85d33d07339c10139253bdb24cae46d31a6d%2FArticle_28.jpg?alt=media" alt=""><figcaption></figcaption></figure>

3\. 登录 VM 并验证设置\ 现在您的虚拟私有云已启动并运行，ens3 是 VM 中的网卡名称，而 vnet0\~2 是虚拟机管理程序中的接口名称：

<figure><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-5742504246f5325c027f0db56314bbc9e54faaad%2FArticle_7.jpg?alt=media" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:blue;">**注意**</mark>

* <mark style="color:blue;">MAAS 在 VM 的操作系统部署后仅启用 SSH 密钥登录。请在部署任何服务器之前上传您的 SSH 密钥。</mark>
* <mark style="color:blue;">在此示例中，选择 Ubuntu 进行部署，默认用户为 “ubuntu”，而</mark> <mark style="color:blue;">`10.7.7.6`</mark> <mark style="color:blue;">是 VM 088 的 DHCP 分配的内网 IP 地址，该 VM 运行在名为“Test802Q-02”的虚拟机管理程序上。使用 MAAS 管理员的私钥对进行 SSH 登录测试：</mark>

<img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-650cc6d9f2be75fedebdf202e1fb78f4d80d7528%2FArticle_30.jpg?alt=media" alt="" data-size="original">

<mark style="color:blue;">`ip r`</mark> <mark style="color:blue;">命令显示默认路由已设置为 MAAS 服务器，后者充当公网 NAT 网关：</mark>

<img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-44e314794648f8e4453ae731d6104c01e289205f%2F31.png?alt=media" alt="" data-size="original"><img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-d3efe5aee3849238429603c7d4384f5284825c9f%2F32.png?alt=media" alt="" data-size="original">

\* <mark style="color:blue;">另一个最佳实践是将 VM 的默认网关重新路由到您的虚拟机管理程序。由于 Zenlayer 裸机实例默认分配了一个互联网 IP 地址，您可以利用虚拟机管理程序的公网网络为所有 VM 提供互联网访问。</mark> \* <mark style="color:blue;">假设 VM 088 运行在名为“Test802Q-02”的虚拟机管理程序上，您可以在 Zenlayer 控制台中查看其互联网连接方案和状态。它显示了一个有效的 IPv4 地址，带宽为 10 Mbps 的固定带宽计费方案。由于虚拟机管理程序的 LAN 接口“lan0”通过“virbr0”桥接到 VM 的接口，您可以在 Test802Q-02 主机上创建另一个 NAT 规则，使其作为所有运行在其上的 VM 的网关，这样流量将在不同的 Zenlayer 裸机实例之间平衡，而不是仅通过 MAAS NAT 网关。</mark>

<img src="https://2318250923-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0CBWy7DFFtkhyEC9R4kE%2Fuploads%2Fgit-blob-d75ae2d9828d7f9804c2e89bb19e60cd190382c3%2F33.png?alt=media" alt="" data-size="original">
{% endhint %}

***

## **第 7 步 - 已知问题**

以下是修正后的译文：

1. 一个主要的担忧是，Zenlayer 裸机实例默认设置为 PXE 启动，并且由于 Zenlayer 平台限制，无法更改此设置。如果您重新加载裸机实例，它将被 MAAS PXE 捕获以进行注册或配置。\
   \
   由于这是一个概念验证类型的测试，而且您使用 MAAS 时其 PXE 服务默认启用，因此另一种选择是禁用 MAAS 的 PXE 服务，仅在进行 VM 预配时启用，或者您可以在 DHCP 服务器上配置一个阻止列表，以忽略裸机实例的 DHCP 请求，MAAS DHCP 设置供您参考：

   ```
   class "black-hole" {
   match substring (hardware, 1, 6);
   # deny booting;
   ignore booting;
   }
   subclass "black-hole" 00:12:ba:1d:c1:b5;
   subclass "black-hole" 00:12:df:b6:7b:e1;
   #If you comment out the "ignore booting" and uncomment the "deny booting", it will send an DHCPNAK (IIRC) to the client instead.
   ```

   同样，使用 MAC 地址阻止列表的单行 ebtables 命令也有效：

   ```
   ebtables -A INPUT -s 00:11:ba:1d:c1:b5 -j DROP
   ```
2. 在通过 MAAS 配置 VM 时，您可能会遇到一些问题，特别是当 VM 接口未分配到正确的桥接网络时。正确的桥接应该包含裸机实例的 lan0，通常 VM 创建会调用默认配置文件并在该桥接上创建 vnet0/2/3…。解决方案是修改 VM 配置文件并更改网络接口部分：

   ```
   <interface type='bridge'>
     <mac address='52:54:00:a2:ac:18'/>
     <source bridge='virbr0'/>
     <model type='virtio'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   ```
3. 另一种情况是，默认的 MAAS 组合 VM 使用 spice 作为图形选项，但有时无法通过 `virsh console [VM name]` 访问 VM 控制台，可能是系统缺少某些库。解决方案是切换到 VNC。

   ```
   <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'>
     <listen type='address' address='127.0.0.1'/>
   </graphics>
   <video>
     <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
   </video>
   ```
4. 最后一个问题是提醒——请记住将 VNC 监听设置为 `127.0.0.1` 而不是 `0.0.0.0`。由于每个 Zenlayer 裸机实例默认都分配了一个互联网 IP，将 VNC 监听设置为互联网 IP 可能会使您的安全受到威胁。


---

# Agent Instructions: 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:

```
GET https://docs.console.zenlayer.com/welcome/cn/bare-metal/best-practice/build-your-private-cloud-over-bare-metal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
