在裸机上构建私有云
您可以使用 Zenlayer 裸机在公有云上构建全球 VPC。
您将获得服务器的全部性能,并且可以完全访问硬件层,例如 BIOS/网络适配器驱动程序。
要在 Zenlayer 裸机实例上构建全球 VPC,我们将执行以下步骤:
步骤 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
- 广播地址
假设用户选择了 Ubuntu 20.04 作为操作系统,这里是控制台中的
ip a
输出:为了构建全球 VPC,计划是获得一个服务器作为私有云控制器,两个服务器作为虚拟机,因此下单订购了 3 个裸机实例并让它们运行:
步骤 2 - 创建全球 VPC 并附加实例
初始配置完成后,3 个实例均已启动并运行,具有互联网访问权限。由于这 3 个实例彼此仍然隔离,下一步是构建私有网络并将它们桥接在一起。Zenlayer 裸机云提供全球 VPC,即 VLAN/VxLAN,这可以帮助您实现此目标。

单击 添加实例 以将实例附加到您的子网。
您可以在实例详情页面获取全球 VPC 的 MAC 地址,这可能在未来的 DHCP IP 与 MAC 绑定设置中使用。
结果
在这种情况下,主机名和内网 IP 地址分配如下所示:
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(数据平面)

请参阅 MAAS | 如何安装 MAAS 在 Test802Q-03 实例上安装 MAAS。
通过
https://[$server IP]:5240/MAAS/r/dashboard
访问实例。出于安全原因,应阻止 MAAS GUI 端口的互联网访问,并通过 SSH 隧道端口转发,以便允许通过 URL http://127.0.0.1:5240/MAAS/r/dashboard 访问 GUI。启用 DHCP 服务 转到 子网 标签页,并在 LAN 接口(本例中为
fabric-0
)上启用 DHCP 服务。选中 MAAS 提供 DHCP 并根据需要设置 IP 范围(本例中为10.7.7.x/24
)。返回 控制器 标签页,确认 DHCP 服务已启动并运行。
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 公钥。
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
提示
您可以启动一个带有 PXE 安装的实例,并使其侦听私有 VLAN,这将成为您的控制器。然后订购其他没有操作系统的实例,将其私有接口连接到您的 PXE 连接的虚拟私有云/VLAN,触发重启后,由于私有接口默认设置为第一启动选项,这些实例将启动 PXE 引导。这可以视为您自己的“裸机级别的 PXE 操作系统安装”。
步骤 4 - 配置虚拟机管理程序服务器
您可以通过选中 注册为 MAAS 管理的 KVM 主机 来部署一个新的 KVM 服务器,用于 MAAS 管理的裸机实例。详细信息请参阅 添加 KVM 主机。
在这种情况下,操作系统已通过 Zenlayer 控制台安装,并且这是一个概念验证类型的构建,因此需要解释手动方式。
使用命令行安装 qemu-kvm:
sudo apt install bridge-utils qemu-kvm libvirt-bin
这是原始的
ip a
输出: lo/lan0/wan0 分别对应裸机服务器的回环/内网 IP/公网 IP 接口。配置桥接设置
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 地址设置:编辑 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 地址,因此需要进行如下更改:
添加 MAAS 用户的 SSH 密钥 SSH 访问用于 MAAS 服务器管理。为了方便,可以通过将 maas 账户的公钥添加到
/root/.ssh/authorized_keys
文件中来授予 maas 服务器 root 访问权限。
提示
如果希望对不同用户的权限进行严格限制,您可以将 maas 公钥添加到相应的 libvirt KVM 管理账户中。
步骤 5 - 在 MAAS 中注册虚拟化服务器
在将 maas 用户的公钥添加到虚拟化服务器的 root 身份验证后,可以运行 SSH 测试以确保其有效:
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)之间的通信工作良好。\注册虚拟化服务器 转到 KVM 标签页并注册 KVM 虚拟化服务器。
在这种情况下,virsh 地址为
qemu+ssh://[email protected]/system
。MAAS 将使用 maas 账户登录虚拟化服务器,而不是将其映射到虚拟化服务器上的 root 账户,这是通过将公钥添加到/root/.ssh/authorized_keys
文件中实现的。 注册完成后,您可以从 采取行动 下拉菜单中选择 刷新 来获取 virsh 虚拟机 ID 或虚拟化服务器的状态。
步骤 6 - 创建和部署虚拟机
组合虚拟机 在这种情况下,10.7.7.11 和 12 服务器都已添加到 MAAS 中,您可以点击其中一台服务器并从 采取行动 下拉菜单中选择 组合 来生成您的第一台虚拟机:
部署虚拟机 在组合阶段之后,虚拟机将关闭并准备好部署。然后,您可以通过选择操作系统并设置其他选项(例如 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 是虚拟机管理程序中的接口名称:

第 7 步 - 已知问题
以下是修正后的译文:
一个主要的担忧是,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
在通过 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'/>
另一种情况是,默认的 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>
最后一个问题是提醒——请记住将 VNC 监听设置为
127.0.0.1
而不是0.0.0.0
。由于每个 Zenlayer 裸机实例默认都分配了一个互联网 IP,将 VNC 监听设置为互联网 IP 可能会使您的安全受到威胁。
最后更新于