PXE 引导安装

0.2.0 开始,Harvester 可以自动安装。本文提供使用 pxe 引导进行自动安装的示例。

我们建议使用 iPXE 进行网络启动。iPXE 比传统 pxe 引导程序功能更多,而且与现代网卡更匹配。如果你的网卡不支持 iPXE 固件,你可以先从 TFTP 服务器加载 iPXE 固件镜像。

如果需要获得 iPXE 脚本示例,请参见 Harvester iPXE 示例

前提

PXE 引导安装 - 图1信息

节点至少需要有 8 GB 的内存,来让安装程序将整个 ISO 文件加载到 tmpfs。

准备 HTTP 服务器

需要 HTTP 服务器来提供引导文件。 假设 NGINX HTTP 服务器的 IP 是 10.100.0.10,它提供 /usr/share/nginx/html/ 目录,路径为 http://10.100.0.10/

准备引导文件

  • Harvester 发布页面下载所需文件:

    • ISO:harvester-<version>-amd64.iso
    • 内核:harvester-<version>-vmlinuz-amd64
    • initrd:harvester-<version>-initrd-amd64
    • rootfs squashfs 镜像:harvester-<version>-rootfs-amd64.squashfs
  • 提供文件。

    将下载的文件复制或移动到适当的位置,以便通过 HTTP 服务器下载它们。例如:

    1. sudo mkdir -p /usr/share/nginx/html/harvester/
    2. sudo cp /path/to/harvester-<version>-amd64.iso /usr/share/nginx/html/harvester/
    3. sudo cp /path/to/harvester-<version>-vmlinuz-amd64 /usr/share/nginx/html/harvester/
    4. sudo cp /path/to/harvester-<version>-initrd-amd64 /usr/share/nginx/html/harvester/
    5. sudo cp /path/to/harvester-<version>-rootfs-amd64.squashfs /usr/share/nginx/html/harvester/

准备 iPXE 引导脚本

使用以下两种模式执行自动安装:

  • CREATE:安装一个节点来构建一个初始的 Harvester 集群。
  • JOIN:安装一个节点来加入现有的 Harvester 集群。

CREATE 模式

PXE 引导安装 - 图2警告

安全风险:下面的配置文件包含应保密的凭证。请不要公开配置文件。

CREATE 模式创建一个名为 config-create.yamlHarvester 配置文件。按照需要修改值:

  1. # cat /usr/share/nginx/html/harvester/config-create.yaml
  2. token: token
  3. os:
  4. hostname: node1
  5. ssh_authorized_keys:
  6. - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDbeUa9A7Kee+hcCleIXYxuaPksn2m4PZTd4T7wPcse8KbsQfttGRax6vxQXoPO6ehddqOb2nV7tkW2mEhR50OE7W7ngDHbzK2OneAyONYF44bmMsapNAGvnsBKe9rNrev1iVBwOjtmyVLhnLrJIX+2+3T3yauxdu+pmBsnD5OIKUrBrN1sdwW0rA2rHDiSnzXHNQM3m02aY6mlagdQ/Ovh96h05QFCHYxBc6oE/mIeFRaNifa4GU/oELn3a6HfbETeBQz+XOEN+IrLpnZO9riGyzsZroB/Y3Ju+cJxH06U0B7xwJCRmWZjuvfFQUP7RIJD1gRGZzmf3h8+F+oidkO2i5rbT57NaYSqkdVvR6RidVLWEzURZIGbtHjSPCi4kqD05ua8r/7CC0PvxQb1O5ILEdyJr2ZmzhF6VjjgmyrmSmt/yRq8MQtGQxyKXZhJqlPYho4d5SrHi5iGT2PvgDQaWch0I3ndEicaaPDZJHWBxVsCVAe44Wtj9g3LzXkyu3k= [email protected]
  7. password: rancher
  8. ntp_servers:
  9. - 0.suse.pool.ntp.org
  10. - 1.suse.pool.ntp.org
  11. install:
  12. mode: create
  13. networks:
  14. harvester-mgmt: # (必须)管理绑定名称。
  15. interfaces:
  16. - name: ens5
  17. method: dhcp
  18. bond_options:
  19. mode: balance-tlb
  20. miimon: 100
  21. harvester-vlan: # (可选)VLAN 网络绑定名称。如果不同主机的 VLAN NIC 名称不同,
  22. interfaces: # 考虑创建一个绑定设备。然后用户可以选择
  23. - name: ens6 # harvester-vlan 作为 Harvester GUI 中的 VLAN NIC。
  24. method: none
  25. bond_options:
  26. mode: balance-tlb
  27. miimon: 100
  28. device: /dev/sda
  29. iso_url: http://10.100.0.10/harvester/harvester-<version>-amd64.iso
  30. vip: 10.100.0.99 # 访问 Harvester GUI 的 VIP。请确保 IP 可用。
  31. vip_mode: static # 或者 dhcp。详情请查看配置文件。

对于需要使用 CREATE 模式安装的节点,以下是使用上述配置启动内核的 iPXE 脚本:

  1. #!ipxe
  2. kernel harvester-<version>-vmlinuz ip=dhcp net.ifnames=1 rd.cos.disable rd.noverifyssl console=tty1 root=live:http://10.100.0.10/harvester/rootfs.squashfs harvester.install.automatic=true harvester.install.config_url=http://10.100.0.10/harvester/config-create.yaml
  3. initrd harvester-<version>-initrd
  4. boot

以上假设 iPXE 脚本存储在 /usr/share/nginx/html/harvester/ipxe-create 中。

PXE 引导安装 - 图3备注

如果你有多个网络接口,你可以利用 dracut 的 ip= 参数来指定启动界面以及 dracut 支持的其他网络配置(例如,ip=eth1:dhcp)。 有关详细信息,请参阅 man dracut.cmdline

使用 ip= 参数仅指定启动界面,因为我们仅支持一个 ip= 参数

JOIN 模式

PXE 引导安装 - 图4警告

安全风险:下面的配置文件包含应保密的凭证。请不要公开配置文件。

JOIN 模式创建一个名为 config-join.yamlHarvester 配置文件。按照需要修改值:

  1. # cat /usr/share/nginx/html/harvester/config-join.yaml
  2. server_url: https://10.100.0.99:443 # Should be the VIP set up in "CREATE" config
  3. token: token
  4. os:
  5. hostname: node2
  6. ssh_authorized_keys:
  7. - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDbeUa9A7Kee+hcCleIXYxuaPksn2m4PZTd4T7wPcse8KbsQfttGRax6vxQXoPO6ehddqOb2nV7tkW2mEhR50OE7W7ngDHbzK2OneAyONYF44bmMsapNAGvnsBKe9rNrev1iVBwOjtmyVLhnLrJIX+2+3T3yauxdu+pmBsnD5OIKUrBrN1sdwW0rA2rHDiSnzXHNQM3m02aY6mlagdQ/Ovh96h05QFCHYxBc6oE/mIeFRaNifa4GU/oELn3a6HfbETeBQz+XOEN+IrLpnZO9riGyzsZroB/Y3Ju+cJxH06U0B7xwJCRmWZjuvfFQUP7RIJD1gRGZzmf3h8+F+oidkO2i5rbT57NaYSqkdVvR6RidVLWEzURZIGbtHjSPCi4kqD05ua8r/7CC0PvxQb1O5ILEdyJr2ZmzhF6VjjgmyrmSmt/yRq8MQtGQxyKXZhJqlPYho4d5SrHi5iGT2PvgDQaWch0I3ndEicaaPDZJHWBxVsCVAe44Wtj9g3LzXkyu3k= [email protected]
  8. dns_nameservers:
  9. - 1.1.1.1
  10. - 8.8.8.8
  11. password: rancher
  12. install:
  13. mode: join
  14. networks:
  15. harvester-mgmt: # (必须)管理绑定名称。
  16. interfaces:
  17. - name: ens5
  18. method: dhcp
  19. bond_options:
  20. mode: balance-tlb
  21. miimon: 10
  22. harvester-vlan: # (可选)VLAN 网络绑定名称。如果不同主机的 VLAN NIC 名称不同,
  23. interfaces: # 考虑创建一个绑定设备。然后用户可以选择
  24. - name: ens6 # harvester-vlan 作为 Harvester GUI 中的 VLAN NIC。
  25. method: none
  26. bond_options:
  27. mode: balance-tlb
  28. miimon: 100
  29. device: /dev/sda
  30. iso_url: http://10.100.0.10/harvester/harvester-<version>-amd64.iso

注意 modejoin 并且需要提供 server_url

对于需要使用 JOIN 模式安装的节点,以下是使用上述配置启动内核的 iPXE 脚本:

  1. #!ipxe
  2. kernel harvester-<version>-vmlinuz ip=dhcp net.ifnames=1 rd.cos.disable rd.noverifyssl console=tty1 root=live:http://10.100.0.10/harvester/rootfs.squashfs harvester.install.automatic=true harvester.install.config_url=http://10.100.0.10/harvester/config-join.yaml
  3. initrd harvester-<version>-initrd
  4. boot

以上假设 iPXE 脚本存储在 /usr/share/nginx/html/harvester/ipxe-join 中。

DHCP 服务器配置

以下是如何配置 ISC DHCP 服务器以提供 iPXE 脚本的示例:

  1. option architecture-type code 93 = unsigned integer 16;
  2. subnet 10.100.0.0 netmask 255.255.255.0 {
  3. option routers 10.100.0.10;
  4. option domain-name-servers 192.168.2.1;
  5. range 10.100.0.100 10.100.0.253;
  6. }
  7. group {
  8. # 创建组
  9. if exists user-class and option user-class = "iPXE" {
  10. # ipxe 引导
  11. if option architecture-type = 00:07 {
  12. filename "http://10.100.0.10/harvester/ipxe-create-efi";
  13. } else {
  14. filename "http://10.100.0.10/harvester/ipxe-create";
  15. }
  16. } else {
  17. # pxe 引导
  18. if option architecture-type = 00:07 {
  19. # UEFI
  20. filename "ipxe.efi";
  21. } else {
  22. # Non-UEFI
  23. filename "undionly.kpxe";
  24. }
  25. }
  26. host node1 { hardware ethernet 52:54:00:6b:13:e2; }
  27. }
  28. group {
  29. # join group
  30. if exists user-class and option user-class = "iPXE" {
  31. # ipxe 引导
  32. if option architecture-type = 00:07 {
  33. filename "http://10.100.0.10/harvester/ipxe-join-efi";
  34. } else {
  35. filename "http://10.100.0.10/harvester/ipxe-join";
  36. }
  37. } else {
  38. # pxe 引导
  39. if option architecture-type = 00:07 {
  40. # UEFI
  41. filename "ipxe.efi";
  42. } else {
  43. # Non-UEFI
  44. filename "undionly.kpxe";
  45. }
  46. }
  47. host node2 { hardware ethernet 52:54:00:69:d5:92; }
  48. }

配置文件声明了一个子网和两个组。第一组用于主机使用 CREATE 模式引导,另一组用于 JOIN 模式。默认情况下会选择 iPXE 路径。但是,如果有 PXE 客户端,它会根据客户端架构提供 iPXE 镜像。请先准备这些镜像以及 TFTP 服务器。

Harvester 配置

有关 Harvester 配置的详情,请参见 Harvester 配置

用户也可以通过内核参数提供配置。例如,如果你需要指定 CREATE 安装模式,你可以在启动时传入 harvester.install.mode=create 内核参数。通过内核参数传入的值比在配置文件中指定的值具有更高的优先级。

UEFI HTTP 启动支持

UEFI 固件支持从 HTTP 服务器加载启动镜像。本节演示了如何使用 UEFI 的 HTTP 启动来加载 iPXE 程序并执行自动安装。

提供 iPXE 程序

http://boot.ipxe.org/ipxe.efi 下载 iPXE UEFI 程序,并确保 ipxe.efi 可以从 HTTP 服务器下载。例如:

  1. cd /usr/share/nginx/html/harvester/
  2. wget http://boot.ipxe.org/ipxe.efi

现在,你可以从 http://10.100.0.10/harvester/ipxe.efi 本地下载文件。

DHCP 服务器配置

如果用户计划通过先获得一个动态 IP 来使用 UEFI HTTP 启动功能,DHCP 服务器在看到这样的请求时需要提供 iPXE 程序的 URL。下面是一个更新的 ISC DHCP 服务器组的示例:

  1. group {
  2. # 创建组
  3. if exists user-class and option user-class = "iPXE" {
  4. # ipxe 引导
  5. if option architecture-type = 00:07 {
  6. filename "http://10.100.0.10/harvester/ipxe-create-efi";
  7. } else {
  8. filename "http://10.100.0.10/harvester/ipxe-create";
  9. }
  10. } elsif substring (option vendor-class-identifier, 0, 10) = "HTTPClient" {
  11. # UEFI HTTP 启动
  12. option vendor-class-identifier "HTTPClient";
  13. filename "http://10.100.0.10/harvester/ipxe.efi";
  14. } else {
  15. # pxe 引导
  16. if option architecture-type = 00:07 {
  17. # UEFI
  18. filename "ipxe.efi";
  19. } else {
  20. # Non-UEFI
  21. filename "undionly.kpxe";
  22. }
  23. }
  24. host node1 { hardware ethernet 52:54:00:6b:13:e2; }
  25. }

elsif substring 语句是新的,它在看到 UEFI HTTP 启动 DHCP 请求时提供 http://10.100.0.10/harvester/ipxe.efi。在客户端获取 iPXE 程序并运行后,iPXE 程序将再次发送 DHCP 请求,并从 URL http://10.100.0.10/harvester/ipxe-create-efi 加载 iPXE 脚本。

用于 UEFI 启动的 iPXE 脚本

在内核参数中指定 UEFI 启动的 initrd 镜像是必须的。以下示例是为 CREATE 模式更新的 iPXE 脚本:

  1. #!ipxe
  2. kernel harvester-<version>-vmlinuz initrd=harvester-<version>-initrd ip=dhcp net.ifnames=1 rd.cos.disable rd.noverifyssl console=tty1 root=live:http://10.100.0.10/harvester/rootfs.squashfs harvester.install.automatic=true harvester.install.config_url=http://10.100.0.10/harvester/config-create.yaml
  3. initrd harvester-<version>-initrd
  4. boot

initrd=harvester-<version>-initrd 参数是必须的。

实用的内核参数

除了 Harvester 配置之外,你还可以指定用于其他场景的内核参数。 另请参见 dracut.cmdline(7)

ip=dhcp

如果你有多个网络接口,你可以添加 ip=dhcp 参数,以便通过所有接口从 DHCP 服务器获取 IP。

rd.net.dhcp.retry=<cnt>

如果你未能从 DHCP 服务器获取 IP,iPXE 引导将会失败。你可以添加参数 rd.net.dhcp.retry=<cnt>,从而重试 DHCP 请求 <cnt> 次。