动态资源调度优化:9年自动化实战全链路复盘
|
去年11月份,我蹲在三号机房第三排右数第七台服务器柜子后面——就是那个散热口总往外喷热风、贴了三张“请勿遮挡”胶带但没人理的那台——调试调度器策略回滚逻辑。当时窗外下着雨,不是那种淅淅沥沥的,是闷着头往下砸的,玻璃上全是水痕,歪斜地把LED屏上的Pod状态灯拉成一道道拖影。老张蹲在我左边,正用指甲刮他工牌背面干掉的咖啡渍,刮一下,抬眼盯一眼Kibana里ResourcePressure那个毛刺图。我没说话,他就突然开口:“你这优先级队列,是不是把spot实例的evictable标签当成硬约束了?” 我原以为只是调度延时高一点,结果跑通第一个混沌实验才发现:它真能把一个本该保活的测试集群,连同里面跑着的Selenium Grid主节点和三台Chrome容器,一起扔进TerminatePool——就因为那个节点label里混进了条临时打上去的"env=staging-bak"。我们没删,它自己就当真了。这个我敢打包票:那天凌晨两点十七分,我抓包截的调度器决策日志里,第四行写着"reason: tag_conflict_eviction_score=0.932",后头跟着个换行,再后头空了三行,才继续打印pod name。空三行啊,不是bug,是它自己缓了缓神。 优胜劣汰?对。但这“汰”字儿,不是按CPU、内存、IO吞吐来划线的,是按谁先在etcd里改完Annotation、谁后删的Taint、谁在CI脚本里多敲了一个空格、谁的Git commit message里带了中文顿号……来的。你写了个“调度公平性增强”,发布后三小时,QA组小林直接在钉钉群里发了个截图:二十台Windows VM,十四台卡在Starting状态,六台在Running,而其中一台Running的,是唯一被标记为deprecated的旧镜像——因为它那个镜像tag里的日期字符串,比新镜像少一位数字,所以sort的时候排前面。排序!就为了排个序!它宁可把deprecated的拉起来,也不等新版的Pull完成。 我盯着屏幕,手里捏着刚拆封的辣条包装袋,锡纸边儿戳得掌心痒。桌上那盒凉透的黄焖鸡米饭盖子掀着,汤浮了一层油花,映着监控屏上跳动的kube-scheduler日志。李工端着保温杯过来晃了一眼,说:“哎哟,又跟score算法较劲呢?”我没抬头,他也没走,就站那儿嘬了一口枸杞水,杯底磕在桌面,“嗒”一声。他左手无名指第二节有个旧烫伤疤,小时候被灶台铁圈烫的——我见过三次,每次他端杯子都显出来。
文章配图,仅供参考 你猜那个“优胜”靠什么胜?靠谁的Operator重试间隔设得短,靠谁在PreStop里塞了sleep 2而不是sleep 1,靠谁家CI pipeline里没加set -e——就这么点东西。我亲眼见过两个一模一样的NodePool,配置Diff过十二次,yaml diff干干净净,最后发现胜出的那个,是因为它的AWS Launch Template里UserData末尾多了一个看不见的Unicode零宽空格(U+200B),导致AMI启动时早0.8秒加载了cloud-init配置,从而早1.3秒注册进Cluster——这一秒半,够调度器给它多打三个亲和性权重分。我说不准这个值怎么算出来的,文档没写,代码注释里只有一句“see RFC-9999bis Appendix G (NOT PUBLISHED)”。不编,真这么写的。 上个月我把所有自研调度插件全打上v3.7-alpha标记,丢进测试环境裸跑。三天后运维小王打电话来说,生产环境灰度区某批ECS实例开始自发重组拓扑结构,就像鱼群绕过障碍物一样绕开了某个AZ的延迟尖峰。我查了整整两天日志,最后发现不是插件干的,是kubectl set env --overwrite 命令在批量操作时,偶发触发了APIServer里一个未公开的watch event merge机制,让几个节点的状态更新被压进同一个event batch,结果调度器误判为“集群拓扑发生结构性变化”。我盯着那段合并后的JSON,中间有行字段叫"merge_sequence_hint",值是"maybe_consistent"。就这词儿。maybe。 那天收工早,六点半。走出大楼看见物业老刘在门口修自动门感应器,蹲着,扳手夹在左腋下,右手正往电路板上滴焊锡,一股松香味混着初冬的湿气往上飘。他见我出来,头也不抬,说:“今天焊了四次,第三次才亮绿灯。”我没接话,只点了点头。雨停了,但地上积水还没散,倒影里路灯是断的,一截一截,漂着。 我不信动态调度能“智能”,它只是比人更擅长记住所有它曾经错过的坑,并且把每个坑都转化成一条新的score rule。但人忘得快,它不会。所以它越优化,越像个收集癖晚期患者——柜子里塞满标本瓶,每只瓶上贴着“曾导致CI失败#1882”的纸条,可下次失败还是#1883,因为瓶盖没拧紧。我今早删了七百二十三行评分逻辑,保留了三处硬编码阈值,其中两处注释写着“勿动,除非你想复现2022年Q3黑天鹅事件”。第三处……第三处我自己都忘了当初为什么写上去的。明天找时间看吧。或者后天。反正它现在还能跑。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


精通语言、函数与变量:自动化测试提效之钥
站长别再单打独斗:媒体融合需自动化运营重构
源码到执行全链路硬核优化完成
Go站长聚会:全链路运维瓶颈实战打通
MySQL性能优化实战:慢查询到毫秒响应全链路突破