我希望能够做到:
desiredState := ... some applyconfig ...
currentState := applyconfiguration.ExtractDeployment(Get(...))
if !Equal(desired, current) {
Apply(applyconfig)
}
这里的目的是避免不必要的Apply调用。请注意,Get()
基本上是免费的,因为它是一个informer,所以在https://kubernetes.io/blog/2022/10/20/advanced-server-side-apply/#reconstructive-controllers中关于它是如此便宜的建议(Get
)似乎在这里直接适用。
然而,我遇到了一个关于默认字段的问题。
当我比较期望状态和当前状态时,由于默认值(我假设),当前状态总是有一些额外的字段:
Name: &"POD_NAMESPACE",
ValueFrom: &v1.EnvVarSourceApplyConfiguration{
FieldRef: &v1.ObjectFieldSelectorApplyConfiguration{
- APIVersion: nil,
+ APIVersion: &"v1",
FieldPath: &"metadata.namespace",
},
},
},
相应的managedField:
k:{"name":"POD_NAMESPACE"}:
.: {}
f:name: {}
f:valueFrom:
f:fieldRef: {}
/sig api-machinery
cc @apelisse
6条答案
按热度按时间li9yvcax1#
感谢您的报告!我很快就会查看。
x7rlezfr2#
过去曾讨论过类似的事情,
/cc @justinsb@seans3
cbeh67ev3#
默认值这件事值得怀疑,我不确定是什么导致的。我会检查测试用例,看看我们是否能重现这个bug。
mm5n2pyu4#
/wg api-expression
uyhoqukh5#
有任何更新吗?这项工作是否在其他地方被跟踪?
q9yhzks06#
上下文中,SSA用于检查apply是否导致实际更改的等式检查相当复杂(我现在有两个修复方案),并涉及类似以下内容:
kubernetes/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/equality.go
第75行 51f89c3
| | funcIgnoreManagedFieldsTimestampsTransformer( |