我有3个节点,每个节点的标签如下:
我正在寻找一种在特殊节点上安排有状态集副本的方法。
我首先将硬性方法与requiredDuringSchedulingIgnoredDuringExecution结合使用,并且一切正常。
然后,我想通过使用preferredDuringSchedulingIgnoredDuringExecution测试软方法。
我首先告诉我的状态集偏好具有标签 volume-0 的节点,没有问题,所有吊舱都已部署在 node-0 上。
然后,我更改了具有标签 volume-1 的节点的首选项。这是我的问题,这些Pod部署在 node-0 和 node-2 上,但是节点部署在 node-1 上。>
我对第二卷标签做了同样的操作,并且再次运行良好,所有吊舱都部署在 node-2 上。
节点关联性配置:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: mongo-volume
operator: In
values:
- volume-1
当我寻找节点的资源使用情况时,我注意到node-1的负载比其他节点多。是否可以解释为什么sheduler拒绝在该节点上部署吊舱?
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。如果有可能的话,可以解决它。
答案 0 :(得分: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 scheduler文档说:
kube-scheduler通过两步操作为Pod选择一个节点:
过滤
得分
过滤步骤会找到可用于安排Pod的一组节点。例如,PodFitsResources过滤器检查候选节点是否具有足够的可用资源来满足Pod的特定资源请求。在此步骤之后,节点列表包含任何合适的节点;通常,会有不止一个。如果列表为空,则该Pod尚无法安排。
在评分步骤中,调度程序对其余节点进行排名,以选择最合适的Pod位置。调度程序会根据活动评分规则为每个幸存的节点分配一个分数。
最后,kube-scheduler将Pod分配给排名最高的节点。如果存在多个得分相等的节点,则kube-scheduler会随机选择其中之一
亲和力是考虑因素的一部分,但不是全部。