client.Secrets(命名空间).Update(秘密)是原子调用吗?如果此调用以某种方式失败,那么存储在Kubernetes API服务器中的原始机密是否会损坏?
类似地,core.ConfigMaps(namespace).Update(configmap)是原子调用吗?如果此调用失败,则现有的configmap是否会损坏?
答案 0 :(得分:0)
根据Kubernetes documentation中有关服务器端应用的部分,您可以找到以下内容:
通过“ field management”机制跟踪对对象字段的更改。当字段的值更改时,所有权从其当前经理转移到进行更改的经理。尝试应用对象时,其他管理者拥有的具有不同值的字段将产生conflict。这样做是为了表明该操作可能撤消其他协作者的更改。可以强制使用冲突,在这种情况下,值将被覆盖,所有权将被转移。
合并策略
通过Server Side Apply实现的合并策略通常提供更稳定的对象生命周期。服务器端应用程序尝试根据管理字段的事实来合并字段,而不是仅基于值来否决。通过这种方式,旨在通过减少较少的意外干扰,使多个参与者更新同一对象变得更加轻松和稳定。
当用户向“服务器端应用”端点发送“完全指定的意图”对象时,如果在两个位置都指定了该值,则服务器会将其与活动对象合并,以支持已应用配置中的值。如果应用的配置中存在的项目集不是同一用户上次应用的项目的超集,则将删除所有未由其他应用程序管理的缺失项目。有关合并时如何使用对象的架构进行决策的更多信息,请参见sigs.k8s.io/structured-merge-diff。
希望这会有所帮助。
编辑: 是的,apply and update使用此功能。
应用并更新
此功能考虑的两种操作类型为
Apply
(PATCH
,内容类型为application/apply-patch+yaml
)和Update
(所有其他修改对象的操作)。都 操作会更新managedFields
,但会有所作为 不一样。例如,更新时只有apply操作因冲突而失败 才不是。另外,需要应用操作来标识自己 通过提供
fieldManager
查询参数,而查询 参数对于更新操作是可选的。最后,当使用 应用操作,您不能在对象中包含managedFields
正在应用。
答案 1 :(得分:0)
client-go UPDATE 是一个HTTP PUT,因此它将替换该对象,并且是一个原子操作。但是,这样做时需要考虑一些情况,例如如果有多个客户端在同一个对象上进行操作...,则应在此链接的客户端执行示例中查找替代解决方案: