构建终极家庭实验室NUC集群实战指南 - 第一部分

本文详细介绍了使用Intel NUC设备构建Proxmox虚拟化集群的全过程,包括硬件选型、Thunderbolt网络配置、Proxmox安装与优化,以及Docker环境部署和Portainer等工具的使用方法。

(重新)构建终极家庭实验室NUC集群 - 第一部分

概述

我之前写过很多关于构建易受攻击环境来实验攻击路径、学习工具和技术工作原理以及如何修复它们的文章。我也讨论过过去构建的不同攻击和工具;然而,我最长时间是在单台机器上运行实验室。最近,我投入时间使用Proxmox创建了一个NUC集群;这个多部分的博客系列将探讨连接主机、安装Proxmox以及设置各种选项和工具的不同阶段。这没有什么突破性的,但如果你决定自己动手做,它可能会给你一些见解。它也被称为重建,因为初始构建失败了,我从中学到的教训是在构建集群时使用所有相同的SSD品牌和型号,因为速度差异。

硬件

在深入配置之前,有必要强调这里使用的硬件。我选择Hades Canyon Intel NUC进行这个构建,纯粹是因为我喜欢它们的外形规格和能够指定这些以实现性能和便携性的良好平衡。

NUC堆栈

每个NUC的大小大约与VHS磁带相同(如果你出生在2000年以后并且正在阅读本文,这就是我们在Netflix/Prime/Disney+/Plex/插入流媒体服务之前用来观看电影和其他内容的东西)。

每个的规格如下:

  • 4核i7 8705G - 8个超线程核心 - 适合虚拟化和功耗
  • 64GB RAM (https://amzn.to/4bpLskU) - 升级足够便宜并且最大化RAM
  • 4TB SSD (2x2TB https://amzn.to/3W2vWqS) - 通常110-125/SSD的交易不错。如果你想要,可以选择2x4TB,但这些会很快变得更贵。
  • 虽然在这个构建中没有使用,但内置的4GB Radeon RX Vega M GL如果你想要运行本地Plex服务器等情况下会很有帮助。

如今你可以从eBay以约200-300英镑的价格购买一个裸机Hades Canyon(如果你搜索型号NUC8i7HNK3),并用不错的规格(即64GB RAM和4TB SSD)构建它,大约需要400英镑,所以大约600英镑,你就可以拥有一个不错的家庭实验室系统。

NUC集群,包括PVE1、PVE2和PVE3

由于它们的大小,NUC堆叠得相当不错。我终于为我的标签打印机找到了一个合法的用途:在堆叠中标记ID(接下来,我将添加IP地址以便知道哪个是哪个)。

此外,我有3根Thunderbolt 3电缆用于将堆叠连接在一起;https://amzn.to/3xFbd2O - 可在此处获得;任何都可以,但这个短且易于电缆管理。

我不会带你了解如何设置硬件,因为它非常简单,顶板上有几个螺丝,然后你就可以访问RAM和SSD。

旁注:如果你想在一台主机上运行所有这些,我的一个朋友最近购买了一台MS-01,并用96GB RAM和不错的SSD部署了它。它们稍微贵一些,但如果你想要更现代的东西,它们仍然值得一看;如果你能承受,我推荐第13代i9以获得最大CPU容量和支持96 GB,因为它提供了一个不错的完整包。

(可选)在我们深入proxmox设置之前,如果你想将三个NUC集群在一起,设置类似于我上面的,你可以使用以下集群设置与Thunderbolt 3电缆;

  • 以标准方式将所有NUC连接到电源
  • 在所有节点上的BIOS中禁用安全启动;访问BIOS可以通过启动时的del键完成。
  • 将所有3根TB3电缆以环形拓扑连接:使用英特尔13 NUC机箱上打印的数字连接电缆如下(这很重要):
    • 节点1端口1 > 节点2端口2
    • 节点2端口1 > 节点3端口2
    • 节点3端口1 > 节点1端口2

连接硬件

通过下载proxmox iso和诸如’rufus’之类的工具准备一个可启动的USB密钥。最新版本的ProxMox可以在这里找到:https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso。在撰写本文时,我运行的是Proxmox VE 8.2.4。

安装Proxmox

在启动USB安装程序之前,我建议你坚持使用连接的以太网电缆。如果你采用集群设置,暂时跳过Thunderbolt。

从你创建的USB启动并设置proxmox,就像设置任何其他Unix安装一样。同意条款和条件。

需要注意的关键事项是你创建的密码和管理IP的IP范围,因为一旦设置完成,你将需要这两者来访问你的系统。

设置国家、键盘和常规设置 选择enp86s0作为管理接口(在proxmox 8上,如果电缆已连接,你也会看到Thunderbolt网络);我的建议是首先在没有ThunderBolt的情况下设置NUC,然后再使用它。 为每个节点设置一个名称 - 我使用了pveX,其中X = 我在此设置中想要的节点编号。但你可以使用任何你想要的主机名。只需记下它们,因为当你集群它们时,你需要它们来区分。

从完成开始并向后工作。

设置主机名后,下一步是为管理网络设置固定的IPv4地址。这再次可以是任何你想要的,但容易记住的东西会有所帮助; 我选择了10.10.53.x,因为我的家庭网络在10.x范围内使用了几个子子网 :)

  • 10.10.53.186/24 用于节点1
  • 10.10.53.187/24 用于节点2
  • 10.10.53.188/24 用于节点3

列在我的家庭资产清单中的PVE主机

设置外部DNS服务器和网关;如果你已经设置了pi-hole或AdGuard,也可以随意使用这些。

除非你想花哨,否则遵循设置分区的默认设置。然后,让软件按照它认为合适的方式分区磁盘。

最后,查看摘要页面,确保你对一切满意,并在提示时移除USB并重新启动。

平均而言,在三个主机上,上述过程大约需要15分钟。如果你有更快或更慢的SSD,时间会有所不同,但平均15分钟是一个不错的基准。

安装并启动后,你应该能够在相应IP地址的端口8006上访问Web界面,例如:https://10.10.53.186:8006

使用你的凭据登录 这将提示你登录。你的用户名将是root,密码将是你安装时设置的任何内容。

配置Proxmox

现在你已经设置了主机,下一步是配置proxmox。有很多方法可以做到这一点,例如使用GUI或SSH。我更喜欢SSH,因为它更容易调整和配置路径。从SSH终端,我们将调整sources.list文件,以便它使用无订阅存储库来更新apt。为此,只需在你最喜欢的文本编辑器中打开/etc/apt/sources.list;对我来说,是nano,因为它是最好的文本编辑器。编辑你的以匹配以下内容:

1
2
3
4
5
6
7
8
9
deb http://ftp.debian.org/debian bookworm main contrib
deb http://ftp.debian.org/debian bookworm-updates main contrib

# Proxmox VE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

# security updates
deb http://security.debian.org/debian-security bookworm-security main contrib

完成后,我们还需要调整/etc/apt/sources.list.d中的其他两个文件:

从ceph.list开始,你将需要注释掉现有值并将其替换为:

1
deb http://download.proxmox.com/debian/ceph-reef bookworm no-subscription

最后,删除或注释掉/etc/apt/sources.list.d/pve-enterprise.list中的条目。

然后只需以root用户身份运行apt update && apt upgrade,选择Y接受需要更新的包。

此外,我在堆栈中做的一件事是使用以下命令作为root利用LVM卷的完整大小:

1
2
3
lvremove /dev/pve/data
lvresize -l +100%FREE /dev/pve/root
resize2fs /dev/mapper/pve-root
  • lvremove /dev/pve/data:此命令删除位于/dev/pve/data的逻辑卷(LV)。lvremove实用程序用于删除逻辑卷,释放其所属卷组(VG)中的空间。
  • lvresize -l +100%FREE /dev/pve/root:此命令调整逻辑卷/dev/pve/root的大小以利用卷组中的所有可用空间。-l +100%FREE选项指定LV应增长VG中所有可用的未分配空间。
  • resize2fs /dev/mapper/pve-root:此命令调整/dev/mapper/pve-root上的文件系统大小以匹配逻辑卷的新大小。resize2fs确保文件系统利用先前lvresize命令提供的额外空间。

(可选)配置和构建集群

虽然本文重点介绍使用Proxmox进行设置和调整设置以构建集群,但你可能没有多个主机;因此,如果你更愿意深入了解设置主机的关键细节,请随时跳过本节。

为了节省重新发明整个轮子的时间,我遵循了一个非常详细的指南,可以在这里找到:https://gist.github.com/scyto/76e94832927a89d977ea989da157e9dc

该要点逐步介绍了配置跨集群的Thunderbolt网络的每个基本步骤,并解释了如何逐步操作。

构建完成后,你将拥有一个具有共享资源的高可用性集群,如下所示:

集群构建成功

继续设置不同的节点及其功能。

  • PVE01 = Docker主机,具有各种镜像,包括Gitea、AdGuard、Portainer、Jenkins和其他工具。
  • Homarr仪表板便于访问
  • PVE02 = http://Ludus.cloud
  • PVE03 = 带有Plex的媒体堆栈

设置Docker VM主机

我选择Ubuntu Server作为我的Docker主机的基线,但你可以运行任何你喜欢的。下面的设置说明详细介绍了如何在Ubuntu上使Docker工作(取自Docker的网站)。

首先,我们需要将ISO放在我们的Proxmox主机上;这可以通过上传ISO来完成,或者我们可以通过导航到local -> ISO Images -> Download from URL直接将ISO下载到主机。注意,在你的设置中,local可能命名为不同的东西。

将Ubuntu下载到你的Proxmox主机

提供URL;在这种情况下,Ubuntu 24-04的直接下载URL可以在这里找到(https://ubuntu.com/download/server)。将直接链接复制到URL框中,在’File Name’框中命名ISO为你想要的任何名称,然后只需单击下载;这将直接将ISO下载到你的主机。

从特色服务器快照中选择Docker

安装Ubuntu,遵循各种步骤直到选择包;确保选择安装OpenSSH,并从包中选择docker,然后选择安装。该过程需要几分钟,所以泡一壶茶或做任何其他你喜欢的事情。

完成后,我们可以SSH到我们的主机并运行以下命令以在Ubuntu Server主机上启动docker:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

上面的脚本可以复制并粘贴到你的终端或保存到.sh文件。或者,如果你懒,你可以简单地运行这个一行命令来拉取脚本并在你的shell中执行它;由于上面的命令,它会提示你的sudo密码:

1
curl https://gist.githubusercontent.com/ZephrFish/e313e9465a0445b7e4df6f842adda788/raw/2328a828b97b7eadecdd456cb10f48730711e785/DockerSetupUbunut.sh | sh

完成后,脚本将成功在你的主机上安装Docker(希望如此!)。在接下来的几个小节中,你可以继续添加Docker镜像。

Portainer

Portainer是一个轻量级的管理UI,允许你轻松管理Docker环境(主机或Swarm集群)。它提供了一个不错的Web界面来管理容器、镜像、网络和卷,使得那些不喜欢仅通过CLI管理Docker的人更容易。

下面的CLI允许部署portainer镜像,映射端口并映射到docker socket:

1
2
3
4
5
6
7
docker run -d --name=portainer \
-p 8000:8000 \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/portainer:/data \
--restart=always \
portainer/portainer-ce
  • -p标志将容器端口映射到你的主机,允许你通过http://:9000访问Portainer UI。
  • -v标志用于卷映射:
    • 第一个-v /var/run/docker.sock:/var/run/docker.sock允许Portainer通过连接到Docker socket来管理主机上的Docker。
    • 第二个-v /volume1/docker/portainer:/data是Portainer存储其数据的地方。你可以将/volume1/docker/portainer更改为本地系统上你更喜欢存储Portainer数据的任何目录路径,确保它在容器重新启动时持久存在。

登录后,Portainer会要求你添加一个Docker环境。我们可以选择本地环境选项,因为我们在本地运行它。对于远程环境,你可以使用代理或指定远程Docker端点。

Watchtower

这必须是我使用Docker最喜欢的应用程序。Watchtower通过连接到原始Docker Socket来保持你的Docker镜像最新。

1
2
3
4
docker run -d --name=watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always \
containrrr/watchtower --cleanup
  • -v /var/run/docker.sock:/var/run/docker.sock标志挂载Docker socket,允许Watchtower与你的容器交互和管理。
  • --restart=always选项确保如果容器停止或主机重新启动,Watchtower会自动重新启动。
  • --cleanup标志在更新后删除旧镜像,释放磁盘空间。

部署Watchtower后,它将开始根据提供的配置监控你运行的容器。默认情况下,它每24小时检查一次更新,但你可以使用WATCHTOWER_POLL_INTERVAL设置调整此设置。

Homarr

Homarr是一个中央仪表板,聚合和管理你的Docker应用程序,特别是那些运行在不同Web端口的应用程序。它提供了一个干净、自定义的界面来监控和访问各种服务,从一个单一窗格中管理你的Docker环境更容易。

1
2
3
4
5
6
7
8
9
docker run -d --name=homarr \
-p 80:4755 \
-v /volume1/docker/homarr:/app/data/configs \
-v /volume1/docker/homarr/icons:/app/public/icons \
-v /volume1/docker/homarr/data:/data \
-v /var/run/docker.sock:/var/run/docker.sock \
-e TZ=Europe/London \
--restart always \
ghcr.io/ajnart/homarr:latest
  • 端口:-p 80:4755标志将Homarr容器的端口4755映射到主机上的端口80,允许你通过http://:80访问仪表板。
  • 卷:-v标志用于将本地目录映射到容器路径:
    • /volume1/docker/homarr:/app/data/configs是Homarr存储其配置文件的地方。
    • /volume1/docker/homarr/icons:/app/public/icons存储你的应用程序的自定义图标。
    • /volume1/docker/homarr/data:/data用于额外的数据管理。
  • Docker Socket:-v /var/run/docker.sock:/var/run/docker.sock标志允许Homarr与Docker守护进程通信,使其能够直接从仪表板监控和管理你的容器。
  • 时区:使用-e TZ=Europe/London环境变量设置你的本地时区以确保时间戳正确。

配置Homarr:

  • 添加服务:Homarr允许指定服务名称、URL和端口。

  • 自定义图标和快捷方式:使用图标自定义每个服务以便于识别。上传你自己的图标或使用内置库中的图标。

  • 映射服务快捷方式以快速跳转到常用应用程序。

  • 小部件:Homarr支持小部件以增加功能,例如天气更新、新闻源、系统统计等。小部件可以放在仪表板上,以一目了然地了解与你环境相关的信息。

  • 管理Docker容器:Homarr通过挂载的Docker socket与Docker集成,提供GUI以:

    • 启动、停止和重新启动容器:你可以直接从Homarr界面管理你的容器,无需CLI命令。
    • 监控容器健康:获取每个容器的实时状态更新和资源使用指标(CPU、内存等)。
    • 查看日志:访问容器日志以监控应用程序性能并直接从仪表板排查问题。
  • 自定义仪表板:

    • 布局:Homarr提供灵活的布局选项,允许你根据需要排列服务和小部件。
    • 主题:选择各种主题以匹配你的审美偏好或与你的暗/亮模式设置对齐。
    • 访问控制:实施基本访问控制以保护你的仪表板,确保只有授权用户可以进行更改。
  • Webhooks和API集成:Homarr可以与各种API集成,允许你通过自定义集成进一步扩展其功能或通过webhooks自动化任务。

下一步

为了结束本系列的第一部分,请继续关注第二部分,我们将深入设置Ludus、安装SCCM和AD实验室,并探索如何在集群中的各个节点之间分配工作负载。在第三部分中,我们将重点介绍使用Plex、Overseerr和其他好东西

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计