1. 项目概述与核心思路最近我完成了一个基于8台树莓派4B构建的K3S Kubernetes集群项目。这个想法在我脑海里盘旋了很久一方面是出于对树莓派这个“万能小板子”的持续热爱总想用它折腾点新东西另一方面也是因为工作中接触云原生和微服务架构越来越多深感在本地拥有一个可以随意“折腾”、成本可控的Kubernetes学习与实验环境的重要性。市面上的云服务虽然方便但总隔着一层很多底层网络、存储的细节被屏蔽了自己从零搭建一遍对理解整个系统的运作机理有不可替代的价值。这个项目的目标很明确打造一个外观精致、运行稳定、且完全由自己掌控的小型边缘计算集群。它不仅要能稳定运行K3S承载一些容器化应用还要在视觉上足够“酷”成为一个摆在桌面上也不会违和的“极客艺术品”。因此整个构建过程远不止于软件配置更涉及了从机箱设计、材料切割、硬件组装到散热与供电系统规划等一系列硬件DIY环节。最终这个集群成功运行单个节点在负载下的CPU温度被压制在45°C以下所有服务运行平稳。接下来我将从设计思路、硬件选型、制作过程、软件部署到运维心得毫无保留地分享这次构建的完整历程。2. 硬件设计与选型深度解析构建一个树莓派集群硬件是地基。我的设计原则是稳定优先、紧凑美观、便于维护。这意味着每一个硬件选择背后都需要权衡性能、成本、空间和散热。2.1 计算节点树莓派4B的考量选择树莓派4B Model B4GB内存版本作为计算节点是基于多方面的平衡性能与功耗比四核Cortex-A72架构提供了足够的计算能力应对多个容器实例绰绰有余。其功耗满载约6-7W在集群规模下依然可控。网络与IO板载千兆以太网和USB 3.0接口是关键。千兆网保证了节点间通信带宽避免网络成为瓶颈USB 3.0则为未来连接外部高速存储如SSD预留了可能性。社区与生态庞大的社区意味着任何问题几乎都能找到解决方案丰富的散热配件、扩展板HAT等也降低了构建难度。成本控制在满足需求的前提下4GB版本是性价比之选。8台的总成本仍在可接受范围内构成了集群算力的基础。注意购买时务必确认是正品并检查电源适配器是否能提供稳定的5V/3A输出。劣质电源是树莓派不稳定的首要元凶。2.2 网络核心交换机的选择与非PoE的权衡网络是集群的神经系统。我选择了Netgear GS110MX这款8端口千兆非网管交换机。为什么是非网管交换机对于这个实验性集群VLAN、端口聚合等高级功能并非必需。非网管交换机即插即用配置简单稳定性高且价格更具优势。为什么放弃PoE以太网供电这是一个重要的取舍点。使用PoE HAT供电板可以通过网线同时解决供电和数据传输能极大简化布线。但我最终放弃了原因有三成本一个支持8个PoE端口的交换机价格昂贵且每个树莓派还需要一个PoE HAT总成本会大幅上升。散热与空间PoE HAT会覆盖树莓派的大部分面积严重限制散热器的选择尤其是像ICE Tower这种大型塔式散热器将无法安装。被动散热在密集集群中风险较高。美学与灵活性我希望机箱内部布局更规整使用独立的USB-C供电线可以更灵活地安排走线并且那些带有LED灯的散热风扇也能完美展示这是PoE方案难以实现的。2.3 供电系统稳定大于一切为8台树莓派供电是个严肃的工程问题。树莓派4B官方建议使用5V/3A电源但实际轻载运行时电流远小于此。不过设计必须按峰值考虑。总功率计算8台 * 5V * 3A 120W。这是理论最大值。我选择了Mean Well RS-150-5开关电源它提供5V/26A130W的输出留有约8%的余量确保即使所有节点瞬间高负载电源也不会过载。电源品质明纬Mean Well是工业电源品牌其稳定性和可靠性远非普通山寨电源可比。在集群这种7x24小时运行场景下电源的纹波、电压稳定性至关重要劣质电源可能导致节点随机重启或SD卡损坏。分布式供电我没有让电源直接连接8根USB线而是制作了一个“USB-A母口转接板”将电源的5V输出先接入这个转接板再分接到各个90度弯头USB-C线上。这样做的好处是接线更整洁也便于未来维护或扩展。独立供电网络交换机需要12V供电我为其单独配置了一个HiBay的18W超薄变压器。这样强弱电分离减少干扰也符合安全规范。三级保险从墙插到机箱我设置了三级保护墙插开关自带保险丝、电源模块内部保险、交换机电源适配器保险。多重保护最大限度避免了因局部短路导致的全系统损坏。2.4 散热方案静音与效能的平衡树莓派4B的CPU在压力下发热不容小觑。良好的散热是长期稳定运行的保障。主动 vs. 被动在密集排列的机箱内被动散热很难将热量及时排出会导致热量堆积。因此主动风冷是更可靠的选择。散热器选型我混合使用了GeeekPi的ICE Tower冰塔和Low-profile矮版两种散热器。ICE Tower拥有更大的散热鳍片和92mm风扇散热能力极强矮版则用于空间受限或对风道有特殊要求的位置。这种混合布局既保证了散热效果又照顾了整体美观和风道设计。风道考虑在封闭机箱内我让所有散热风扇的方向一致例如都向机箱后部吹风并在机箱前后或上下设计通风孔形成定向风道避免热空气在箱内循环。2.5 结构材料亚克力与3D打印的结合机箱采用黑色和深红色亚克力板制作辅以3D打印的固定结构件。亚克力Perspex透明度高易于切割和打磨外观质感好。选择5mm厚度用于承重底座3mm用于侧板和盖板。3D打印PLA用于制作固定交换机、支撑树莓派安装板以及连接亚克力板的角件。3D打印的优势在于可以快速迭代设计制作复杂结构的连接件成本低。粘合剂选择这是整个制作中最关键的环节之一。亚克力之间粘接使用专用的TENSOL 12亚克力粘合剂它通过溶解表面并融合的方式连接强度极高几乎等同于本体。而亚克力与3D打印的PLA材料粘接则经过测试选用了Loctite 406低粘度瞬间胶。它对于多种塑料都有极好的粘接效果且固化快。3. 机箱制作与组装实操全记录这部分是“从图纸到实物”的过程充满了细节和挑战。3.1 设计制图与材料加工首先使用CAD软件如Fusion 360进行三维建模。设计时要精确考虑每一个部件的尺寸树莓派加上散热器的高度、交换机的外形、线缆的弯曲半径、螺丝的安装空间等。建模后可以将非承重的结构件导出为STL文件用于3D打印将面板、底板等板材部件导出DXF文件用于亚克力切割。亚克力切割我找到了一家提供在线切割服务的公司只需上传DXF文件并选择材料和厚度他们就会切割好并邮寄过来。这对于没有激光切割机的个人来说非常方便。对于少数需要特殊形状如L型侧板的部件我选择订购矩形板材后自己用线锯和打磨机加工。3D打印将结构件切片后用3D打印机如Creality Ender系列使用PLA材料打印。建议填充率设置在20%-30%以保证强度。打印完成后需要对支撑接触面进行打磨确保与亚克力板的粘接面平整。3.2 关键粘接步骤与技巧粘接顺序决定了组装能否顺利进行。我的顺序是底座与框架先将3D打印的底部支撑框架用瞬间胶粘接到5mm厚的亚克力底板上。粘接前务必用酒精彻底清洁粘接面。使用直角尺确保框架与底板垂直。主体框架组装将前后、左右侧板用亚克力粘合剂拼接成箱体。这里使用注射器配合钝头针来精确涂抹粘合剂避免溢出影响美观。粘合时用胶带临时固定待其初步固化约数小时。内部安装板将用于固定树莓派的红色透明亚克力安装板粘接到内部的支撑柱上。关键技巧这一步骤我放到了最后目的是在最终固定前有充足的空间在箱体内进行布线。装饰条粘接最后将红色的装饰条粘在箱体外部边缘遮盖接缝提升美观度。重要提示亚克力粘合剂挥发气体有刺激性务必在通风良好的环境下操作并佩戴手套和口罩。粘合后需静置24小时以上以达到最大强度。3.3 硬件安装与内部布线安装树莓派在红色亚克力安装板上按照树莓派的孔位钻孔。使用M2.5的铜柱和螺丝将树莓派固定。然后安装ICE Tower散热器。注意散热硅脂要涂抹均匀薄薄一层即可。固定交换机将网络交换机从前面板预留的开口推入用螺丝从底板下方固定在3D打印的交换机托架上。确保所有网口都露在外面便于插拔。电源系统安装将Mean Well电源模块和12V变压器用螺丝或强力双面胶固定在底板预留位置。连接220V输入线到船型开关再从开关输出到两个电源模块。精细化布线供电线将90度弯头USB-C线从树莓派背部引出沿着设计好的线槽集中连接到USB-A转接板上再统一连接到5V电源输出端。使用扎带或魔术贴固定线缆。网线使用0.5米长的六类网线将每个树莓派的网口连接到交换机。线缆长度留有余量在箱内盘成小圈并用线夹固定避免杂乱。核心原则强弱电线缆尽量分开走线避免平行走线过长以减少干扰。所有线缆固定牢靠防止因震动松脱。4. 软件系统部署与K3S集群配置硬件就绪后接下来是让集群“大脑”运转起来。我选择了64位的Raspberry Pi OS Lite无桌面版作为操作系统并部署轻量级的K3S。4.1 系统初始化与批量准备面对8个节点手动一个个配置是低效的。我采用“先主后从镜像克隆”的方式。主节点镜像制作将一张32GB的Micro SD卡插入电脑使用Raspberry Pi Imager刷入Raspberry Pi OS Lite64位镜像。刷完后不要拔卡系统会挂载为一个名为boot的分区。在该分区根目录下创建一个名为ssh的空文件启用SSH服务再创建一个名为userconf.txt的文件内容为pi:$6$...加密后的密码可用openssl passwd -6命令生成用于设置pi用户的密码。编辑config.txt文件在末尾添加dtparamaudiooff禁用音频以省电和boot_delay1解决某些启动问题。编辑cmdline.txt在行末添加cgroup_memory1 cgroup_enablememory这是K3S启用cgroup内存管理的必要条件。将此配置好的SD卡插入一台树莓派上电启动。通过SSH登录ssh pi树莓派IP进行初步配置sudo raspi-config中扩展文件系统、设置时区、更改主机名如k3s-master-01、设置WiFi国家码如果需要WiFi。然后执行sudo apt update sudo apt upgrade -y更新系统。安装必要工具sudo apt install -y vim git curl wget。节点镜像克隆将这张配置好的SD卡从树莓派取出重新插入电脑。使用磁盘工具如dd命令或Win32 Disk Imager将整张卡制作成一个镜像文件.img。用这个镜像文件批量刷写到另外7张SD卡上。关键步骤每刷写一张卡在挂载的boot分区中修改hostname文件的内容以及userconf.txt中的密码可选确保每个节点有唯一的主机名和密码。这是避免冲突的关键。4.2 K3S集群部署详解K3S是Rancher Labs发布的轻量级Kubernetes发行版非常适合边缘设备和资源受限环境。主节点Server安装在主节点上运行以下命令一键安装K3S Server并禁用默认的负载均衡器Traefik和本地存储Local Path Provisioner因为我们后续可能会用其他方案。curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC--disable traefik --disable local-storage sh -安装完成后查看节点令牌用于工作节点加入集群sudo cat /var/lib/rancher/k3s/server/node-token同时记下主节点的IP地址ip addr show eth0。工作节点Agent安装在每个工作节点上运行以下命令将MASTER_IP和NODE_TOKEN替换为实际值。curl -sfL https://get.k3s.io | K3S_URLhttps://MASTER_IP:6443 K3S_TOKENNODE_TOKEN sh -这个过程会在工作节点上安装K3S Agent并自动向主节点注册。集群状态验证回到主节点查看集群节点状态。K3S默认使用/usr/local/bin/kubectl命令。sudo kubectl get nodes -o wide如果所有节点状态都是Ready恭喜你一个树莓派K3S集群已经搭建成功4.3 基础组件与网络配置默认安装的K3S非常精简我们需要根据需求添加一些组件。安装HelmHelm是Kubernetes的包管理器方便我们部署复杂应用。curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash部署网络插件CNIK3S默认使用Flannel作为网络插件但在某些多网卡或特定网络环境下可能需要调整。我选择更灵活的Calico。通过Helm安装Calicohelm repo add projectcalico https://projectcalico.docs.tigera.io/charts helm install calico projectcalico/tigera-operator --namespace tigera-operator --create-namespace等待所有Pod变为Running状态sudo kubectl get pods -n tigera-operator -w部署存储方案容器持久化存储是必须的。对于实验环境NFS是简单易行的选择。可以在集群外或集群内一个节点上搭建NFS服务器然后部署NFS Client Provisioner。首先在某个节点例如主节点上安装NFS服务器并共享一个目录。在集群中部署NFS Provisionerhelm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ --set nfs.server你的NFS服务器IP \ --set nfs.path/path/to/nfs/share部署Ingress Controller为了从外部访问集群内的服务需要Ingress。我选择Nginx Ingress Controller。helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.hostNetworktrue \ --set controller.kindDaemonSet \ --set controller.service.typeNodePort设置hostNetworktrue和DaemonSet可以让Ingress在每个节点上监听80/443端口这样通过任何节点的IP都能访问服务非常适合没有负载均衡器的家庭环境。5. 集群运维、监控与问题排查集群跑起来只是开始如何让它稳定、可控地运行并了解其状态是更重要的课题。5.1 基础监控部署没有监控集群就像在黑暗中运行。我部署了经典的Prometheus Grafana组合。部署Prometheus Stack使用kube-prometheus-stack这个Helm Chart它包含了Prometheus、Grafana、Alertmanager以及一系列针对Kubernetes的监控规则和面板。helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace访问Grafana安装完成后将Grafana服务端口转发到本地查看。sudo kubectl port-forward svc/prometheus-grafana -n monitoring 3000:80浏览器访问http://localhost:3000默认用户/密码是admin/prom-operator。里面已经预置了丰富的Kubernetes集群监控面板。5.2 硬件状态监控除了Kubernetes本身我们还需要关注树莓派的硬件健康度特别是温度。在每个节点上部署node-exporter通常已包含在kube-prometheus-stack中它可以收集节点硬件和OS指标。在Grafana中导入或制作一个面板监控node_hwmon_temp_celsius这个指标它反映了CPU温度。可以设置警报规则当温度持续高于70°C时发出告警。5.3 常见问题与排查实录在构建和运行过程中我遇到了不少“坑”这里分享最典型的几个节点状态为NotReady现象kubectl get nodes显示某个节点状态不是Ready。排查首先SSH到该节点检查K3S Agent服务状态sudo systemctl status k3s-agent。查看服务日志sudo journalctl -u k3s-agent -f。常见原因1网络问题。检查该节点是否能ping通主节点的6443端口telnet MASTER_IP 6443。检查防火墙是否放行了相关端口。常见原因2Token错误或过期。确保工作节点加入时使用的Token是正确的。主节点的Token文件路径为/var/lib/rancher/k3s/server/node-token。常见原因3cgroup未正确启用。检查/boot/cmdline.txt中是否添加了cgroup_memory1 cgroup_enablememory参数并已重启。Pod一直处于Pending状态现象部署的应用Pod卡在Pending无法调度。排查sudo kubectl describe pod pod-name查看事件。常见原因1资源不足。可能是CPU或内存不足。检查节点资源kubectl describe node node-name看Allocatable和Requests。常见原因2没有满足条件的节点。例如Pod要求了nodeSelector或tolerations但没有节点匹配。检查Pod的YAML定义。常见原因3PVC持久卷声明无法绑定。检查StorageClass是否配置正确NFS服务器是否可达。节点CPU温度过高现象监控告警或手动检查发现某个节点温度超过80°C。处理立即措施登录该节点查看是什么进程占用CPUtop或htop。可能是某个失控的容器。长期措施检查散热器风扇是否正常转动清理灰尘。考虑调整机箱风道或在BIOS中通过raspi-config-Performance Options设置更激进的散热策略如fan_temp参数。SD卡寿命担忧背景树莓派从SD卡启动频繁的日志写入会缩短SD卡寿命。优化方案启用日志轮转确保logrotate服务正常运行。将Docker/K3S数据目录移到外置USB SSD这是最有效的提升性能和寿命的方法。修改/etc/docker/daemon.json如果使用Docker和K3S的启动参数将数据目录指向挂载的USB SSD。这需要重新配置但一劳永逸。使用高耐久度High Endurance的工业级Micro SD卡。5.4 性能调优与安全建议内核参数调优对于网络密集型应用可以调整一些内核参数。编辑/etc/sysctl.conf添加net.core.rmem_max134217728 net.core.wmem_max134217728 net.ipv4.tcp_rmem4096 87380 134217728 net.ipv4.tcp_wmem4096 65536 134217728执行sudo sysctl -p生效。这增加了TCP缓冲区大小有助于提升网络吞吐量。基础安全加固更改默认密码首次登录后立即更改pi用户密码。使用SSH密钥登录禁用密码登录使用密钥对认证。更新系统定期运行sudo apt update sudo apt upgrade。限制Kubectl访问不要长期使用sudo运行kubectl。将/etc/rancher/k3s/k3s.yaml配置文件拷贝到本地~/.kube/config并设置正确的权限chmod 600 ~/.kube/config。考虑使用RBAC为不同用户分配权限。构建这个树莓派K3S集群的整个过程是一次硬件DIY与软件运维的深度结合。它不仅仅是一个可用的计算平台更是一个理解从硬件供电、散热设计到分布式系统编排、容器网络的全栈实践。看着八个节点上的指示灯规律地闪烁kubectl get pods -A输出中一排排Running的状态那种亲手搭建起一个复杂系统并使其稳定运行的满足感是单纯使用云服务无法比拟的。这个集群现在安静地运行在我的工作台旁承载着我的HomeLab应用、开发测试环境以及无数个突然迸发的技术实验想法。如果你也热爱动手创造不妨尝试一下这个过程中的收获远不止于一个集群本身。