求助:Kubernetes中手动设置的Tolerations为何被自动覆盖?
场景回顾
你通过以下命令为observability-system命名空间下的wavefront-proxy Deployment添加容忍度:
kubectl patch deployment wavefront-proxy -n observability-system --type='json' -p='[{ "op": "add", "path": "/spec/template/spec/tolerations", "value": [{ "key": "key1", "operator": "Equal", "value": "value1", "effect": "NoSchedule" }]}]'
手动修改后立即查看,容忍度符合预期,但数秒后被自动覆盖为:
tolerations: - effect: NoSchedule key: kubernetes.io/arch value: arm64
以下是可能导致该问题的核心因素:
专属Operator的自动调和
Wavefront Proxy通常由Wavefront Operator负责生命周期管理。Operator会持续监控Deployment的状态,确保其与自定义资源(CR)中定义的期望配置一致。如果CR中未配置你添加的tolerations,Operator会在调和周期内覆盖手动修改的字段,将Deployment重置为CR指定的状态。解决方式是在对应的Wavefront CR(如WavefrontProxy)中添加目标容忍度,由Operator同步到Deployment。GitOps工具的同步回滚
若集群使用Argo CD、Flux CD等GitOps工具,工具会以Git仓库中的配置作为唯一可信源。手动修改集群内的Deployment后,工具检测到集群状态与Git仓库配置不一致,会自动将Deployment回滚至Git仓库中的版本,导致手动修改被覆盖。需要将容忍度修改提交到对应的Git仓库,由GitOps工具同步到集群。Mutating Admission Webhook的自动修改
集群中的Mutating Admission Webhook(比如架构亲和相关的自定义Webhook、或云厂商提供的调度策略Webhook)可能会在Pod创建/更新时,自动注入或修改tolerations字段。例如部分Webhook会根据节点架构自动添加kubernetes.io/arch相关的容忍度,并覆盖原有配置。可通过检查集群中的MutatingWebhookConfiguration资源,确认是否有相关Webhook干预tolerations字段。云厂商集群管理组件的策略干预
托管式Kubernetes集群(如EKS、GKE、AKS)的云厂商附加组件,可能会根据集群的调度策略、节点池配置等自动调整Pod的容忍度。比如针对特定节点池的专属调度策略,会强制Pod匹配节点池的容忍要求,覆盖手动设置的配置。定制化扩缩容或调度组件的重置
部分定制化的HPA扩展、或第三方调度器组件,在调整Pod副本或重新调度时,可能会同步重置Pod模板的tolerations字段,恢复到组件预设的配置。这种场景相对少见,但需结合集群内的自定义组件排查。
内容的提问来源于stack exchange,提问作者user30016196

