集成测试从未对过滤后的 Secret 列表进行测试,因此无法检测默认配置中的回退情况

作者: wallrj创建于 2026年9月13日更新于 2026年9月13日
标签area/testing

为什么这很重要 我们在 #9224 遇到了这个问题。该提交扩展了 keymanager 的 Secret LIST 选择器为 `labels.Everything()`。在过滤后的列表中,每个命名空间中的每个不相关 Secret 都会对 API 服务器进行一次实时 GET,并在每次 Reconcile 证书时。没有证书达到 Ready 状态。`TestGeneratesNewPrivateKeyPerRequest` 在该提交中通过了。它启动了真实的 keymanager、requestmanager、trigger、readiness 和 issuing 控制器,对一个实时 apiserver 进行请求,并要求证书达到 Ready 状态,这正是导致问题的行为。它通过了,因为它使用了基本列表器。两个端到端作业都在两个不同节点上失败了,两次。因此,我们有的集成测试看起来像是涵盖了发行链,但无法看到默认配置中的一类回归问题。端到端作业是我们与该类错误之间的唯一屏障,它们需要二十分钟。<details><summary>过滤列表器如何使列表昂贵</summary>过滤列表器从两个缓存中提供列表。类型化缓存保存了 cert-manager 自己的 Secrets,这些 Secrets 具有 `controller.cert-manager.io/fao` 标签。元数据只读缓存保存命名空间中的每个其他 Secrets,并且 `partialMetadataRemoveAll` 将其标签设置为 nil:<https://GitHub.com/cert-manager/cert-manager/blob/9313ef502c74abcf53cb21ea9641e5a141d7ba6c/internal/informers/transformers.go#L38> 元数据缓存返回的每个 Secrets 都需要一个实时 GET:<https://GitHub.com/cert-manager/cert-manager/blob/9313ef502c74abcf53cb21ea9641e5a141d7ba6c/internal/informers/core_filteredsecrets.go#L327> 要求标签的选择器在该缓存中匹配不到任何内容。`labels.Everything()` 与之匹配。</details>建议让测试选择过滤工厂。大致按照成本的顺序:- `framework.NewClients` 遵循生产环境中 `SecretsFilteredCaching` 门控的方式,并且测试使用 `featuregatetesting.SetFeatureGateDuringTest` 将其设置为 true,我们已经在项目中其他地方使用了该方法。- 添加一个返回过滤工厂的 `NewClients` 变体,并至少对发行链测试使用两者。- 运行整个

内容来源: cert-manager/cert-manager