kubernetes - 设置了 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 强制到标记的节点上,但我不想这样做,因为某些环境可能没有标签。
解决方案
我假设您实际上没有足够的资源,因为 nodeAffinity 是一个非常简单的过程,因为它是基于分数的。 在 github 文档中评论
/CalculateNodeAffinityPriorityMap 根据节点亲和性调度首选项对节点进行优先级排序 // 在 PreferredDuringSchedulingIgnoredDuringExecution 中指示。每次一个节点匹配一个preferredSchedulingTerm,//它都会得到一个preferredSchedulingTerm.Weight。因此,preferredSchedulingTerms 越多// 节点满足,并且满足权重的preferredSchedulingTerm 越多,// 节点获得的分数就越高。
- 一个名为的字段 , 除了系统可能会或可能不会尝试最终将 pod 从其节点中逐出之外,其他字段
RequiredDuringSchedulingIgnoredDuringExecution
相同 。RequiredDuringSchedulingRequiredDuringExecution
请尝试检查您是否真的有足够的资源,因为根据引用的文档,在将第一个 pod 放入第一个节点后,该行为似乎适用于第二个节点的更好评分。回答你的最后一个问题:你不会在事件日志中看到这一点,因为这些类型的事件没有被记录,理论上你应该在调试模式下看到它们,但我不确定。
推荐阅读
- .net-core - 如何在.net core 2.2中重新启动后台服务
- latex - 如何在背面突出显示参考编号和引文?
- java - 无法在linux上的路径中运行jar可执行文件
- ssis - SSIS - 仅根据结果导出列
- python - 如何为数据框中列中具有特定字符串的两行之间的行分配值?
- html - Bootstrap 适合子内容并让其他子滚动
- react-native - 绝对定位的 View 在 react-native 中不能作为覆盖层
- sql - PostgreSQL 统计每个学生的最高成绩数
- forms - Svelte:在使用主要 CSS 框架(如 Bootstrap/Material/SemanticUI)的同时集成表单验证?
- javascript - 在 Vue 应用程序上根据条件 v-if 和 else 显示内容