嵌入式容器化:资源受限设备轻量运行K8s
|
跟老板拍账单。去年端午,IDC那台老边缘网关突然吐核——不是OOM,是cgroup v1在arm64上那个经典bug:memcg oom killer杀错了进程树根,把systemd-journald干掉,日志断流三十七分钟,监控大屏右下角那个“设备在线率”数字就那么挂在那里,一动不动。老板微信弹窗跳出来的时候,我正盯着咖啡杯上印的“EdgeOS Pro 2023 Edition”logo发愣,杯底还压着张没撕干净的采购比价单,上面有后端老张用红笔圈的三处参数偏差。 我说咱试试嵌入式容器化,轻量K8s跑在资源受限设备上。老板说好,你列个ROI。我当场掏出手机查了查云厂商最新报价单——算了,没算完,因为销售小王的电话来了,说他们新推的LiteCluster方案支持ARM SBC裸机直启,三分钟部署完带证书轮转。我嗯嗯啊啊应着,手还在调终端里那个purge脚本:先rm -rf /var/lib/kubelet/pods//volumes/,再kill -9 $(pgrep -f “kube-proxy.--proxy-mode=iptables”),最后才想起得touch /etc/kubernetes/manifests/kube-apiserver.yaml这个空文件骗static pod重启——就这三步,写了三百七十二条purge规则,其中三百六十九条压根没用过。 我原以为只要选对发行版+裁剪掉metrics-server和coredns就能稳,结果第一批灰度节点上线第七天,一个节点在凌晨三点二十一分开始疯狂上报PodFailed事件,查下来是kubelet读/etc/resolv.conf时被selinux策略拦了——但只拦了一半:DNS解析能走通,健康检查探针却卡在readline()系统调用里不返回。这个我敢打包票,因为抓包看它每十秒发一次SYN,但never收到ACK,tcpdump输出里那个seq号我抄在便利贴上,现在还贴在工位隔板右下角第三格,字迹被咖啡洇开一小片。
文章配图,仅供参考 优胜劣汰?可不是客气话。你放十个边缘盒子上去,三个月不到自动筛掉七个:两个烧了eMMC缓存分区,三个因NTP漂移超阈值被自动驱逐出集群,还有一个根本没进NodeReady状态,就一直在NotReady: KubeletNotReady, runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized——可它的CNI配置文件我亲眼看着deploy进去的。这台机器面板灯是常亮绿,但节点分布图上有一个无关的小红点,标着“unknown health”,没人动它,也没人问,就一直挂着。跨厂商对比这事我没往下推。不是不想,是去年九月刚换过一批飞腾平台,某家厂商提供的containerd镜像里硬编译进了自家遥测模块,启动时默认连他们后台打心跳,而我们网络策略是默认deny outbound——kubelet卡在initContainer那里,log只打印半行:“starting containerd…”,后面那个句号后面永远没内容。运维小刘去倒水回来发现这事,顺手把iptables链里加了临时放行,后来忘了删。这个我说不准是不是他们故意埋的,但我知道他加完rule那会儿,监控大屏上另一个无关指标——“北向API平均延迟”——抖了一下,从八百二十毫秒跳到一千零三,又回落,持续十九秒。 所以别信什么“轻量即可靠”。K3s、MicroK8s、KubeAdm on ARM、RKE2——全试过。它们在树莓派4B上跑得都挺欢,但在工业级宽温箱里,一个-25℃冷凝水结露周期下来,SD卡物理坏块率就升两档,而kubelet根本不校验/var/lib/kubelet/device-plugins/.plugin-registration目录下的socket文件是否存在,只管读。于是node-problem-detector根本收不到设备离线信号,调度器还继续往这台“活着”的节点上dispatch任务。我们最终靠一个cron脚本每五分钟扫一次ls -l /dev/serial/by-path/的输出长度变化来兜底——这玩意儿连Kubernetes官网Issue列表里都没人提,因为它根本不算bug,只是现实没按yaml写。 KPI折算这事最近又翻出来了。去年Q3考核边缘集群可用率,要求99.95%,我们实际算出来是99.948%,差0.002%——按SLA罚则,扣了十八万服务费。财务大姐把发票复印件甩我桌上时,说这数太难看了,建议把那三台纯做防火墙转发的边缘盒子也纳进统计池子,“反正它们也装着kubelet”。我说行,但她转身就忘,后来我在她工位左边第三个抽屉里看到半张没盖章的补充协议草稿,铅笔写的,下面画着波浪线,写着“注:含非业务节点(见附件1)”。附件1就是我随手拍的三台盒子照片,其中一张背景里有个路由器指示灯在闪,蓝绿色交替,节奏不对,应该是电源模块轻微震荡。 现在每天早八点,我手动run一遍那个check-node-health.sh——它不做任何修复,只grep journalctl -u kubelet | tail -200里有没有“context deadline exceeded”字样。有就邮件抄送运维组所有人,标题写“【今日份淘汰预备】”,正文空着。三年来发了四百一十二封,打开率百分之七,点击率百分之零点三。但上周五,后端老张回了我一封,就一行:“今天那台新上架的RK3566盒子,boot log里少了一行device tree overlay加载记录,我改了dtbo路径,你等等看会不会进Ready。”我回了个“????”,其实没等,直接ssh过去exec了个kubectl get nodes -o wide,它已经显示Ready了。这事儿我谁都没说。 所以优胜劣汰是真的——不是设计出来的,是被热胀冷缩、批次差异、固件坑、销售话术和采购比价表联合执行的。我不打算再推新版本了,这周把最后一台x86_64架构的旧边缘节点替换成ARM,然后停掉所有kubeadm自启服务,改用systemd-unit直接拉起podman run。至于kubelet……留着,但把它改成只读模式,连API server都不连,就让它守着那堆/var/lib/kubelet/pods目录,当个本地状态快照存档员。你要问为啥?我泡了杯新茶,茶包是去年技术峰会发的,印着“Hybrid Cloud Forward 2022”,边喝边删掉了purge脚本里第一百零七行,那行是用来清etcd wal日志的,早就不需要了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


嵌入式开发:逻辑清晰代码助调试提效70%
嵌入式Linux开发者Unix环境搭建避坑指南