(Re)Building the Ultimate Homelab NUC Cluster - Part 1
我写过很多关于构建脆弱环境来实验攻击路径、学习工具和技术工作原理以及如何修复它们的文章。我也讨论过过去构建的不同攻击和工具;然而,我最长时间是在单机上运行实验室。最近,我投入时间使用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)- 通常每个SSD约110-125英镑。如果你愿意,可以选择2x4TB,但这些会很快变得更贵。
- 虽然在此构建中未使用,但如果你想要运行本地Plex服务器,内置的4GB Radeon RX Vega M GL可能会很有用。
如今,你可以从eBay以约200-300英镑的价格购买一个裸机Hades Canyon(如果你搜索型号NUC8i7HNK3),并用约400英镑的体面规格(即64GB RAM和4TB SSD)来构建它,因此大约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中禁用安全启动;可以通过启动时的del键访问BIOS。
- 以环形拓扑连接所有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启动,并像设置任何其他Unix安装一样设置Proxmox。
- 同意条款和条件
- 需要注意的是你创建的密码和管理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
设置外部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,因为它是最好的文本编辑器。编辑你的以匹配以下内容:
|
|
完成后,我们还需要调整 /etc/apt/sources.list.d 中的其他两个文件:
从ceph.list开始,你将想要注释掉现有值并将其替换为:
|
|
最后,移除或注释掉 /etc/apt/sources.list.d/pve-enterprise.list 中的条目。
然后简单地以root用户身份运行 apt update && apt upgrade,选择Y以接受需要更新的包。
此外,我在堆栈中做的一件事是使用以下命令作为root来利用LVM卷的完整大小:
|
|
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:
|
|
上面的脚本可以复制并粘贴到你的终端中,或保存到.sh文件中。或者,如果你懒,你可以简单地运行这个一行命令来拉取脚本并在你的shell中执行它;由于上面的命令,它将提示你的sudo密码:
|
|
完成后,脚本将成功在你的主机上安装Docker(希望如此!)。在接下来的几个小节中,你可以继续添加Docker镜像。
Portainer
Portainer是一个轻量级管理UI,允许你轻松管理Docker环境(主机或Swarm集群)。它为管理容器、镜像、网络和卷提供了一个体面的Web界面,使得那些不喜欢仅通过CLI管理Docker的人更容易。
下面的CLI允许部署一个portainer镜像,映射端口并映射到docker socket:
|
|
-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最喜欢的应用程序。Watchtracker通过连接到原始Docker Socket来保持你的Docker镜像最新。
|
|
-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环境更容易。
|
|
- 端口:
-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自动化任务。
下一步
为了结束本系列的第一部分,请继续关注第2部分,我们将深入探讨设置Ludus、安装SCCM和AD实验室,并探索如何在集群中的各个节点之间分配工作负载。在第3部分中,我们将重点使用Plex、Overseerr和其他好东西构建家庭媒体堆栈。