# 在裸机上构建私有云

您将获得服务器的全部性能，并且可以完全访问硬件层，例如 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 可能会使您的安全受到威胁。
