跳到主要内容

220 美元的裸金属 K8s:便宜的是硬件,贵的是学费

阿舟
阿舟

· 阅读约 5 分钟

我从回收堆里捡了一台戴尔 OptiPlex(i5-6500、16G 内存、256G SATA SSD),凑了三台树莓派4,搭了个 4 节点裸金属 K8s 集群。硬件总价 220 美元:OptiPlex 免费,树莓派每台 60,交换机 35,USB SSD 每块 25。这篇不是来晒成本的,是来交税的——集群跑了大半年,翻车翻了五种姿势,学费我没细算,反正远不止 220。

先说最疼的一个。我给一个服务加 CiliumNetworkPolicy,想把网段 A 到网段 B 的白名单收紧。配置应用之后,全网没动静了。不是某个 Pod,是所有节点——kubectl 失联,SSH 失联,ping 都不通。ArgoCD 大概率还在后台快乐地同步着同一个错误配置,我没法远程阻止它。最后我走到机器旁边,把四台节点一台一台拔电再插上。别问,问就是物理重启。

事后翻文档才看到一条保命参数:talos.config=none,可以绕过网络栈引导,进去编辑 CNI 状态把策略清掉。我那时候不知道,所以手伸到机箱后面,体验了十秒非常原始的运维。eBPF 策略这东西,写进去容易,出故障了想看到底哪里错了,难。我当时查日志、查事件、查端口——全都依赖网络栈,而网络栈本身就是被策略锁死的那一层。循环依赖。

回到存储。这集群最早用普通 SD 卡做系统盘,六周烧了三张 64GB SanDisk Ultra。不是容量不够,是 etcd 那种高频小写入直接把闪存转换层写崩了——SD 卡的主控逻辑跟服务器负载从来就不是一个设计假设。画外音:就算你给 SD 卡做了掉电保护,它也不会因此更耐写。换 USB3 SSD 之后,零存储相关崩溃,稳定跑了八个月。评论区有人说烧 SD 卡是裸金属 K8s 的必经之路,我信了;但同一个坑能踩一次就够的,别踩三次。

存储的坑不止 SD 卡。Longhorn 的默认配置让我栽了个更值的跟头:建了个 10Gi 的 PostgreSQL 卷,副本 3 份,快照默认保留 2 份,实际存储占用是 10×3=30Gi 再叠 20Gi 快照,一共 60Gi。节点磁盘涨到 85%,kubelet 把上面所有 Pod 逐出——不是报错,是 Evicted,整台节点像被抽空。那个晚上我盯着节点列表看 Pod 一个个从 Running 掉到 Evicted,除了等磁盘压力自己下去,没有任何操作空间。

后来我把 Longhorn 配成:非关键卷副本最多 2 份,快照保留 2 份且超过 7 天自动删,Prometheus 磁盘告警设到 70%,镜像 GC 阈值也设到 70%。粗暴但有效。以前我觉得配额是限制,现在觉得是生存机制——这个认知是用一次全员驱逐换来的,别嫌它听起来像口号。

真正让我付出最大代价的是升级。Talos 从 v1.6.0 升到 v1.7.0,升级前 Prometheus 的磁盘告警已经响了,我瞄了一眼,想着"升完再说"。结果 etcd 的 WAL 在升级过程中写不进去,文件损坏,集群失去法定人数。备份?备份是 3 周前的——这种事永远在"再等等",等到出事才发现一分钟都没等。恢复花了 6 个小时,Prometheus 的历史指标和 Longhorn 的卷状态基本全丢。

复盘到凌晨,根子不在升级本身,在磁盘压力。升级把 etcd 最后那点写能力挤没了,而磁盘早在一个星期前就站在悬崖边——告警报了,我没当回事。后来我写了个 Go CLI 封装 talosctl upgrade:每 6 小时自动备份 etcd 到 S3,升级前跑一轮预检——磁盘使用率 <70%、所有节点 Ready、Longhorn 卷健康。任何一条不过,升级直接中止。这套流程不性感,但它是用 6 小时恢复换来的一条铁律。

还有一桩规模更小但更烦人的:MetalLB 的 L2 模式给 LoadBalancer 服务分配了 192.168.1.105,同一时间这个地址已经被路由器 DHCP 池分给了某台设备。IP 冲突,服务间歇性失联,排查到怀疑人生。后来把 MetalLB 的地址池挪到 DHCP 池外,再后来干脆切了 BGP 模式——所谓网络经验,全是这类"原来地址池不能跟 DHCP 重叠"的学费堆出来的。

这些坑没有一个是在买硬件时能预料到的。硬件选型上我做的最明智的决定,不是选了什么,而是没选什么:树莓派5 早就出了,我还在用树莓派4——arm64 兼容性在 4 上被踩过了,懒得再给 5 交一遍学费。四台裸金属的实验室,工具够用就行。

这大半年下来,真正能搬到生产环境的不是硬件清单,是三条用翻车换来的判断。

配额是生存机制。每个工作负载的资源上限先算清楚再跑,副本数敢配成 3 份,就得先确认盘子上的空间够它吃 3 份加 2 份快照。Longhorn 的副本和快照策略应该在第一个 PVC 创建之前就理明白,而不是等磁盘满了才去调。

可观测性必须先于一切业务工作负载进场。Prometheus 和 Grafana 不在,等磁盘告警跳出来时,节点早就被 Evicted 空了——你只能看回放。

GitOps 不是省事,是后悔药。ArgoCD 把每次变更变成一次 commit,出问题就是一次 revert,可回滚、可审计。没有它的时候,手动敲错一条命令就是事故;有它,变成一次撤销。

在家庭实验室里弄坏系统是免费的。你现在弄坏了,生产环境就没机会再犯一遍——这是这套 220 美元的玩具唯一比生产环境值钱的地方:它允许你犯错的代价极低。所以有人问我该不该照这个配置搭一套跑业务,我的回答还是那句话:先用它把自己弄坏,学费交完了,再想别的。

本期缴税:一次"升完再说"换来六小时恢复。下次见。

阿舟
阿舟

写代码写到一半开始怀疑人生,靠 AI 工具续命,顺手把踩过的坑都记下来。

查看主页 →