K8s的亲和、反亲和、污点、容忍

这篇具有很好参考价值的文章主要介绍了K8s的亲和、反亲和、污点、容忍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 亲和与反亲和

亲和性的原理其实很简单,主要利用label标签结合nodeSelector选择器来实现

1.1 Pod和Node

  • 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。
  • 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity。
  • 从操作指令来讲,可以有ln、Notln、Exists、DoesNotExist等等。
针对亲和性来讲,in代表我要调度到有这个标签的位置
针对反亲和性来讲,in代表我不要调度到有这个标签的位置

1.2 硬亲和和软亲和

软亲和:preferredDuringSchedulingIgnoredDuringExecution 

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

硬亲和:requiredDuringSchedulingIgnoredDuringExecution 

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

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

kubectl get pods -n company xxx -oyaml | grep nodeSelector -B 5 -A 5
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
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

2 污点与容忍

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

2.1 污点(Taint)

       如果一个节点被标记为有污点,那么意味着不允许pod调度到该节点,除非pod也被标记为可以容忍污点节点。
       在使用kubeadm部署的k8s集群的时候应该会发现,通常情况下,应用是不会调度到master节点的。因为kubeadm部署的k8s集群默认给master节点加了Taints(污点)。
K8s的亲和、反亲和、污点、容忍,kubernetes,容器,云原生

2.1.1 污点的组成 

      使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。

 每个污点的组成如下

#每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用
key=value:effect   

污点有三种策略: 

PreferNoSchedule:

  • NoSchedule的软策略版本,表示尽量不调度到污点节点上去

NoExecute:

  • 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod驱逐出去
  • 注:(若节点上设置了污点并用的是NoExecute策略,node节点上的pod会被全部驱逐,但是如果是 Deployment 或者 StatefulSet 资源类型,为了维持副本数量则会在别的 Node 上再创建新的 Pod)

NoSchedule:

  • 表示k8s将不会将Pod调度到具有该污点的Node上

 

NoExecute和NoSchedule的区别:

  • NoSchedule只是不调度,但并不影响已经调度好的容器,即使给宿主机新增了污点,这些Pod依然会正常运行。同样PreferNoSchedule也是。
  • NoExecute就不一样了,会将Pod驱逐到其他宿主,除非该Pod容忍。

2.1.2 污点的设置和去除 

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

# 设置污点
kubectl taint nodes node1 xtz=value1:NoSchedule

# 去除污点
kubectl taint nodes node1 xtz:NoSchedule-

#节点说明中,查找 Taints 字段
kubectl describe node node-name  

接下来看一个具体的例子,使用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-

2.2 容忍(Tolerations)

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

2.2.1Toleration 基本用法

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

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

另外还有如下两个特例:

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

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

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

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

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

 2.2.2 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上继续保留运行的时间

 下面看一下在Pod上设置容忍的两个特例:

示例1: 当不指定key值时,表示容忍所有的污点key:

tolerations:
- operator: "Exists"

示例2:当不指定effect值时,表示容忍所有的污点作用:

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

注意:  在节点故障情况下,为了保持现存的 pod 驱逐的限速设置,系统将会以限速的模式逐步给 node 设置 Taint,这就能防止在一些特定情况下(比如 master 暂时失联)造成的大量 pod 被驱逐的后果。这一功能兼容于 tolerationSeconds,允许 pod 定义节点故障时持续多久才被逐出。

 2.3 多污点与多容忍配置

       系统允许在同一个 node 上设置多个 taint,也可以在 pod 上设置多个 Toleration。**Kubernetes 调度器处理多个 Taint 和 Toleration 能够匹配的部分,剩下的没有忽略掉的 Taint 就是对 Pod 的效果了。下面是几种特殊情况:文章来源地址https://www.toymoban.com/news/detail-859910.html

  • 如果剩余的 Taint 中存在 effect=NoSchedule,则调度器不会把该 pod 调度到这一节点上。
  • 如果剩余的 Taint 中没有 NoSchedule 的效果,但是有 PreferNoSchedule 效果,则调度器会尝试不会 pod指派给这个节点
  • 如果剩余 Taint 的效果有 NoExecute 的,并且这个 pod已经在该节点运行,则会被驱逐;如果没有在该节点运行,也不会再被调度到该节点上。
kubectl taint nodes node1 key1=value1:NoSchedule  
kubectl taint nodes node1 key1=value1:NoExecute  
kubectl taint nodes node1 key2=value2:NoSchedule

到了这里,关于K8s的亲和、反亲和、污点、容忍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S亲和性,反亲和性,及污点

    nodeName:硬匹配,不走调度策略 nodeSelector:根据节点的标签选择,会走调度的算法 只要是走调度算法,在不满足预算策略的情况下,所有pod都是pending node节点的亲和性: 硬策略:必须满足的条件。匹配原则也是根据节点的标签 软策略:尽量满足你的要求,而不是一定满足

    2024年01月16日
    浏览(31)
  • k8s概念-污点与容忍

    k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。 此时就需要用到污点(Taint)和容忍(Toleration),这些配

    2024年02月14日
    浏览(30)
  • k8s之亲和性、污点

    目录 亲和性 键值运算关系 硬策略 软策略 Pod亲和性与反亲和性 污点(Taint) 和 容忍(Tolerations) 污点(Taint)  容忍(Tolerations) 维护操作 故障排除步骤 官方介绍:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ (1)节点亲和性 pod.spec.nodeAffinity ●preferredDuringSchedulingIgnore

    2024年02月06日
    浏览(34)
  • k8s--基础--20--污点和容忍度

    节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。 Taint(污点)与节点亲和性相反,它使节点能够排斥一类特定的pod。 Taint(污点)和toleration(容忍度)相互配合,可以用来避免pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个taint,这

    2024年02月07日
    浏览(27)
  • k8s-污点 (Taint)和容忍 (Tolerations)

    节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点 Taint 则相反,它使节点能够排斥一类特定的 Pod Taint 和 Toleration 相互配合,可以用来避免 Pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些

    2024年01月16日
    浏览(32)
  • k8s--基础--污点和容忍度 -- use

    节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。 Taint(污点)与节点亲和性相反,它使节点能够排斥一类特定的pod。 Taint(污点)和toleration(容忍度)相互配合,可以用来避免pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个taint,这

    2024年02月11日
    浏览(25)
  • 十七、K8S-污点(Taint)和容忍度(toleration)

    目录 一、什么是污点和容忍度 1、官方解释: 2、自我理解: 3、污点 1、污点的组成: 2、污点的三种策略:         1、PreferNoSchedule         2、NoExecute          3、NoSchedule  4、容忍 1、Toleration基本用法 2、用法: 3、注意: 二、使用演示 三、Pod优先级调度 1、调度策略:

    2024年02月20日
    浏览(26)
  • K8S之运用污点、容忍度设置Pod的调度约束

    taints 是键值数据, 用在节点上 ,定义污点; tolerations 是键值数据, 用在pod上 ,定义容忍度,能容忍哪些污点。 污点 是定义在k8s集群的节点上的键值属性数据,可以决定拒绝那些pod。 给了Node选则的主动权,给Node打个污点, 不容忍 的Pod就调度不上来。 现象:刚部署好的

    2024年02月19日
    浏览(26)
  • k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain

    node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配,不走调度策略,node01 nodeSelector:根据节点的标签选择,会走调度的算法 只要是走调度算法,在不满足预算策略的情况下,所有

    2024年01月21日
    浏览(42)
  • 【云原生|Kubernetes】15-Kubernetes的污点和容忍详解

    ​ 污点(Taint)是指标记节点的一种机制,用于告诉 Kubernetes 集群这个节点上的 Pod 是有问题的,例如某些节点资源已经不足等。当节点被标记为污点时,Kubernetes 调度器将不会将新的 Pod 分配到这个节点上,除非这个 Pod 明确地声明了它可以容忍这个节点上的污点。污点通常

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包