ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kubernetes SIG Node CI 子组 2021 年度工作记录:节点 e2e 测试的健康维护、Serial Lane 治理与测试基础设施演进

Kubernetes SIG Node CI 子组 2021 年度工作记录:节点 e2e 测试的健康维护、Serial Lane 治理与测试基础设施演进 Kubernetes SIG Node CI 子组 2021 年度工作记录节点 e2e 测试的健康维护、Serial Lane 治理与测试基础设施演进【免费下载链接】communityKubernetes Community Documentation项目地址: https://gitcode.com/GitHub_Trending/com/communitySIG Node CIContinuous Integration子组是 Kubernetes 社区中专门负责维护节点端到端node e2e测试质量的技术小组本文基于其在 2021 年全年的会议记录见 ci-subgroup-notes-2021.md系统梳理该年度的工作主线从 Serial Lane 的反复治理、测试标记体系Serial / Flaky / Feature的规范化到 Kubetest2 迁移、NodeConformance 命名讨论、COS 与 containerd 镜像支持等基础设施演进。读完本文你将理解 Kubernetes 节点测试矩阵是如何被维护到绿灯状态的以及社区如何通过 triage、去 flake、资源优化等手段持续保障 kubelet 等节点组件的代码质量。一、子组背景为什么需要专门的 CI 子组SIG Node 拥有 Kubernetes 中最庞大、最关键的组件集合——kubelet、容器运行时接口CRI、节点资源管理等这些组件的正确性直接决定集群中 Pod 与宿主机资源的交互是否可靠。随着每日大量 PR 合入、OS 发行版持续更新节点 e2e 测试的维护难度急剧上升。为此SIG Node 社区于 2020 年 7 月 24 日发起成立 CI 测试子组其章程见 sig-node-ci-testing-group-charter.md核心使命包括维护现有 node e2e 测试的健康度及时 triage 并修复失败测试尤其是 release-blocking 测试移除已废弃的测试完善故障排查工具与文档提升测试代码质量识别并减少 flaky 行为审查新增 e2e 测试代码提升测试覆盖率识别缺失覆盖的领域推动补充 e2e 测试OS 镜像与依赖支持确保代表性 OS 镜像与容器运行时版本持续被测试测试资源利用与成本优化提高测试 ROI合理利用各云厂商的测试额度关键 bug 的及时响应定期 triage、识别关键问题并在每次发布前复审高优先级 bug。子组的例会即Weekly CI/Triage Meeting在 sig-node/README.md 中有明确登记。2021 年会议记录显示例会最初为周一举行后因时间冲突频繁成员通过 doodle 投票评估调整最终于 2021 年 12 月达成共识取消周四的备用时间仅保留周三例会对应社区 PR #6285理由是备用时间出勤率持续偏低。这一决策过程本身也反映了社区对会议效率的务实管理。二、Serial Lane 治理2021 年的头号战场贯穿 2021 全年会议记录的核心议题是node-kubelet-serial这条串行测试通道TestGrid 面板sig-node-kubelet#node-kubelet-serial的稳定性。所谓 Serial lane即必须串行执行、不能与其他测试并行跑的一批用例如 CPU manager、hugepages、内存压力、设备插件等涉及节点全局状态的测试。2.1 为什么 serial 测试总是出问题从会议记录可以归纳出 serial lane 反复不稳定的几类根因超时与 OOM2021 年 3 月的记录显示 serial job 因 OOM 导致超时Pod 被杀死后连日志都无法收集成员被迫将实例内存提升到 2GB 并上传kern.log分析隐式依赖节点状态如 memory manager 测试隐式依赖内存碎片化程度ContainerRuntimeRestart 测试的本意就是把节点用 Pod 塞满这类测试天然容易产生假阴性GPU 等特殊硬件依赖serial lane 中的 GPU 测试反复失败社区最终达成共识——不应在常规 serial lane 中用真实 GPU特殊硬件跑测试转而通过专门 PR 降低对 GPU 的依赖DynamicKubeletConfig 的不可靠性该特性测试占据了 serial lane 绝大部分耗时有记录显示含该特性时 serial lane 约需 3 小时去掉后约 1 小时且 flake 常源于 kubelet 不重启或特性本身不稳定最终推动其在 1.23 版本废弃。2.2 治理手段标记、拆分与移除针对上述问题社区采取的组合拳是使用测试标记隔离问题用例将已知失败用例标记为[Flaky]使 lane 尽快恢复绿色再逐个去 flake。例如 7 月 28 日的记录明确mark known failures in serial tests as Flaky so we can try to get the job green拆分过大的 serial 任务6 月的讨论指出一个巨型 serial 测试太多了应该拆分并专门为 eviction驱逐测试建立独立跟踪 issue还涉及提升 open files 限制的 PR把失败用例移出 serial lane11 月 24 日记录显示部分测试因所有修复都依赖 1.23 backport决定将这些测试从 serial lane 移除等到下个版本修复后再加回为需要特殊配置的测试单独建 laneLock contention 测试由于需要特殊配置讨论后决定添加[Special]标记并确保features不会误拾取[Special]标签同时配置--skip\[Flaky\]|\[Serial\]的过滤规则。到 12 月 1 日会议记录终于写下了标志性的一行Serial lane is green!!!——这是整个 2021 年 serial lane 治理成果的直接体现。三、测试标记体系Kubernetes e2e 的组织语言serial lane 治理过程中频繁出现的[Serial]、[Flaky]、[Feature:*]、[NodeFeature:*]等标记是理解 Kubernetes e2e 测试矩阵的钥匙。社区维护了完整的标记规范文档contributors/devel/sig-testing/e2e-tests.mdKinds of tests一节。2021 年会议记录中与之相关的关键动作包括NodeFeature → Feature 标记迁移对应 k/k issue #942892021 年 6 月起社区着手移除NodeFeature:标记、统一改用Feature:标记需要同时在 test-infra 和 kubernetes/kubernetes 两处同步更新标签由 Mike Miranda 主导先在 test-infra 中复制选择器、再修改测试本身Conformance 标记合规性审查7 月 21 日记录指出sysctle2e 测试test/e2e/common/node/sysctl.go虽被标记为 conformance却不满足 conformance 测试要求——它使用了非 GA 的sysctlfeature且无法在所有 provider如 Windows上运行因此需要修正标记FOCUS / SKIP 过滤规则节点测试的运行方式在 e2e-node-tests.md 中有详细说明例如ci-kubernetes-node-kubelet任务使用--focus\[NodeConformance\] --skip\[Flaky\]|\[Serial\]本地复现时可通过make test-e2e-node FOCUS... SKIP...传入同样的正则。这些标记体系是社区在 2021 年反复打磨的对象其规范化直接降低了 flake 对 CI 信号的污染。四、Kubetest2 迁移测试执行引擎的换代2021 年 9 月 29 日和 10 月 6 日的会议专门安排了对Kubetest2迁移计划的深度讨论对应 enhancements issue #2464。背景与要点如下当时 Prow job 的第一层镜像上打包了大量旧工具这些工具从 bash 脚本演化而来已经难以维护Kubetest2 被设计为可扩展的替代品可在何处测试GCE、AWS、Kind 等与测试什么kubetest2 的 tester 插件都可通过插件机制配置迁移优先级明确先迁移 presubmits 与 release-blocking jobs目标版本是 1.24其他 job 无明确时间表对 node e2e 而言最重要的变化是kubetest2 将以 makefile 作为事实来源source of truthmake test-e2e-node即成为标准执行入口开发者此后基本无需再直接处理 test infra只有在遇到 bug 时才需要介入会议结论社区成员的新 feature 需求应直接提给 kubetest2 项目。这一迁移是 2021 年 node e2e 测试基础设施层面最重要的演进与 e2e-node-tests.md 中make test-e2e-node的本地/远程运行方式一脉相承——后者正是节点测试以 makefile 为准思想的体现。五、NodeConformance命名之争与定位厘清NodeConformance 到底是什么是 2021 年多次会议的讨论主题。历史定位存在双重含义的冲突一组只需单个节点即可运行的 e2e 测试即test/e2e_node框架下的所有测试面向节点的类 conformance 测试。问题在于真正的 Conformance 需要完整集群而 NodeConformance 只需要 kubelet两者范围完全不同名称却极易混淆。7 月的 SIG-Architecture 讨论历史 issue #59001提出从名称中去掉 Conformance。会议中的具体方案包括对 CRI 相关的类 conformance 测试改用CRIValidationNodeAgnostic标记对只需单节点即可运行的 e2e 测试集合征集新名称候选如SingleNodeTest或KubeletLocal明确两类测试存在重叠需要制定拆分方案并公开征求意见。此外NodeConformance 还承担着作为presubmit 通道的职责运行在 PR 验证中而ci-kubernetes-node-kubelet-conformancejob 的持续失败最终通过删除未使用且失败的 jobtest-infra PR #22454解决相关失败 issue 由志愿者持续跟踪。六、镜像、运行时与特殊场景测试矩阵2021 年会议记录充分展示了 SIG Node 测试矩阵的广度与维护细节6.1 COS 镜像生命周期管理10 月 26 日记录指出cos-81-lts已停止支持建议将cos-stable1升级为cos-89-lts、cos-stable2升级为cos-93-lts。镜像选择直接影响节点测试的运行环境因此在测试 job 配置中维护准确的镜像版本是 CI 子组的日常职责。1 月还有将s/gci/cos/g的 tab 重命名工作test-infra PR #20351使名称与Container-Optimized OSCOS的官方命名对齐。6.2 containerd / CRI-O 覆盖containerd canaries 排障10 月 14 日containerd 1.4 canary 测试失败日志显示集群从未被创建节点操作全是 no-op需要确认测试是否预期集群预先存在containerd 1.5 分支缺失8 月 4 日记录到 1.5 分支 canary 缺失的问题image-config 文件管理12 月 15 日讨论将image-config移动为独立 job 配置对应jobs/e2e_node/swap/image-config-swap.yaml与jobs/e2e_node/containerd/containerd-release-1.5/image-config.yaml等并指出 hugepages 同样需要能同时包含两者的 init 配置CRI-O release-blocking job11 月 17 日确认当时没有 CRI-O 的等效 job讨论后决定在足够绿时把 containerd 与 CRI-O job 都加入 release-informing 行列对应 issue #24451node-kubelet-serial-containerd job 配置问题11 月 17 日containerd job 迁移到社区基础设施后存在配置问题被记为 bug 跟踪。6.3 swap 与内存压力测试swap 相关测试是 2021 年的新增长点10 月 20 日讨论将ci-kubernetes-node-kubelet-evictionjob 改为使用 swap对应 issue #105023 的讨论并担心当前 swap 配置在 COS 上是否可用参考了 crio 的crio_swap1g.ign配置10 月 14 日则专门讨论如何在启用 swap 的机器上跑测试以及 MemoryPressure 与 swap 的组合测试方法。对于本机开发e2e-node-tests.md 给出了配套方案工作站默认启用 swap 会导致 kubelet 拒绝启动可通过make test-e2e-node TEST_ARGS--kubelet-flags--fail-swap-onfalse放行。6.4 设备插件与特殊硬件测试7 月 21 日 fromani 的专题分享指出k8s e2e 套件中有相当多测试间接依赖 device manager而 CI 上没有设备插件支持导致大量测试在 CI 上被跳过serial lane 与资源管理领域尤其明显。社区讨论的候选方案包括使用 sample 插件、伪造 SRIOV 设备、直接用 GPU、或提升 CI 机器规格以配备 SRIOV 设备。11 月 11 日 danielle 的结论进一步明确了方向放弃对 GPU 的依赖以减少维护成本对应 PR #106348并指出设备测试与 GPU 测试原本以相同方式损坏只因[Flaky]标记而被掩盖。七、测试资源利用与成本优化8 月的两次会议聚焦于测试资源利用率的量化管理借助 Prow 的 Boskos 资源使用监控面板跟踪配额当时约使用 18 个项目结论直白而务实提高利用率的最好方式就是更少的测试 job 或更快的测试讨论了单测 job如kubelet-gce-e2e-lock-contention是否必要建议审计所有 sig-node 周期性任务并给出可合并/删除的清单对应 issue #23232孤儿 job同时运行 serial 与 conformance 测试准备通过 PR 跳过这两类测试以节省资源对应 PR #232958 月 12 日还提出了 TestGrid tab 整理计划把pr-*job 从 sig-node-kubelet tab 移到新的 sig-node-presubmits tab合并可整合的 tab如 sig-node-containerd 与 sig-node-containerd-io并移除 release-blocking jobs。八、基础设施迁移与 CI 信号8.1 迁移到 k8s-infra / 社区基础设施9 月起 Arnaud 主导将 Prow job 迁移到社区基础设施k8s-infra迁移范围包括sig-node-presubmits与sig-node-kubelet两个 TestGrid 面板下的 job从 GCP 项目迁移的项目包括k8s-jkns-pr-node-e2e、cri-containerd-node-e2e及存储桶gs://cri-containerd-testing通过创建带详细步骤的 issue 供新贡献者接手对应 issue #23822并以示例 PR 演示迁移方式。8.2 CI 信号与 burndown针对 release 周期的 CI 信号管理2021 年形成了固定的工作流Milestone burndown例会中反复跟踪milestone:v1.22、milestone:v1.23且带sig/node标签的 open issue 清单逐项推进release-blocking 测试跟踪7 月 8 日记录由 Release Team 跟踪的 4 个 CI 信号 flake含/stats/summary上报、Pod 生命周期、readiness gates、startupProbe 等用例每个都有独立 issue 编号便于追踪Bug triage board使用 GitHub project boardorgs/kubernetes/projects/59承载 bug triage目标是在每周 triage 会上规律性地分配新 bug并讨论过bug board 其他事项 board的双板结构测试失败邮件通知发现测试失败邮件未发送到主邮件列表视为疏漏并创建 GitHub task 跟踪。九、测试本地复现与诊断的工程实践会议记录中反复出现本地复现、上传日志、分析根因的工作模式这正是 e2e-node-tests.md 文档所支撑的流程本地运行make test-e2e-node会依次启动 etcd、kube-apiserver、kubelet执行 ginkgo 测试并输出结果运行前需具备 etcd、带 CRI 插件的 containerd、CNI 配置等前置条件远程运行make test-e2e-node REMOTEtrue会在 GCE 上创建实例、打包 ginkgo/kubelet/kube-apiserver/e2e_node.test 等二进制、执行后回传日志默认到/tmp/_artifacts/时间戳针对 flake 调试RUN_UNTIL_FAILUREtrue可让 ginkgo 持续运行直到失败用于稳定复现 flake并行度控制默认--nodes8可用PARALLELISM4调整日志标记技巧9 月 29 日记录给出了一条实用的 dry-run 命令——用 ginkgo 的 dryRun 模式输出测试清单并通过 sed 去除 ANSI 颜色码后落盘便于离线分析测试集./_output/local/go/bin/ginkgo --dryRun -v ./_output/local/go/bin/e2e_node.test | sed $s,\x1b\[[0-9;]*[a-zA-Z],,g ./tmp/e2e_node.test.txt测试内避免 klog.Fatalf8 月 4 日记录特别指出测试中不应调用 klog.Fatalf它会引发海量堆栈跟踪这是测试代码质量的明确约定。十、2021 年度关键成果回顾综合全年记录SIG Node CI 子组在 2021 年取得了以下可验证的成果Serial lane 恢复绿色通过标记隔离、拆分、移除与专项修复的组合手段于 12 月实现Serial lane is green测试标记规范化推进NodeFeature → Feature 迁移、conformance 标记合规审查、[Special]标记引入为后续测试矩阵管理奠定基础Kubetest2 迁移路线确立明确以 makefile 为事实来源、presubmit 与 release-blocking 优先的迁移计划NodeConformance 定位厘清推动名称与范围讨论为 CRIValidation 等新命名铺路镜像与运行时覆盖更新COS 版本滚动升级、containerd/CRI-O job 覆盖与排障、swap 测试能力建设资源利用率量化借助 Boskos 监控驱动 job 合并与删除决策基础设施迁移多个 GCP 项目迁入社区 k8s-infra并形成新贡献者可接手的标准化 issue 流程。十一、参与者与协作模式2021 年会议记录末尾附有完整的志愿者名单来自 Red Hat、AWS、IBM、Google、Intel、VMware、PayPal、Airbnb、DaoCloud 等多家公司包括 Elana Hashman、Sergey Kanzhelev、Francesco Romani、Artyom Lukianov、Swati Sehgal、David Porter、Amim Knabben、Paco Xu 等活跃成员。其协作模式可总结为例会 异步协作周三例会同步进展Slack 与 issue 评论区承担异步讨论明确的 Action 与负责人每条讨论都有可追溯的 action item如Elana 创建 issue 并指派 Danielle新贡献者友好部分任务TestGrid tab 整理、issue 迁移步骤文档化被明确标注为适合新贡献者或结对完成。结语Kubernetes SIG Node 的 CI 子组在 2021 年的实践是大型开源项目如何持续维护测试基础设施的一份真实样本它不依赖一次性重构而是依靠标记体系、triage 纪律、资源量化与基础设施渐进迁移的组合日拱一卒地把复杂测试矩阵拉回健康状态。对于维护自建测试平台或参与 Kubernetes 生态的工程师而言这份记录中 serial lane 治理、测试标记规范与 Kubetest2 迁移决策的思路都具有直接的借鉴价值。后续年份的会议记录可继续参考 ci-subgroup-notes-2022.md、ci-subgroup-notes-2023.md 等文件观察这些议题的后续演化。【免费下载链接】communityKubernetes Community Documentation项目地址: https://gitcode.com/GitHub_Trending/com/community创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表