client-go版本: v0.15.10
当nodeSelector是MergePatchType或StrategicMergePatchType时,不能从部署MergePatchType中删除lebels吗?
这里是原始的yaml文件'test1.yaml':
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: frontgateway
name: frontgateway
spec:
replicas: 1
selector:
matchLabels:
k8s-app: frontgateway
template:
metadata:
labels:
k8s-app: frontgateway
spec:
nodeSelector:
CLUSTER: WX
GROUP: IAD补丁代码:
playLoadBytes,_ :=json.Marshal(unstructuredObj)
_,err=DynamicClient.Resource(mapping.Resource).Namespace(namespace).Patch(name,types.StrategicMergePatchType,playLoadBytes,metav1.PatchOptions{})贴片yaml:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: frontgateway
name: frontgateway
spec:
replicas: 1
selector:
matchLabels:
k8s-app: frontgateway
template:
metadata:
labels:
k8s-app: frontgateway
spec:
nodeSelector:
GROUP: IAD当我从test1.yaml中移除“群集: WX”行并执行修补程序()方法时,部署资源仍然具有“群集: WX”标签,但是添加一个新的标签可以工作。
我看到了官方文件https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/,上面写着Notice that the tolerations list in the PodSpec was replaced, not merged. This is because the Tolerations field of PodSpec does not have a patchStrategy key in its field tag. So the strategic merge patch uses the default patch strategy, which is replace.
因此,我在Kubernetes源代码中检查了NodeSelector的字段标记:
NodeSelector map[string]string `json:"nodeSelector,omitempty" protobuf:"bytes,7,rep,name=nodeSelector"`没有"patchStrategy“标记,那么为什么补丁()不执行替换呢?
发布于 2021-01-19 11:11:55
注意到PodSpec中的公差列表已被替换,而不是合并。
替换策略适用于列表,而nodeSelector不是列表。
spec:
template:
spec:
tolerations:
- effect: NoSchedule <- list
key: disktype
value: ssdspec:
replicas: 1
selector:
matchLabels:
k8s-app: frontgateway
template:
metadata:
labels:
k8s-app: frontgateway
spec:
nodeSelector:
CLUSTER: WX <- not a list
GROUP: IAD使用替换列表是因为列表的顺序容易混乱,很难预测所引用的列表中的哪个元素。这就是为什么更容易替换整个列表的原因。
如果对象可以直接和清晰地处理每个元素,则不需要替换任何东西。
https://stackoverflow.com/questions/65789256
复制相似问题