云原生之K8s的亲和、反亲和、污点与容忍

目录

一、基本介绍

二、K8S调度

1.Scheduler 调度过程

2.K8s 调度策略

三、亲和与反亲和

2.1、Pod和Node

2.2、硬亲和与软亲和

三、污点与容忍

3.1、污点(Taint)

污点的设置和去除

3.2、容忍(Tolerations)

Toleration基本语法

Toleration案例

3.3、多污点与多容忍配置


一、基本介绍

在 Kubernetes 中 Pod 的调度都是由 Scheduler 组件来完成的,整个调度过程都是自动完成的,也就是说我们并不能确定 Pod 最终被调度到了哪个节点上。而在实际环境中,可能需要将 Pod 调度到指定的节点上。官方文档

这时,我们便可以通过 K8s 提供的节点选择器、亲和、反亲和等配置来实现 Pod 到节点的定向调度。

二、K8S调度

1、调度通过kubernetes的list-watch机制来发现集群中新创建且尚未被调度到Node上的Pod。调度器会将发现的每一个未调度的Pod调度到一个合适的Node上运行Node上来运行。

2、kube-scheduler是Kubernetes集群的默认调度器,并且是集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler在设计上是运行你自己写一个调度组件并替换原有的kube-scheduler。

3、在做调度决定时需要考虑的因素包括:单独和整体的资源请求,硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。

1.Scheduler 调度过程

  1. 预选(Predicates):遍历集群中的所有节点,并通过预选策略筛选出符合条件的节点列表。
  2. 优选(Priorities):在预选结果的基础上,通过优选策略对每个节点进行打分和排序,最后将 Pod 优先分配到分数较高的节点上。

2.K8s 调度策略

调度策略作用
nodeSelector节点选择器,通过匹配节点标签的方式,调度到存在该标签的节点上。
nodeAffinity节点亲和,通过匹配节点标签的方式,调度到存在该标签的节点上。
podAffinityPod 亲和,通过匹配 Pod 标签的方式,使 Pod 和 Pod 调度在同一台节点上。
podAntiAffinityPod 反亲和,通过匹配 Pod 标签的方式,使 Pod 和 Pod 调度在不同的节点上。
Taint & Toleration污点和容忍,污点可以将节点和 Pod 达到互斥的效果,而容忍则可以让 Pod 调度到带有污点的节点上。

三、亲和与反亲和

2.1、Pod和Node

  1. 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。
  2. 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity
  3. 从操作指令来讲,可以有In、Notin、Exists、DoesNotExist等等。

2.2、硬亲和与软亲和

preferredDuringSchedulingIgnoredDuringExecution 软亲和

软策略:结合下面的 “operator: NotIn”,意思就是尽量不要将 pod 调度到匹配到的节点,但是如果没有不匹配的节点的话,也可以调度到匹配到的节点。

requiredDuringSchedulingIgnoredDuringExecution 硬亲和

硬策略:结合下面的 “operator: In”,意思就是必须调度到满足条件的节点上,否则就等着 Pending。

不管哪种方式,最终还是要依赖 label 标签。

kubectl get pods -n company ai-action-statistic-gray-86465f9c4b-hdfk4 -oyaml | grep nodeSelector -B 5 -A 5
  uid: ed47f094-f70a-45ed-b7dd-d46f2d01986f
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:    #硬策略
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/gray
            operator: In
            values:
            - gray
      preferredDuringSchedulingIgnoredDuringExecution:  #软策略
          - weight: 1
            preference:
              matchExpressions:
              - key: pc-app
                operator: NotIn
                values:
                - luna
 

operator 匹配条件:

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

三、污点与容忍

K8s每个节点上都可以应用一个或多个taint,这表示对于那些不能容忍这些taint的pod,是不会被该节点接受的。如果将toleration应用于pod上,则表示这些pod可以(但不要求)被调度到具有相应taint的节点上。

3.1、污点(Taint)

  1. 如果一个节点被标记为有污点,那么意味着不允许pod调度到该接待你,除非pod也被标记为可以容忍污点节点
  2. 在使用kubeadm部署的k8s集群的时候应该会发现,通常情况下,应用是不会调度到master节点的,因为kubeadm部署的k8s集群默认给master节点加了Taints(污点)

effect 可选配置:

  • NoSchedule:表示 Pod 将不会被调度到具有该污点的节点上。
  • PreferNoSchedule:表示 Pod 将尽量避免调度到具有该污点的节点上(类似于软策略)
  • NoExecute:表示 Pod 将不会被调度到具有该污点的节点上,同时将节点上预警存在的 Pod 进行驱逐。

污点的设置和去除

使用kubectl设置和去除污点的命令实例如下:

# 设置污点
kubectl taint nodes node1 key1=value1:NoSchedule
# 去除污点
kubectl taint nodes node1 key1:NoSchedule-

接下来看一个具体的例子,使用kubeadm部署和初始化的Kubernetes集群,master节点被设置了一个node-role.kubernetes.io/master:NoSchedule的污点,可以使用kubectl describe node命令查看。这个污点表示默认情况下master节点将不会调度运行Pod,即不运行工作负载。对于使用二进制手动部署的集群设置和移除这个污点的命令如下:

kubectl taint nodes <node-name> node-role.kubernetes.io/master=:NoSchedule
kubectl taint nodes <node-name> node-role.kubernetes.io/master:NoSchedule-

3.2、容忍(Tolerations)

设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被Node上,但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上

Toleration基本语法

pod 的 Toleration 声明中的 key 和 effect 需要与 Taint 的设置保持一致,并且满足以下条件之一:

  1. operator 的值为 Exists,这时无需指定 value
  2. operator 的值为 Equal 并且 value 相等
  3. 如果不指定 operator,则默认值为 Equal。

另外还有如下两个特例:

  1. 空的 key 配合 Exists 操作符能够匹配所有的键和值
  2. 空的 effect 匹配所有的 effect

上面的例子中 effect 的取值为 NoSchedule,下面对 effect 的值作下简单说明:

  1. NoSchedule:如果一个 pod 没有声明容忍这个 Taint,则系统不会把该 Pod 调度到有这个 Taint 的 node 上
  2. PreferNoSchedule:NoSchedule 的软限制版本,如果一个 Pod 没有声明容忍这个Taint,则系统会尽量避免把这个 pod 调度到这一节点上去,但不是强制的。
  3. NoExecute:定义 pod 的驱逐行为,以应对节点故障。

NoExecute 这个 Taint 效果对节点上正在运行的 pod 有以下影响:

  1. 没有设置 Toleration 的 Pod 会被立刻驱逐
  2. 配置了对应 Toleration 的 pod,如果没有为 tolerationSeconds 赋值,则会一直留在这一节点中
  3. 配置了对应 Toleration 的 pod 且指定了 tolerationSeconds 值,则会在指定时间后驱逐

Toleration案例

tolerations:
 - key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
 - key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
 - key: "key2"
operator: "Exists"
effect: "NoSchedule"
  • 其中key, vaule, effect要与Node上设置的taint保持一致
  • operator的值为Exists将会忽略value值
  • tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间

3.3、多污点与多容忍配置

系统允许在同一个 node 上设置多个 taint,也可以在 pod 上设置多个 Toleration。**Kubernetes 调度器处理多个 Taint 和 Toleration 能够匹配的部分,剩下的没有忽略掉的 Taint 就是对 Pod 的效果了。下面是几种特殊情况:

  1. 如果剩余的 Taint 中存在 effect=NoSchedule,则调度器不会把该 pod 调度到这一节点上。
  2. 如果剩余的 Taint 中没有 NoSchedule 的效果,但是有 PreferNoSchedule 效果,则调度器会尝试不会 pod指派给这个节点
  3. 如果剩余 Taint 的效果有 NoExecute 的,并且这个 pod已经在该节点运行,则会被驱逐;如果没有在该节点运行,也不会再被调度到该节点上。

容忍多种配置:

1)可以被调度到带有 key/value:NoExecute 污点的节点上。

tolerations:
- key: ""
  operator: "Equal"
  value: ""
  effect: "NoExecute"
  tolerationSeconds: 3600
  • tolerationSeconds:表示当 Pod 被驱逐时,还可以在节点上继续运行的时间(仅可以和 NoExecute 配合使用)

2)可以被调度到带有指定 key 污点的节点上。

tolerations:
- key: ""
  operator: "Exists"

3)可以被调度到带有任何污点的节点上。

tolerations:
- operator: "Exists"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值