首页 > 解决方案 > 设置了 preferredDuringSchedulingIgnoredDuringExecution 的 nodeAffinity 总是在不正确的节点上调度一个 pod

问题描述

我的环境中有两个工作节点。我已经为其中一个添加了一个标签,如下所示:

kubectl label nodes "${node}" type=infrastructure --overwrite

在我的服务 yaml 文件中,我设置了以下内容:

    affinity:
      nodeAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: "type"
              operator: In
              values: ["infrastructure"]

preferredDuringSchedulingIgnoredDuringExecution规则应该意味着 kubernetes 调度器应该尽最大努力将 Pod 部署到带有“基础设施”标签的节点,但如果无法部署(例如,资源不足),它将部署到集群中的其他节点。

我看到每次部署服务(3 个 pod)时,总是有 1 个 pod 被部署到没有标签的节点。

有什么方法可以找出 Kubernetes 调度程序选择未标记节点的原因吗?如果这是一个资源问题,我希望看到它记录在事件中,但是我看到调度程序立即选择了未标记的节点:

    Normal  Scheduled              23m   default-scheduler  Successfully assigned es-master-5f55dd9dd-2n48b to pink02

我知道我可以使用该规则requiredDuringSchedulingIgnoredDuringExecution将 pod 强制到标记的节点上,但我不想这样做,因为某些环境可能没有标签。

标签: kubernetes

解决方案


我假设您实际上没有足够的资源,因为 nodeAffinity 是一个非常简单的过程,因为它是基于分数的。 在 github 文档中评论

/CalculateNodeAffinityPriorityMap 根据节点亲和性调度首选项对节点进行优先级排序 // 在 PreferredDuringSchedulingIgnoredDuringExecution 中指示。每次一个节点匹配一个preferredSchedulingTerm,//它都会得到一个preferredSchedulingTerm.Weight。因此,preferredSchedulingTerms 越多// 节点满足,并且满足权重的preferredSchedulingTerm 越多,// 节点获得的分数就越高。

其他:

  • 一个名为的字段 , 除了系统可能会或可能不会尝试最终将 pod 从其节点中逐出之外,其他字段RequiredDuringSchedulingIgnoredDuringExecution 相同 。RequiredDuringSchedulingRequiredDuringExecution

请尝试检查您是否真的有足够的资源,因为根据引用的文档,在将第一个 pod 放入第一个节点后,该行为似乎适用于第二个节点的更好评分。回答你的最后一个问题:你不会在事件日志中看到这一点,因为这些类型的事件没有被记录,理论上你应该在调试模式下看到它们,但我不确定。


推荐阅读