首页 > 解决方案 > 忽略节点的节点亲缘关系

问题描述

我有 3 个节点,每个节点都标记如下:

我正在寻找一种在特殊节点上安排 statefulset 副本的方法。

我首先使用 requiredDuringSchedulingIgnoredDuringExecution 的硬方法,一切正常。

然后我想通过使用preferredDuringSchedulingIgnoredDuringExecution来测试软方式。

我首先告诉我的 statefulset 优先选择具有标签volume-0的节点,没有问题,pod 都部署在node-0上。

然后我更改了对具有标签volume-1的节点的偏好。还有我的问题,pod 部署在node-0node-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。如果有可能的方法来解决它。

标签: kuberneteskubectlkubernetes-statefulset

解决方案


关联策略更喜欢在该节点上运行,而不是直接选择该节点。

您的亲和力的权重是您的亲和力策略的优先级。例如:

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 选择一个节点:

  1. 过滤

  2. 计分

过滤步骤找到可以调度 Pod 的节点集。例如,PodFitsResources 过滤器检查候选节点是否有足够的可用资源来满足 Pod 的特定资源请求。在这一步之后,节点列表包含任何合适的节点;通常,会有不止一个。如果列表为空,则该 Pod (尚)不可调度。

在评分步骤中,调度程序对剩余节点进行排名以选择最合适的 Pod 放置。调度程序根据活动评分规则为每个通过过滤的节点分配一个分数。

最后,kube-scheduler 将 Pod 分配给排名最高的 Node。如果有多个节点得分相等,kube-scheduler 会随机选择其中一个

亲和力是考虑的一部分,但不是全部。


推荐阅读