kubernetes - 忽略节点的节点亲缘关系
问题描述
我有 3 个节点,每个节点都标记如下:
- node-0 -> mongo-volume=volume-0
- 节点 1 -> mongo-volume=volume-1
- 节点 2 -> mongo-volume=volume-2
我正在寻找一种在特殊节点上安排 statefulset 副本的方法。
我首先使用 requiredDuringSchedulingIgnoredDuringExecution 的硬方法,一切正常。
然后我想通过使用preferredDuringSchedulingIgnoredDuringExecution来测试软方式。
我首先告诉我的 statefulset 优先选择具有标签volume-0的节点,没有问题,pod 都部署在node-0上。
然后我更改了对具有标签volume-1的节点的偏好。还有我的问题,pod 部署在node-0和node-2上,但node-1上的节点。
我对标签 volume-2 做了同样的事情,它再次运行良好,pod 都部署在node-2上。
节点亲和性配置:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: mongo-volume
operator: In
values:
- volume-1
当我查看节点的资源使用情况时,我注意到 node-1 的负载比其他节点多一些。它可以解释为什么调度程序拒绝在这个节点上部署 pod 吗?
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node-0 63m 6% 795Mi 41%
node-1 116m 11% 978Mi 51%
node-2 78m 7% 752Mi 39%
我想知道为什么它适用于节点 0 和节点 2,但不适用于节点 1。如果有可能的方法来解决它。
解决方案
关联策略更喜欢在该节点上运行,而不是直接选择该节点。
您的亲和力的权重是您的亲和力策略的优先级。例如:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: k1
operator: In
values:
- "v1"
topologyKey: kubernetes.io/hostname
- weight: 30
podAffinityTerm:
labelSelector:
matchExpressions:
- key: k2
operator: In
values:
- "v2"
topologyKey: kubernetes.io/hostname
K8s 调度程序文档说:
kube-scheduler 通过两步操作为 pod 选择一个节点:
过滤
计分
过滤步骤找到可以调度 Pod 的节点集。例如,PodFitsResources 过滤器检查候选节点是否有足够的可用资源来满足 Pod 的特定资源请求。在这一步之后,节点列表包含任何合适的节点;通常,会有不止一个。如果列表为空,则该 Pod (尚)不可调度。
在评分步骤中,调度程序对剩余节点进行排名以选择最合适的 Pod 放置。调度程序根据活动评分规则为每个通过过滤的节点分配一个分数。
最后,kube-scheduler 将 Pod 分配给排名最高的 Node。如果有多个节点得分相等,kube-scheduler 会随机选择其中一个
亲和力是考虑的一部分,但不是全部。
推荐阅读
- php - 数据库中的错误值
- java - 在 Java 中使用 Xpath 定位具有特定命名空间的元素
- python - 当一个numpy数组被切片时,有没有办法不制作副本?
- javascript - JS中console.log('any string or statement'+ object)和console.log('any string or statement', object)的区别?
- php - 具有基本 php 形式的 DropzoneJs
- angularjs - 如何使用 && 显示 ng-checked 条件
- javascript - javascript - 发送了 2 个承诺,第二个承诺的结果排在第一位 - 如何处理?
- c# - 如何在 C# 中正确反序列化 JSON
- google-cloud-platform - BigQueryIO - 尽管有 CreateDisposition.CREATE_IF_NEEDED,但只能创建第一天表
- python - Python3,word2vec,如何在我的模型中获取关于“价格”的相似度排名列表