在裸机上构建私有云

您可以使用 Zenlayer 裸机在公有云上构建全球 VPC。

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

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

步骤 1 - 配置裸机实例

  1. 启动裸机实例 并配置 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 输出:

  3. 为了构建全球 VPC,计划是获得一个服务器作为私有云控制器,两个服务器作为虚拟机,因此下单订购了 3 个裸机实例并让它们运行:


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

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

  1. 单击 添加实例 以将实例附加到您的子网。

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

注意

  • 页面显示 pxe 0 ,因为 Zenlayer 在您下单时使用相同的接口进行 OS 安装,现在它们是您的内网接口。

  • 在此例中,VLAN ID 为 1047。所有 Zenlayer 裸机实例的交换机端口都设置为“访问端口”,因此这个 VLAN ID 在您请求支持时可能会被要求提供。


结果

在这种情况下,主机名和内网 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 每个实例以验证内网是否已启动并运行:

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

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

  • Test802Q-03 服务器 - 配备 MAAS 的控制器服务器(控制平面)

  • Test802Q-02 服务器 - KVM 服务器 2(数据平面)

  • Test802Q-01 服务器 - KVM 服务器 1(数据平面)

  1. 请参阅 MAAS | 如何安装 MAAS 在 Test802Q-03 实例上安装 MAAS。

  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)。

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

  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 密钥对。

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

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

  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

注意

  • Zenlayer 裸机云不提供对实例的 IPMI 直接访问,因此您无法使用 IPMI 接口调用来管理实例。

  • 所有 Zenlayer 裸机实例的 BIOS 默认设置都启用了 LAN 接口上的 PXE 启动。操作系统安装后,LAN 接口将被重新配置为实例的“私有接口”供用户使用。


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

您可以通过选中 注册为 MAAS 管理的 KVM 主机 来部署一个新的 KVM 服务器,用于 MAAS 管理的裸机实例。详细信息请参阅 添加 KVM 主机

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

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

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

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

  2. 配置桥接设置 brctl show 的输出显示,virbr0 是 KVM 默认创建的桥接,接口 virbr0-inc 已桥接到该桥接。

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

    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:

    以下 ip a 命令用于验证 IP 地址设置:

  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 地址,因此需要进行如下更改:

  4. 添加 MAAS 用户的 SSH 密钥 SSH 访问用于 MAAS 服务器管理。为了方便,可以通过将 maas 账户的公钥添加到 /root/.ssh/authorized_keys 文件中来授予 maas 服务器 root 访问权限。

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

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

  2. bash 命令是 MAAS 服务器与 KVM 虚拟化服务器通信的方式。确保此命令有效:

    sudo -H -u maas bash -c 'virsh -c qemu+ssh://[email protected]/system list --all'

    10.7.7.11 是 Test802Q-01 实例的内网 IP 地址,输出如下:

    Id   Name   State

    该输出与在虚拟化服务器上运行 virsh list --all 的结果完全相同,这意味着 MAAS 与虚拟化服务器(本例中为 KVM)之间的通信工作良好。\

  3. 注册虚拟化服务器 转到 KVM 标签页并注册 KVM 虚拟化服务器。

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

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

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

  2. 部署虚拟机 在组合阶段之后,虚拟机将关闭并准备好部署。然后,您可以通过选择操作系统并设置其他选项(例如 cloud-init)来部署服务器。

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

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

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

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

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

注意

  • MAAS 在 VM 的操作系统部署后仅启用 SSH 密钥登录。请在部署任何服务器之前上传您的 SSH 密钥。

  • 在此示例中,选择 Ubuntu 进行部署,默认用户为 “ubuntu”,而 10.7.7.6 是 VM 088 的 DHCP 分配的内网 IP 地址,该 VM 运行在名为“Test802Q-02”的虚拟机管理程序上。使用 MAAS 管理员的私钥对进行 SSH 登录测试:

ip r 命令显示默认路由已设置为 MAAS 服务器,后者充当公网 NAT 网关:

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


第 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 可能会使您的安全受到威胁。

Last updated