K8s 之 节点亲和性的调度策略(NodeAffinity)

NodeAffinity 是 Node(节点)亲和性的调度策略,用于替换掉 NodeSelector 的调度策略。

一、NodeAffinity 的亲和性表达

目前有以下几种亲和性表达。

RequiredDuringSchedulingIgnoredDuringExecution

必须满足指定的规则才可以调度 Pod 到 Node 上,相当于 硬限制

PreferredDuringSchedulingIgnoredDuringExecution

强调优先满足指定规则,调度器会尝试调度 Pod 到 Node 上,但并不强求,相当于 软限制

多个优先级规则还可以设置权重(weight)值,以此来定义执行的先后顺序。

节点亲和性权重

我们可以为 PreferredDuringSchedulingIgnoredDuringExecution 亲和性类别的每个实例设置 weight 字段,取值范围是 1 ~ 100。当调度器找到能够满足 Pod 的其他调度请求的节点时,调度器会比那里节点满足的所有的偏好性规则,并将对应表达式的 weight 值加和。最终的加和值会添加到该节点的其他优先级函数的评分之上。在调度器为 Pod 做出调度决定时,总分最高的节点的优先级也最高

IgnoredDuringExecution

如果一个 Pod 所在的节点在 Pod 运行期间标签发生了变更,不再符合该 Pod的节点亲和性需求,则系统将忽略 Node 上 label 的变化,该 Pod 能继续在该节点运行。

二、NodeAffinity 的语法规则

NodeAffinity 语法支持的操作符包括In,NotIn,Exists,DoesNotExist,Gt,Lt。虽然没有节点排斥功能,但是用 NotIn 和 DoesNotExist 就可以实现排斥的功能了。

  • In:label的值在某个列表中
  • NotIn:label的值不在某个列表中
  • Gt:label的值大于某个值
  • Lt:label的值小于某个值
  • Exists:某个label存在
  • DoesNotExist:某个label不存在

三、NodeAffinity 的注意事项

  • 如果同时定义了 nodeSelector 和 nodeAffinity,那么必须两个条件都得到满足,Pod 才能最终运行到指定的 Node 上。
  • 如果 nodeAffinity 指定了多个 nodeSelectorTerms,那么其中一个能够匹配成功即可。
  • 如果在 nodeSelectorTerms 中有多个 matchExpressions,则一个节点必须满足所有matchExpressions 才能运行该 Pod。

四、案例

通过配置 NodeAffinity 的 PreferredDuringSchedulingIgnoredDuringExecution 来实现,优先将 Pod 投递到 32G 内存的节点,其次 16G 内存节点,最后 8G 内存节点。

spec:
  containers:
  - name: xxxxx
    image: xxxxx
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 20
        preference:
          matchExpressions:
          - key: mem
            operator: In
            values:
            - memory32
      - weight: 10
        preference:
          matchExpressions:
          - key: mem
            operator: In
            values:
            - memory16
      - weight: 1
        preference:
          matchExpressions:
          - key: mem
            operator: In
            values:
            - memory8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要设置 k8s 节点不可调度,可以通过以下两种方式实现: 1. 使用 kubectl 命令设置节点不可调度: ``` kubectl cordon <node-name> ``` 这个命令会在节点上设置一个 taint ,使得 k8s 调度器不会将新的 Pod 调度到该节点上。 2. 在节点上设置 taint: 在要设置不可调度节点上运行以下命令: ``` kubectl taint nodes <node-name> node-role.kubernetes.io/master:NoSchedule ``` 这个命令会在该节点上设置一个 taint,使得 k8s 调度器不会将新的 Pod 调度到该节点上。 这两种方式都可以实现节点不可调度的目的,但是第二种方式可以设置更多的 taints,例如可以设置 Pod 必需的节点标签,从而限制 Pod 的调度。 ### 回答2: 在Kubernetes(简称K8s)中,可以通过设置节点调度状态来控制其可调度性。要将节点设置为不可调度,可以使用以下步骤: 1. 首先,可以使用以下命令查看当前集群中的所有节点:`kubectl get nodes` 2. 选择要将其设置为不可调度节点,并使用以下命令标记该节点为不可调度的状态:`kubectl cordon <节点名称>` 3. 当节点被标记为不可调度后,新的Pod将不会被调度到该节点上,而已经运行在该节点上的Pod将继续运行。 4. 如果要将节点重新设置为可调度状态,可以使用以下命令:`kubectl uncordon <节点名称>` 5. 再次将节点设置为可调度后,K8s调度器将重新考虑该节点上的Pod的分布,并在需要时在该节点调度新的Pod。 通过设置节点调度状态,可以灵活地控制K8s集群中Pod的调度行为,确保节点的资源被有效利用,并实现负载均衡和高可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值