我正在使用 Argo Workflows 来做一些 cronjobs。 生成的 pod 似乎自动添加了
nodeAffinity
和 toleration
,如下所示:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node24
schedulerName: default-scheduler
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
对于
nodeAffinity
,我希望K8s(而不是Argo)来决定要调度的节点。我观察到 Argo 总是只将 pod 粘在 1~2 个特定节点上;
对于
toleration
,我很困惑为什么它需要允许将 pod 调度到未就绪/无法访问的节点。
那么,是否可以删除甚至自定义默认的nodeAffinity和toleration?
我在Argo的文档中找到了Template Defaults,但不够详细。
谢谢。
toleration
字段均由 kubernetes 默认在任何 pod 上设置。如果当前节点崩溃或无法访问,这将控制 pod 何时在新节点上重新启动。请参阅 https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/#taint-based-evictions 了解更多信息。
我不能确定为什么设置
nodeAffinity
,但这可能是节点安装只能从特定节点附加的卷的结果。然后,Kubernetes 会自动添加与卷约束匹配的 nodeAffinity
。请参阅 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#node-affinity。