kgateway e2e 测试负载均衡实践:基于 GitHub Actions 矩阵的集群分片调度
API网关云原生微服务【免费下载链接】kgatewayThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/kg/kgateway点击查看免费下载导读kgateway 的端到端e2e测试需要在真实运行的 Kubernetes 集群上执行如果只用一个集群串行跑完全部测试CI 流水线会耗时漫长。为了最大化硬件利用效率kgateway 将全部 e2e 测试按运行时长负载均衡到一批 Kubernetes 集群上并通过 GitHub Actions 矩阵.github/workflows/e2e.yaml统一编排。读完本文你将掌握 kgateway 的集群分片调度策略cattle, not pets、分片覆盖率的自动校验机制、何时及如何重新平衡测试分片以及如何为新增测试选择合适的集群。背景为什么需要对 e2e 测试做负载均衡目标高效利用 CI 硬件kgateway 的每个端到端测试都运行在一个真实的 Kubernetes 集群上例如由kind或k3d临时创建的测试集群。如果所有测试都集中到单个集群上且串行执行那么CI 流水线总耗时等于全部测试耗时之和随着测试套件持续增长合并门槛的等待时间会越来越长单个集群一旦被某类重负载测试占用其他轻量测试只能排队等待硬件资源严重闲置。因此 kgateway 在 CI 中引入测试负载均衡将测试拆分成多个分片shard每个分片由一个独立的集群并行执行让一批集群的总体运行时间趋于一致从而最大化 CI 硬件的吞吐效率。这一目标在 .github/workflows/e2e.yaml 的注释中也有明确表述——项目为端到端测试设置了30 分钟的上限阈值负载均衡的目的就是让 PR 上的测试能快速迭代一旦某个集群超时就需要重新平衡分片详见该文件matrix.test前的注释。旧策略按领域分组扩展性差kgateway 过去的做法是按领域domain对测试分组例如把所有路由类测试放一组、所有安全类测试放另一组。这个策略存在天然缺陷不同领域的测试数量差异很大热门领域如路由、认证测试量大冷门领域测试量小结果就是有些测试集群跑完一轮需要的时间是其他集群的两倍集群之间负载严重失衡硬件浪费明显。也就是说按领域分组只保证了同类测试在一起却没有保证每个集群耗时相近无法随着测试总量增长而平滑扩展。现行策略按运行时长分组把集群当牲畜kgateway 当前的做法是按运行时长runtime对测试分组而不是按领域把跑得快的测试和跑得慢的测试按实测时长大致均分到各个集群使每个分片的整体运行时间尽量接近测试在集群之间可以方便地迁移不会因为领域归属而绑定在某个集群上。这正是 Kubernetes 社区名言cattle, not pets把集群当牲畜而非宠物在测试编排上的体现——任何一个集群都是可替换的、临时的资源测试分片可以在集群之间自由流动集群被删除或重建都不会影响测试的组织结构。分组的具体定义全部收敛在GitHub Actions 矩阵中.github/workflows/e2e.yaml。这样做的关键好处是把负载均衡的复杂度完全隔离在 CI 流水线内不打扰本地开发。本地开发者跑测试时根本不需要关心分片归属只需按 README-e2e-framework.md 中描述的方式如./hack/run-e2e-test.sh SessionPersistence直接运行即可。分片的真相来源GitHub Actions 矩阵负载均衡的全部编排逻辑都落在end_to_end_tests作业的strategy.matrix.test列表中。矩阵中的每一项代表一个独立集群核心字段包括字段作用示例cluster-name集群唯一标识用于创建 kind/k3d 集群并命名产物cluster-one、cluster-upgradego-test-args传给go test的参数通常为超时上限-timeout25m、-timeout5mgo-test-run-regex该集群要执行的测试的-run正则多个测试用\|分隔^TestKgateway$$/^BasicRouting$$\|...localstack是否启动 localstackAWS 相关测试需要如 Lambda、EC2true/falseordered-ads是否启用有序 ADS 通道true/falsegateway-api-version指定使用的 Gateway API 版本用于升级类测试v1.5.1每个集群定义上方都注释了该分片最近一次 CI 运行时的实测耗时如May 29, 2026: ~9 minutes这些注释正是后续重新平衡时文档化新旧结果的依据。截至当前仓库矩阵共定义了10 个集群cluster-one约 9 分钟BasicRouting、PathMatching、HTTPRouteServices、TLSRouteServices、GRPCRouteServices、SessionPersistencecluster-two约 13 分钟TestKgatewayWaypointWaypoint 全量套件cluster-three约 10 分钟DynamicForwardProxy、Lambda、EC2、AccessLog、LocalRateLimit、Cors、BackendConfigPolicy、ListenerPolicy、Tracing、DirectResponse、AdminServer、FaultInjection并启用localstack: truecluster-four约 8 分钟ExtProc、ExtAuth、PolicySelector、Backends、BackendTLSPolicies、CSRF、AutoHostRewrite、LeaderElection、Compression、GlobalRateLimit、InternalRedirect、TestCustomGWPcluster-five约 10 分钟TimeoutRetry、HeaderModifiers、RBAC、HttpACL、APIKeyAuth、Deployer、Transforms、TestRouteReplacement、RouteDelegation、JWT、BasicAuth、WebSocketcluster-six约 10 分钟TestListenerSet、TCPRouteServices、TestKgatewayIstioAutoMtls、TestZeroDowntimeRollout并启用ordered-ads: truecluster-seven约 4 分钟TestAPIValidation、OAuth、TrafficPolicyStatus、XdsStarvation、XdsIdentityRace显式设置ordered-ads: falsecluster-eight约 5 分钟TestKgatewayMetrics、TestControlPlaneTLS、FrontendTLScluster-multi-install约 4 分钟TestMultipleInstalls单独设置-timeout5mcluster-upgrade约 6 分钟TestUpgrade并固定gateway-api-version: v1.5.1——注释明确警告不要往这个集群加测试因为它运行的是旧版 Gateway API只应在升级时按 n-1 版本同步。矩阵中go-test-run-regex里的$$是Make 对字面量$的转义正则最终会经 Makefile 传给go test -run实际等价于$。整个正则采用^TestKgateway$$/^BasicRouting$$这种多级锚定写法把顶层测试函数TestKgateway与套件级子测试BasicRouting逐段精确锁定避免误匹配同名或前缀相同的测试。在流水线执行时每个矩阵项都会复用.github/actions/kubernetes-e2e-tests/action.yaml这个 composite action由其把run-regex与test-args拼装成GO_TEST_USER_ARGS并执行make e2e-testaction.yaml。对应的 Makefile 目标为e2e-test: go-test最终通过 gotestsum 携带-tagse2e运行./test/e2e/tests包见 Makefile 与 Makefile。自动化防线TestAllE2ETestsInShards校验分片覆盖率负载均衡策略要长期可靠前提是每个测试都至少被一个分片覆盖。如果新增测试后忘了把它加进矩阵CI 里会永远跑不到它——这正是 kgateway 用单测来约束 CI 配置的原因。TestAllE2ETestsInShards位于 test/e2e/tests/shards_test.go会在 PR 检查中自动验证每一个注册的 e2e 测试都至少被e2e.yaml中的一个 shard 正则覆盖凡是没被覆盖的测试都会在测试失败信息里列出来并提示更新.github/workflows/e2e.yaml以包含这些测试。其实现链路从源码结构看分四步发现测试路径discoverE2ETestPaths扫描test/e2e/tests/下所有带//go:build e2e构建标签的 Go 文件用正则解析出顶层Test*函数、套件 runner 调用如SuiteRunner().Run(以及子包委托调用如kgateway.Run(t, ...)再结合各套件内的静态字符串.Register(SuiteName, ...)调用生成形如TestKgateway/JWT的完整测试路径列表。解析工作流配置parseE2EWorkflowPaths读取../../../.github/workflows/e2e.yaml反序列化到workflowConfig结构体提取每个作业矩阵项里的go-test-run-regex并按|切分得到所有正则备选。正则转路径regexToShardPath将^TestKgateway$$/^JWT$$这种含 Make 转义的正则还原为字面量拆分成{topLevel: TestKgateway, suite: JWT}结构。覆盖率判定isCoveredByShardPaths检查测试路径与分片条目的匹配关系——顶层函数套件精确匹配算覆盖某个分片条目只锚定了顶层函数无套件限定时表示整个函数及其所有子测试都被覆盖shards_test.go。此外该测试还维护了一张豁免清单e2eTestsNotRequiredInPRShards列出那些不需要出现在 PR 分片里的测试及其原因shards_test.goTestKgateway/AttachedRoutes在专门的 nightly 负载测试工作流中运行TestKgateway/StrictChurn、TestKgateway/XdsCost、TestKgateway/XdsFleet均为 opt-in 的压力/成本基准测试分别通过make run-load-tests-strict-churn、make run-xds-cost-bench、make run-xds-fleet-bench按需运行见 MakefileTestZoneAwareRouting需要多可用区、多 worker 的 kind 集群按 hack/kind/setup-zone-aware-routing.sh 手动运行。这些套件的注册代码位于 test/e2e/tests/kgateway/suite_runner.go例如Deployer、Lambda、SessionPersistence等慢速测试集中注册在前BasicRouting、ExtAuth、JWT等快速测试注册在后StrictChurn、XdsCost、XdsFleet三个套件会改动 controller Deployment因此被环境变量如KGW_ENABLE_STRICT_CHURN硬性门控避免被宽泛的正则如 nightly 的^TestKgateway隐式触发。分片矩阵正是针对这些套件名逐一锚定正则的。重新平衡Re-Balancing什么情况下需要重新平衡重新平衡测试分片被刻意设计成非常简单的动作——它不常发生但发生时应能轻松完成。以下两种情况触发一个集群上的测试远早于另一个集群完成说明分片之间负载失衡慢集群拖累了整体流水线所有集群都已耗尽需要引入新集群说明测试总量增长到现有分片无法容纳或单个分片时长逼近 30 分钟上限。操作步骤按原文档的流程重新平衡共四步审查最近的 CI 结果确定可以迁移的测试从 GitHub Actions 的Run ././github/actions/kubernetes-e2e-tests步骤耗时中找出各分片的实际运行时间这也是矩阵注释里统一采用的标准——使用 GitHub Action 步骤时间而非go test时间或整个 job 时间因为它更容易采集且相当稳定调整 .github/workflows/e2e.yaml 中被调用的 run 函数即修改对应集群项的go-test-run-regex把选中的测试从超载集群的正则中移除、追加到欠载集群的正则中在运行测试的矩阵上文档化新的结果将迁移后各集群的实测耗时更新到矩阵定义上方的注释里保持每个分片时长信息的时效性开 PR并在 PR 描述中清晰记录变更前后的结果让评审者能直观看到负载均衡的效果对比哪个集群从多少分钟降到多少分钟。值得注意的是原文档步骤编号中有个笔误两个第 4 步实际操作以更新注释 → 开 PR 记录前后结果为完整闭环即可。新增测试如何选择目标集群当你想往 kgateway 的 e2e 测试套件里加入一个新的测试套件时负载均衡要求你做一次按耗时归档查看最近合并 PR 的 Kubernetes 测试 action 结果确认当前各分片的实际运行时长找出运行时长最低的集群即耗时最短、最有余量的分片把你的测试套件加入该集群在 .github/workflows/e2e.yaml 中的定义把套件名追加到该集群的go-test-run-regex中用|分隔并按^TestKgateway$$/^YourSuite$$的格式锚定。同时README-e2e-framework.md 还补充了两条配套纪律新测试应加入所有 PR 都会运行的Kubernetes Tests即 e2e.yaml以保证 PR 运行与 nightly 运行之间的覆盖一致性加入列表时更新对应测试的日期与时长注释确保分片负载数据不陈旧唯一的例外是 Upgrade 测试——它不运行在 main 分支上而是运行在全部 LTS 分支上。新增套件的代码侧步骤在 features 目录下建子目录、在testdata/放清单、定义suite.go并通过Register(SuiteName, ...)注册、再由顶层测试函数委托执行详见 README-e2e-framework.md这里不再展开。分片之外的验证夜间测试与负载测试PR 矩阵并非 e2e 验证的全部。除了 PR 分片kgateway 还通过 .github/workflows/nightly-tests.yaml 在每天 05:00 UTC 对main及每个受支持的 LTS 分支执行更广的验证Conformance针对 experimental 与 standard 两个 Gateway API 通道分别在最大/最小版本组合上运行上游 Gateway API 一致性套件Load Tests运行kube_gateway_api_load_tests作业E2E使用一条宽泛的正则^TestKgateway|^TestAPIValidation|^TestListenerSet|...在 4 个 Gateway API 版本 × 2 个通道上跑全量 e2e这与 PR 分片的精确锚定正则形成互补——分片正则负责把测试精确分配到集群而夜间全量正则负责兜底验证。之所以 PR 分片能精确到套件级别而不怕漏测正是因为TestAllE2ETestsInShards这条单测防线会在 PR 阶段强制每个测试至少命中一个分片正则。对于StrictChurn、XdsCost等 opt-in 负载测试则通过make run-load-tests-strict-churn等 Make 目标在夜间负载测试通道中显式执行不进入 PR 分片。本地开发不受影响负载均衡的复杂度被隔离在 CI 层本地开发者的体验保持不变。无论是按套件运行还是按单个测试方法运行都可以直接使用 hack/run-e2e-test.sh# 运行整个套件默认失败时保留现场便于调试 ./hack/run-e2e-test.sh SessionPersistence # 运行套件内的某个测试方法 ./hack/run-e2e-test.sh TestCookieSessionPersistence # 运行顶层测试函数 ./hack/run-e2e-test.sh TestKgateway # 跳过已有集群上的安装步骤加快本地迭代 PERSIST_INSTALLtrue ./hack/run-e2e-test.sh SessionPersistence # 列出所有可用的测试套件与顶层测试 ./hack/run-e2e-test.sh --list该脚本会通过git grep自动把测试名解析成最精确的go test -run正则套件解析为^TestKgateway$/^SessionPersistence$这种多级锚定形式因此本地跑单个测试时使用的正则语义与 CI 矩阵完全一致。更多手动运行方式如直接go test -tagse2e -run ^TestKgateway$ ./test/e2e/tests可参考 README-e2e-framework.md。小结kgateway 的 e2e 测试负载均衡是一条配置即真相 测试守护配置的工程闭环策略按运行时长而非领域分组让每个集群耗时相近集群可替换、可增删cattle, not pets载体所有分片定义在 .github/workflows/e2e.yaml 的 Actions 矩阵中复杂度与本地开发彻底隔离防线TestAllE2ETestsInShards单测test/e2e/tests/shards_test.go自动校验每个测试都命中至少一个分片正则杜绝新增测试悄悄漏出 CI流程重新平衡和新增测试都有明确、轻量的操作步骤且要求把前后耗时文档化在矩阵注释与 PR 描述中。如果你正在为 kgateway 贡献 e2e 测试或希望在自己项目的 CI 中引入类似的多集群分片调度这套按耗时分组 配置校验自动化的模式可以直接借鉴。赞分享API网关云原生微服务【免费下载链接】kgatewayThe Cloud-Native API Gateway and AI Gateway项目地址https://gitcode.com/gh_mirrors/kg/kgateway点击查看免费下载相关推荐Dear ImGui终极指南5分钟打造专业C图形界面Dear ImGui终极指南5分钟打造专业C图形界面 你是否厌倦了复杂的GUI框架和繁琐的界面设计Dear ImGui为你提供了一个轻量级、无依赖的CUI组件前端桌面应用图形学kgateway高可用部署多集群与负载均衡配置kgateway高可用部署多集群与负载均衡配置 Kgateway作为云原生API网关和AI网关其高可用部署配置对于企业级应用至关重要。本文将详细介绍如何通过API网关云原生微服务Kue Redis 集群性能调优分片与负载均衡配置Kue Redis 集群性能调优分片与负载均衡配置 你是否正面临 Kue 任务队列在高并发场景下的性能瓶颈随着业务增长单节点 Redis 已无法满足大规模任务调度后端消息队列上一篇MXNet 入门第一课用 NP on MXNet 操作 ndarray 数据下一篇Roc 快照回归测试深度解析嵌套绑定多次引用顶层值时不再误报 self-assignmentissue 9635创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Go GMP 调度器:从 G/M/P 三色模型到抢占式调度全景

Go GMP 调度器:从 G/M/P 三色模型到抢占式调度全景

Go GMP 调度器:从 G/M/P 三色模型到抢占式调度全景goroutine 看起来轻量,背后却是一套精密的 GMP 调度系统。理解 M/P/G 三色模型,能让你写出不再"看似并发但串行执行"的 bug。一、GMP 是什么? G(goroutine&…

2026/10/12 3:47:17 阅读更多 →
Gin框架跨域CORS中间件原理与精细粒度控制实战

Gin框架跨域CORS中间件原理与精细粒度控制实战

Gin框架跨域CORS中间件原理与精细粒度控制实战 导语 前后端分离架构下,CORS(跨域资源共享)是每个后端开发者绕不开的话题。很多开发者只是无脑添加Access-Control-Allow-Origin: *,却不知道这背后隐藏的安全风险和精细控制方法。本…

2026/10/12 3:47:17 阅读更多 →
开源底层组件,为国产算力夯实大模型训练地基

开源底层组件,为国产算力夯实大模型训练地基

最近开源圈里聊得最凶的一件事,不是某个新模型刷了榜单,而是某头部开源大模型团队闷声放出了一批底层基础组件。乍一看标题写的是“致敬,最新开源的不是模型”,我一开始也以为又是发了个模型权重,结果点进去发现满屏都…

2026/10/12 3:46:16 阅读更多 →

最新新闻

llama.cpp与GGUF:本地大模型部署实战指南

llama.cpp与GGUF:本地大模型部署实战指南

在本地大模型这个圈子里,llama.cpp 和 GGUF 这两个词几乎是一起出现的。前者是那个负责把所有计算跑起来的 C 推理引擎,后者是它最通用的模型载体格式。有人把这种组合叫“裸引擎”——没有花哨界面、没有一键安装、没有一个完整对话产品该有的外壳&…

2026/10/12 4:40:47 阅读更多 →
AI功能验收流程:从92次无效请求到可量化交付

AI功能验收流程:从92次无效请求到可量化交付

1. 项目概述:当验收流程成为AI落地的最大瓶颈“92 次请求烧掉 1340 万 token”——这个标题不是夸张修辞,而是某次真实交付现场的后台日志快照。它背后没有模型崩塌、没有GPU宕机、没有API限流,只有一套看似标准却漏洞百出的验收流程&#xf…

2026/10/12 4:40:47 阅读更多 →
软件测试实验室申请CNAS/CMA资质:20万到50万预算全拆解与省钱指南

软件测试实验室申请CNAS/CMA资质:20万到50万预算全拆解与省钱指南

前几天一位做软件测试团队管理的朋友找我,说领导让他们实验室准备申请CNAS/CMA资质,让他三天内交一份费用预算清单,预算区间、花钱节奏、隐性成本都要讲清楚。这个问题我前前后后帮好几个团队做过测算,几乎每次聊到最后大家都会发…

2026/10/12 4:40:47 阅读更多 →
用披萨尺寸预测价格:Python+sklearn 线性回归完整实战指南

用披萨尺寸预测价格:Python+sklearn 线性回归完整实战指南

1. 为什么拿披萨价格练线性回归:从需求到模型的一整条链路如果你刚开始接触机器学习,第一个算法十有八九会遇到线性回归。市面上的教程喜欢拿房价、股票、销量来举例,动辄几十个特征、上万条样本,结果新手连数据长什么样都没搞明白…

2026/10/12 4:40:47 阅读更多 →
研发人专利署名困境:用中国专利.skill构建贡献证据链

研发人专利署名困境:用中国专利.skill构建贡献证据链

1. 研发人的署名困境:为什么你的代码变成了别人的专利干了七八年研发,代码写了无数行,架构图改了几十版,结果年底一看专利公示,发明人栏里赫然列着产品经理、项目经理甚至行政主管的名字,唯独没有你这个真正…

2026/10/12 4:40:47 阅读更多 →
VSC 好用插件推荐:用 TaoToken 统一 Key 打通 Cline MCP 与 Codex auth.json

VSC 好用插件推荐:用 TaoToken 统一 Key 打通 Cline MCP 与 Codex auth.json

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:39:47 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →