kubernetes-sigs/structured-merge-diff

GitHub: kubernetes-sigs/structured-merge-diff

structured-merge-diff 实现了 Kubernetes Server-Side Apply 的核心合并逻辑,支持多管理器协同管理同一资源的不同字段而不相互覆盖。

Stars: 135 | Forks: 71

# 结构化合并与差异比较 此代码库包含实现 Kubernetes "apply" 操作的代码。 ## 什么是 apply 操作? 我们将控制平面中的资源建模为具有多个 "manager"。每个 manager 通常只试图管理资源的某一方面。其目标是让不同的 manager 能够轻松地进行所需的更改,而不会破坏其他 manager 正在进行的工作。在这个系统中,人类和机器(即 "controller")都充当 manager。 为此,我们(使用 fieldset 数据结构)显式跟踪每个 manager 当前正在管理哪些字段。 现在,修改对象有两种基本机制。 PUT/PATCH:这是一个写入命令,意思是:“让对象看起来完全像 X”。 APPLY:这是一个写入命令,意思是:“我管理的字段现在应该看起来完全像这样(但我不关心其他字段)”。 对于 PUT/PATCH,我们根据发生的更改来推断将管理哪些字段。 对于 APPLY,用户明确声明他们希望管理哪些字段(因此要求删除他们过去管理但现在不再提及的任何字段)。 每当一个 manager 开始管理某个新字段时,该字段就会从所有其他 manager 中移除。如果该 manager 正在使用 APPLY 命令,我们将其称为冲突,除非用户传递了 "force" 选项,否则将不会继续执行。这可以防止意外设置由其他实体管理的字段。 PUT/PATCH 始终“强制”。它们主要由自动化系统使用,这些系统对于新的错误类型不会做任何有意义的处理。 ## 组件 该操作有几个构建块: * 我们在 schema 包中定义了目标 schema 类型。(由于其高度针对性,它比例如 OpenAPI 要简单得多。) * 我们在 fieldpath 包中定义了 "field set" 数据结构。字段路径用于定位对象中的某个字段,出于我们的目的,通常是“叶子”字段。字段集就是此类路径的集合。它们可以高效地存储在相当于 Trie 的结构中。 * 我们定义了一个 "value" 类型,用于存储任意对象。 * 我们定义了一个 "typed" 包,它结合了 "value" 和 "schema"。现在我们可以验证对象是否符合 schema,或者比较两个对象。 * 我们定义了一个 "merge" 包,它使用上述所有概念来实现 "apply" 操作。 * 我们将对此进行广泛的测试。 ### 行为准则 参与 Kubernetes 社区受 [Kubernetes 行为准则](code-of-conduct.md) 约束。
标签:EVTX分析, 声明式API, 子域名突变, 数据结构, 日志审计, 服务端应用