我的家庭Kubernetes集群的剖析

一年前,我意识到我想创建自己的Kubernetes集群。我是软件开发人员。通常,我要么使用单节点本地群集,要么使用远程多节点群集来测试我的项目。当使用单节点集群时,我通常依靠Minikube,尽管还有其他解决方案,例如Kind项目,它可以模拟集群中多个节点的存在。Minikube中可能会出现对多个节点的支持

因此,我想使用上述两种环境的功能。那就是-这样,我将拥有一个由多个节点组成的集群,并且使用这些集群不会暗示与远程环境进行交互所典型的网络延迟。 关于使用单板计算机构建Kubernetes多节点集群的文章已经写了很多很棒的教程。这些手册中有许多都将Raspberry Pi用作SBC。看到这一点,我决定选择阻力最小的路径,并选择了这台计算机。 Raspberry Pi平台已将自己确立为一种廉价且负担得起的解决方案。





应该注意的是,该平台的选择提供了一些折衷方案。例如,Broadcom和Raspberry Pi Foundation没有许可ARMv8密码扩展(这对于硬件加速AES支持是必需的)。另一个有争议的解决方案是使用标准存储介质形式的microSD卡,从中加载操作系统。

通过分析在单板计算机上创建集群的现有准则,我没有找到一个描述满足我要求的解决方案的准则。我将开始与他们一起创建的集群的故事。

要求


  • 群集应封装在单独的外壳中,可以与系统的单独模块一起轻松移动,打开和维护。
  • , . , , . , . , .
  • , .
  • , , , .

在这些要求的背后,有一个不明显的目标,那就是我需要我四岁的女儿来与群集一起工作。我希望他会成为她的学习指南,帮助她熟悉计算机,命令外壳和终端。

配饰


详情资源
Pico 5 Raspberry PI 5S入门套件picocluster.com
单板计算机:2 Raspberry Pi 4B(4GB)3 Raspberry Pi 3B +
5个microSD卡32GB 10级/ A1 raspberrypi.org
以太网电缆:2 0.25m Cat.83 0.15m Cat.7,S / FTP1attack.de
USB电缆PortaPow 20AWG2 USB-C3电缆micro-USB电缆Portablepowersupplies.co.uk
官方Raspberry Pi 7″触摸屏raspberrypi.org
电源Dehner Elektronik STD-12090 12V /直流9A 108Wdehner.net
12V至5V 15A DC-Buck转换器droking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

PicoCluster保护套体积小巧,易于使用。从订购的入门工具包中,我仅使用了机箱(包括闩锁和机架)以及8端口千兆以太网交换机。

现在我了解到,如果PicoCluster出售不带任何电子组件的套件版本会更好。该套件的另一种选择是开发自己的外壳。但是,这将需要更多时间。我将不得不创建矢量绘图,我将不得不在一家提供丙烯酸板的公司中使用激光切割服务,理想情况下,该公司的板具有可消除静电放电的涂层。

在工作过程中,我遇到了有关电压不足的警告并发现问题是由包装盒附带的微型USB电缆引起的。此外,还有一个降压DC-DC转换器12V至5V,30W的外壳,我将其替换为功能更强大的转换器。我这样做的原因是,我将在下面的“为系统供电”部分中进行讨论。

在我开始这个项目的工作时,我不打算使用2019年发布的Raspberry Pi 4开发板。这说明我仍然有三个Raspberry Pi 3板充当工作节点。我将另外两个这样的板交换为Raspberry Pi4。它们用于需要更多资源的节点。这是主节点和工作节点,主要用于创建数据备份。

在Raspberry Pi 4发布之后不久,PicoCluster推出了专门为此类主板设计新机箱。它包括一个强大的电源,两个风扇和一个电源开关。没错,这种情况比我的要大,风扇肯定会比Noctua NF-A4x20大。考虑到在板上执行的温度测量结果,可以使用脉冲宽度调制(PWM)来控制该风扇的转速

应当指出,SoC Broadcom BCM2837(Raspberry Pi 3)和SoC BCM2711(Raspberry Pi 4)都具有能够生成PWM信号的硬件计时器。因此,发出控制输入​​信号非常简单Noctua NF-A4x20 PWM所期望的值,而不会使处理器过载。此外,风扇以其支持的速度(约2500 rpm)的一半运行时几乎听不到声音。事实证明,这足以在正常负载下将系统温度保持在45°C / 113°F以下。

新机箱包含一个集成电源。而且,他比我选择的那个贵。这种情况下的所有这些特征是即使我现在购买了情况下我仍会选择Pico 5S套件的原因。应该加倍努力,但对我来说最终的结果似乎比如果我选择其他建筑物的结果要好。通常,值得付出努力和时间。

部件


▍前面板



前面板

前面板有一个用于插入microSD卡的开口。即使考虑到我计划使用 USB大容量存储启动来组织系统启动,这也很方便。我计划在Raspberry Pi 4完全支持此启动模式之后立即执行此操作。该孔还有助于组织壳体中的空气流通。在这种情况下,两个SSD驱动器直接位于风扇的前面,这有助于保持其最佳工作温度。

电路板的活动和电源指示灯清晰可见,使您可以一目了然地评估集群的状态。以太网交换机的活动指示器也可见。


不带屏幕的外壳顶部面板

可以轻松移动屏幕,使其更靠近键盘,或者在打开外壳时可以访问顶部面板。

▍左面板



左面板

在机箱的左面板上是板的GPIO端口。其中一根电缆将主机与风扇连接-用于组织PWM对其转速的控制。另一根电缆将主节点连接到电路板模块,该电路板用于打开和关闭工作节点。四根电缆将每个工作节点连接到主节点。关闭时,它将使用具有高有效电平的GPIO引脚。这允许主节点在其操作结束时执行的一系列操作完成后,安全地关闭工作节点的电源。


用于将风扇连接到主节点的模块

在左上角是一个小模块,用于将4针Noctua风扇连接器连接到Raspberry Pi主节点。由于硬件支持生成PWM信号,相应的GPIO连接器配置为控制风扇速度。速度是根据对板温度的分析来选择的,有关该板的信息是使用SSH定期收集的。另外,出于监视目的,主机读取风扇速度。

▍后面板



后面板

机箱的后面板隐藏电缆。一切看起来都是这样,这一事实可以被认为是对我的项目的模块化组织采取狡猾方法的结果。很难找到优质的电缆。特别是-带弯曲插头的USB 3.0短电缆。电缆-这是我系统中最大的移动元件组,它们必须满足某些机械和电气特性。事实证明,它们是问题的主要根源。

我有一个想法是使用单根螺旋电缆,以将其替换为DSI胶带电缆,通过该电缆将屏幕连接到系统。然后,螺旋电缆将屏蔽网连接到群集并为其供电。但是我找不到合适的DSI连接器。我没有进行这项工作,也没有被焊接0.14mm²的17根导线的前景所吸引。我使用了DSI电缆扩展器,并使用了2线螺旋micro-USB电源线。这使我能够轻松移动和关闭屏幕而无需打开外壳。


布置电缆的尝试失败

这是使用系统将电缆组织到专为USB 3.0扩展电缆设计的机箱中的电缆尝试,但未成功。尽管进行了无数次尝试正确布线的尝试,但在数据传输期间我还是系统地遇到了I / O错误。它们可能是由于在铺设电缆时它们被过度拉伸的事实,或者是由于这削弱了电缆与连接器的可靠连接。

▍右面板



右面板

在机箱的右侧,您可以看到8端口以太网交换机。

系统设计


▍食物



前面板打开的情况下,

我必须决定使用哪个电源。特别是,为了满足群集的需求,它必须支持多少瓦特功率。这是关于之前发生过的事情的一个问题-鸡还是鸡蛋,因为在向群集供电之前无法进行测量。

为了获得大致的功耗估算,我转到了官方文档,其中包含有关Raspberry Pi的功耗以及其他组件规格的一些信息。这给了我以下基于平均能耗的近似数字。


但是考虑到文档中能耗的最大值之后发生了什么。


这比那些可以产生5V电源的电源要高得多,因为“低功耗”组件需要10A的电流。这排除了使用单个5V电源的可能性。同时,12V电源很常见,可以提供必要的电源水平。结果,我选择了Dehner Elektronik STD-12090 12V / DC 9A 108W电源,并将其连接到12V至5V 75W DC / DC 转换器

在这里,我还有另一种选择,其中包括使用五个功能较弱的转换器-每个Raspberry Pi板一个,但是这会使群集设计大大复杂化。


接线板

在机箱底部安装了一个基于MOSFET PSMN011-30YLC的4引脚接线板。它用于启用和禁用工作节点。它标为15A,30V,因此即使在由四台Raspberry Pi产生的负载下也能很好地应对。

我测量了集群消耗的平均功率和最大功率。测量结果与我之前所做的近似计算大致一致。期望值和实际值之间的差异可以通过系统配置的功能和测试的功能来解释。特别是,我在Raspberry Pi上关闭了Wi-Fi和蓝牙,它们也可以正常工作,而不会在显示器上显示图像。这可以解释一个事实,那就是现实中的价值实际上更低。

事实证明,108W电源比集群所需的电源强大得多。但是,事实上,我只有这样的电源,这意味着我可以扩展系统的功能。例如,将Raspberry Pi 3替换为Raspberry Pi 4。

▍数据存储


Raspberry Pi 4的新功能之一是板上有两个USB 3.0端口,这些端口使用非常快速的PCIe连接连接到BCM2711 SoC。因此,人们可以希望达到很高的数据速率。我决定使用这些USB 3.0端口将使用M.2 NVMe的SSD连接到USB 3.0适配器。但是,事实证明,很难找到这样的适配器。我天真地建议任何适配器都适合我。其结果是,我买的第一个这样的适配器,而不检查其与树莓派4兼容性

我,幸运的是,遇到这种Raspberry Pi 4下载指南,然后购买了推荐的Shinestar M.2 NVMe转USB 3.0适配器。它的大小几乎与M.2 NVMe 2280相同(宽22毫米,长80毫米),非常适合Pico 5S机壳。我使用适配器将Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go连接到Raspberry Pi。


用于USB 3.0的M.2 NVMe适配器

安装并配置完所有组件后,我决定快速测试驱动器并找出数据传输速度。为此,我使用scp以下命令从SSD将大文件复制到笔记本电脑

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


39 Mb / s的结果使我感到失望。这些数字远非完全加载千兆以太网交换机所需的数字。我开始寻找系统中可能出现的瓶颈,并意识到在文件传输期间,处理器核心之一始终会被100%加载。在我发现处理器是数据传输的瓶颈之后,我很快发现Raspberry Pi 4不支持AES硬件,因为Broadcom和Raspberry Pi Foundation没有许可ARMv8加密扩展。有趣的是,处理器是Raspberry Pi 4上系统的瓶颈,而Raspberry Pi 3的瓶颈是USB 2.0和网络接口。在相同条件下

使用的新测试netcat以104 Mb / s的速度提供了更好的结果:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

处理完第一个SSD驱动器后,我将第二个相同的驱动器连接到另一个Raspberry Pi 4板上,我将使用该驱动器通过Restic之类的方法备份第一个驱动器

此外,我计划在Raspberry Pi 4完全支持此启动方法之后,立即使用SSD来通过USB大容量存储启动来组织启动。与从microSD下载相比,它具有更高的速度和更稳定的性能水平。

软件


我是一名程序员,所以我认为处理集群的软件部分比处理其他问题要容易得多。Rancher团队k3所做的出色工作的结果无疑对我有帮助我不会在这里讨论使用k3在Raspberry Pi上设置Kubernetes集群的特定细节。对于那些有兴趣的人,我建议您参考指南。这是我要详细介绍的配置要点。

首先,在每个节点上启用cgroups

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

然后在主节点上安装k3s:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

现在我们得到一个令牌,授权工作节点到主节点的连接:

$ sudo cat /var/lib/rancher/k3s/server/node-token

接下来-在每个工作节点上安装k3:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

如果计划使用默认情况下安装的容器映像的内部注册表,则可能需要以特殊方式对其进行配置,以允许从中containerd加载映像:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

未来的计划


在本文中,我没有透露一些值得深入分析的重要主题。例如,以下内容:

  • 工作节点的软件电源管理和自动集群扩展
  • 安装PWM风扇并调整其速度时要考虑系统的温度指示器。
  • 使用MetalLB在Kubernetes上安装Pi-Hole

也许我会写更多有关此的内容。

此外,我计划通过执行以下操作来继续在集群上工作:


我敢肯定,当我谈到创建Kubernetes家庭集群的经验时,我忘了很多东西。我是一名程序员,习惯于将大型任务分解为较小的案例。经验表明,在反复试验中,硬件的容忍度要比软件差得多。

总的来说,我越了解,我对现代硬件和软件技术的敬佩就越大。让我惊讶的是,一个人的独创性如何将电子现象和编程语言结合在一起,使它们成为可以被视为意识控制方式的一个例子。

亲爱的读者们!您是否尝试过做与本文作者所描述的类似的事情?


All Articles