k8s--基础--20--污点和容忍度

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

k8s–基础–20–污点和容忍度


1、什么是污点和容忍度

1.1、官方解释

  1. 节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。
  2. Taint(污点)与节点亲和性相反,它使节点能够排斥一类特定的pod。
  3. Taint(污点)和toleration(容忍度)相互配合,可以用来避免pod被分配到不合适的节点上。
  4. 每个节点上都可以应用一个或多个taint,这表示对于那些不能容忍这些taint的pod,是不会被运行在该节点上。
  5. 如果将toleration应用于pod上,则表示这些pod可以(但不要求)被调度到具有匹配taint的节点上。

1.2、自我理解:

  1. 污点和容忍度是相互匹配的关系,我们在node上定义一个污点,pod上定义容忍度
    1. 如果pod能容忍这个污点,就会被调度到拥有这个污点的节点上
    2. 如果pod不能容忍这个污点,就不会被调度到拥有这个污点的节点上
  2. 如果node节点上没有定义污点,那么任何pod都会调度到这个节点上
  3. 我们可以给node节点打一个污点,pod如果不能容忍这个节点上定义的污点,那就调度不到这个节点上
  4. taints:污点
    1. 定义在节点上,是键值数据
  5. tolerations:容忍度
    1. 定义在pod上,可以定义能容忍哪些污点

2、一个toleration和一个taint是怎么匹配的

2.1、案例

2.1.1、给node1节点增加一个taint

kubectl taint nodes node1 k1=v1:NoSchedule

给节点node1增加一个taint,它的key是k1,value是v1,effect是NoSchedule。
这表示只有拥有和这个taint相匹配的toleration的pod才能够被分配到node1这个节点。

2.1.2、给一个pod增加tolerations

tolerations:
- key: "k1"
  operator: "Equal"
  value: "v1"
  effect: "NoSchedule"

tolerations:
- key: "k1"
  operator: "Exists"
  effect: "NoSchedule"

上面两个容忍标签都与2.1.1创建的污点"匹配", 因此具有任一容忍标签的Pod都可以将其调度到node1上

2.2、总结

一个toleration和一个taint相"匹配"是指它们有一样的key和effect

  1. 如果 operator 是 Exists,此时toleration不能指定value
  2. 如果 operator 是 Equal,此时它们的value应该相等
  3. 如果一个toleration的effect为空,则key值与之相同的相匹配taint的effect可以是任意值。
    tolerations:
    - key: "key"
      operator: "Exists"
    

2.2.1、effect:用来定义节点污点对pod对象的排斥效果

  1. NoSchedule:不允许调度,已经调度的不受影响
  2. PreferNoSchedule
    1. 表示k8s将尽量避免将pod调度到这个污点的节点上,但是如果没有节点可以被调度,也是可以调度到拥有这个污点的node节点上的
  3. NoExecute:
    1. 当pod能够容忍这个节点污点,会被调度到节点
    2. 当pod不能容忍节点污点,将会被驱逐

2.2.2、注意

  1. 可以给一个节点添加多个taint
  2. 可以给一个pod添加多个toleration。

3、pod调度到节点的过程

3.1、原理

Kubernetes处理多个taint和toleration的过程就像一个过滤器,假设存在一个pod(A),存在一个节点(node1),A调度到node1的过程如下

  1. node1节点上的所有taint和A中的toleration匹配,过滤掉匹配掉的taint
  2. 过滤后,如果node1上不存在taint
    1. A可以分配到node1节点
  3. 过滤后,如果node1上存在taint,剩余taint的effect值决定了A是否会被分配到node1

3.1.1、过滤后,剩余taint的effect值决定了A是否会被分配到node1

  1. taint中存在一个以上effect值为NoSchedule的taint,则Kubernetes不会将A分配到node1节点上。
  2. taint中存在一个以上effect值为NoExecute的taint
    1. 如果A未在node1上运行,则Kubernetes不会将A分配到node1节点上
    2. 如果A在node1上运行,将A从该node1上驱逐
  3. taint中不存在effect值为NoSchedule的taint,但是存在effect值为PreferNoSchedule的taint,则Kubernetes会尝试将A分配到node1s上。

3.2、案例1

给node1节点添加了如下的taint

kubectltaintnodes node1 k1=v1:NoSchedule
kubectltaintnodes node1 k1=v1:NoExecute
kubectltaintnodes node1 k2=v2:NoSchedule

然后存在一个pod(A),它有两个toleration:

tolerations:
- key: "k1"
  operator: "Equal"
  value: "v1"
  effect: "NoSchedule"
- key: "k1"
  operator: "Equal"
  value: "v1"
  effect: "NoExecute"

在这个例子中,A不会被分配到node1节点,因为其没有toleration和第3个taint相匹配。

但是如果在给节点添加上述taint之前,该pod已经在上述节点运行,那么它还可以继续运行在该节点上,因为第三个taint是三个taint中唯一不能被这个pod容忍的。

通常情况下,如果给一个节点添加了一个effect值为 NoExecute 的taint,则任何不能忍受这个taint的pod都会马上被驱逐,任何可以忍受这个taint的pod都不会被驱逐。

但是,如果pod存在一个effect值为 NoExecute 的toleration指定了可选属性 tolerationSeconds 的值,则表示在给节点添加了上述taint之后,pod 还能继续在节点上运行的时间。例如,

tolerations:
- key: "k1"
  operator: "Equal"
  value: "v1"
  effect: "NoExecute"
  tolerationSeconds: 3600

这表示如果这个pod正在运行,然后一个匹配的taint被添加到其所在的节点,那么pod还将继续在节点上运行 3600 秒,然后被驱逐。如果在此之前上述taint被删除了,则pod不会被驱逐。

4、使用场景

  1. 可以灵活地让 pod避开某些节点
  2. 可以灵活地让 pod从某些节点驱逐。

4.1、专用节点

将某些节点专门分配给特定的一组用户使用

4.1.1、操作

操作1:给这些节点添加一个taint
kubectl taint nodes nodename dedicated=groupName:NoSchedule
操作2:给特定用户的pod添加一个相对应的 toleration

通过编写一个自定义的 admission controller

4.1.2、总结

  1. 拥有上述toleration的pod就能够被分配到上述专用节点,同时也能够被分配到集群中的其它节点。
  2. 如果你希望这些pod只能被分配到上述专用节点,那么你还需要给这些专用节点另外添加一个和上述taint类似的label(例如:dedicated=groupName),同时 还要在上述 admission controller 中给pod增加节点亲和性,要求上述pod只能被分配到添加了 dedicated=groupName 标签的节点上。

4.2、配备了特殊硬件的节点

在部分节点配备了特殊硬件(比如 GPU)的集群中,我们希望如下

  1. 不需要这类硬件的pod 不要 被分配到这些特殊节点
  2. 只有需要这类硬件的pod 才 被分配到这些特殊节点

4.2.1、操作

操作1:给配备了特殊硬件的节点添加taint
kubectl taint nodes nodename special=true:NoSchedule 
# 或者
# kubectl taint nodes nodename special=true:PreferNoSchedule 
操作2:给使用了这类特殊硬件的pod添加一个相匹配的 toleration

和专用节点的例子类似,添加这个toleration的最简单的方法是使用自定义 admission controller。比如
1. 我们推荐使用 Extended Resources 来表示特殊硬件,给配置了特殊硬件的节点添加taint时包含 extended resource 名称
2. 然后运行一个 ExtendedResourceToleration admission controller。

4.2.2、总结

此时,因为节点已经被打上taint了,没有对应toleration的pod会被调度到这些节点。但当你创建一个使用了 extended resource 的pod时,ExtendedResourceToleration admission controller 会自动给pod加上正确的toleration,这样pod就会被自动调度到这些配置了特殊硬件件的节点上。
这样就能够确保这些配置了特殊硬件的节点专门用于运行 需要使用这些硬件的 Pod,并且你无需手动给这些pod添加 toleration。

4.2、基于taint的驱逐

当节点出现问题,pod就不会被驱逐

5、基于taint的驱逐

5.1、taint的effect值为NoExecute,它会影响已经在节点上运行的pod

  1. 如果pod不能忍受effect值为NoExecute的taint,那么pod将马上被驱逐
  2. 如果pod能够忍受effect值为NoExecute的taint,但是在toleration定义中没有指定tolerationSeconds,则pod还会一直在这个节点上运行。
  3. 如果pod不能够忍受effect值为NoExecute的taint,而且指定了tolerationSeconds,则pod还能在这个节点上继续运行这个指定的时间长度。

5.2、当某种条件为真时,node controller会自动给节点添加一个taint

当前内置的taint如下

5.2.1、node.kubernetes.io/not-ready

  1. 节点未准备好。
  2. 相当于节点状态 Ready 的值为 “False”。

5.2.2、node.kubernetes.io/unreachable

  1. 节点控制器访问不到节点
  2. 相当于节点状态 Ready 的值为 “Unknown”。

5.2.3、node.kubernetes.io/out-of-disk

节点磁盘耗尽。

5.2.4、node.kubernetes.io/memory-pressure

节点存在内存压力。

5.2.5、node.kubernetes.io/disk-pressure

节点存在磁盘压力。

5.2.6、node.kubernetes.io/network-unavailable

节点网络不可用。

5.2.7、node.kubernetes.io/unschedulable

节点不可调度。

5.2.8、node.cloudprovider.kubernetes.io/uninitialized

如果kubelet启动时指定了一个 “外部” cloud provider,它将给当前节点添加一个taint将其标志为不可用。
在cloud-controller-manager的一个controller初始化这个节点后,kubelet将删除这个taint。

5.3、自动给节点添加和删除污点

  1. 在节点被驱逐时,节点控制器或者kubelet会添加带有NoExecute效应的相关污点。
  2. 在节点异常状态恢复正常,节点控制器或者kubelet会移除相关的污点。

5.4、怎么避免pod被大量驱逐

  1. 为了保证由于节点问题引起的pod驱逐rate limiting行为正常,系统实际上会以rate-limited 的方式添加taint。 在像 master 和 node 通讯中断等场景下,这避免了pod被大量驱逐。
  2. 使用这个功能特性,结合tolerationSeconds,pod就可以指定当节点出现一个或全部上述问题时还将在这个节点上运行多长的时间。

5.4.1、案例1

一个pod在网络断开时,仍然希望停留在当前节点上运行一段较长的时间,愿意等待网络恢复以避免被驱逐。在这种情况下,pod的toleration可能是下面这样的:

tolerations:
-key: "node.kubernetes.io/unreachable"
 operator: "Exists"
 effect: "NoExecute"
 tolerationSeconds: 6000

5.5、DefaultTolerationSeconds admission controller

给pod自动添加如下tolerations

tolerations:
-key: "node.kubernetes.io/not-ready"
 operator: "Exists"
 effect: "NoExecute"
 tolerationSeconds: 300

tolerations:
-key: "node.kubernetes.io/unreachable"
 operator: "Exists"
 effect: "NoExecute"
 tolerationSeconds: 300

  1. 这种自动添加toleration机制保证了在其中一种问题被检测到时pod默认能够继续停留在当前节点运行5分钟。
  2. 这两个默认toleration是由 DefaultTolerationSeconds admission controller添加的。
  3. DaemonSet中的pod被创建时,针对以下taint自动添加的NoExecute的toleration将不会指定tolerationSeconds,这保证了出现上述问题时DaemonSet中的pod永远不会被驱逐。
    node.kubernetes.io/unreachable
    node.kubernetes.io/not-ready

6、基于节点状态添加taint

  1. Node生命周期控制器会自动创建与Node条件相对应的带有NoSchedule效应的污点。同样,调度器不检查节点条件,而是检查节点污点。
    这确保了节点条件不会影响调度到节点上的内容。用户可以通过添加适当的pod容忍度来选择忽略某些Node的问题(表示为Node的调度条件)。

  2. 自Kubernetes1.8起,DaemonSet控制器自动为所有守护进程添加如下NoSchedule toleration以防DaemonSet崩溃
    node.kubernetes.io/memory-pressure
    node.kubernetes.io/disk-pressure
    node.kubernetes.io/out-of-disk (只适合 criticalpod)
    node.kubernetes.io/unschedulable (1.10 或更高版本)
    node.kubernetes.io/network-unavailable (只适合 host network)

    添加上述toleration确保了向后兼容,你也可以选择自由的向DaemonSet添加toleration。

7、pod容忍度,node污点 操作命令

7.1、给节点添加污点

kubectltaintnodes node1 k1=v1:NoSchedule

在node1上添加了污点. 这个污点的key是k1,value是v1, 污点的effect是NoSchedule
如果pod没有定义容忍度的话就不会调度到拥有这个污点的节点上

7.2、给节点移除污点

kubectl taint nodes node1 k1=v1:NoSchedule-

7.3、给Pod设置容忍

spec:
 tolerations: #设置容忍性
 - key: "test" 
   operator: "Equal"  # 如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal
   value: "16"
   effect: "NoSchedule"
  1. 意思是这个Pod要容忍的有污点的Node的key是test,value是16,effect是NoSchedule,
  2. 注意:
    1. tolerations属性下各值必须使用引号
    2. 容忍的值都是设置Node的taints时给的值。

7.4、修改effect为NoExecute

一般不要玩

kubectltaintnodes node1 k1=v1:NoExecute

7.5、tolerations属性补充

其中的key、value、effect与Node的Taint设置需保持一致,还有以下几点说明

  1. 如果operator的值是Exists,则value属性可省略。
  2. 如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。
  3. 如果不指定operator属性,则默认值为Equal。
  4. 还有两个特殊值:
    1. 空的key 如果再配合Exists,就能匹配所有的key与value,也就是能容忍所有node上的所有Taints。
    2. 空的effect,匹配所有的effect

8、验证

验证effect是NoSchedule情况

8.1、node1添加污点

kubectl taint nodes node1 k1=v1:NoSchedule

8.2、一个没有容忍度的pod

8.2.1、定义

vi /root/test2/tolerations-no.yaml  

内容

 
apiVersion: v1
kind: Pod
metadata:
  name: tolerations-no
spec:
  containers:
  - name: nginx
    image: nginx

8.2.2、执行

kubectl   apply   -f /root/test2/tolerations-no.yaml  
kubectl  get pods    
kubectl describe pods tolerations-no

k8s--基础--20--污点和容忍度

k8s--基础--20--污点和容忍度

显示pod不能容忍节点污点,不能完成调度

8.3、一个有容忍度的pod

8.3.1、定义

vi /root/test2/tolerations-yes.yaml  

内容

apiVersion: v1
kind: Pod
metadata:
  name: tolerations-yes
spec:
  containers:
  - name: nginx
    image: nginx
  tolerations:
  - key: k1
    value: v1
    effect: NoSchedule

8.3.2、执行

kubectl   apply   -f /root/test2/tolerations-yes.yaml  
kubectl  get pods   -o wide
 

k8s--基础--20--污点和容忍度

可以看到tolerations-yes已经完成调度了,可以调度到node1节点上文章来源地址https://www.toymoban.com/news/detail-469679.html

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

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

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

相关文章

  • K8s(二)Pod资源——node调度策略、node亲和性、污点与容忍度

    目录 node调度策略nodeName和nodeSelector 指定nodeName 指定nodeSelector node亲和性 node节点亲和性 硬亲和性 软亲和性 污点与容忍度 本文主要介绍了在pod中,与node相关的调度策略,亲和性,污点与容忍度等的内容 在创建pod等资源时,可以通过调整字段进行node调度,指定资源调度到满足

    2024年01月17日
    浏览(47)
  • 学习笔记十八:污点、容忍度

    给了节点选则的主动权,我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属性数据,可以定决定拒绝那些pod; taints是键值数据,用在节点上,定义污点; tolerations是键值数据,用在pod上,定义容忍度,能容忍哪些污点 pod亲和性是pod属性;但

    2024年02月12日
    浏览(31)
  • 【云原生】POD污点和容忍度

    节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint) 则相反——它使节点能够排斥一类特定的 Pod。 容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度

    2024年02月16日
    浏览(31)
  • k8s 污点和容忍

    在 Kubernetes 中,节点亲和性 NodeAffinity 是 Pod 上定义的一种属性,能够使 Pod 按我们的要求调度到某个节点上,而 Taints(污点) 则恰恰相反,它是 Node 上的一个属性,可以让 Pod 不能调度到带污点的节点上,甚至会对带污点节点上已有的 Pod 进行驱逐。当然,对应的 Kubernetes 可以

    2023年04月08日
    浏览(31)
  • k8s概念-污点与容忍

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

    2024年02月14日
    浏览(41)
  • K8s的亲和、反亲和、污点、容忍

    亲和性的原理其实很简单,主要利用label标签结合nodeSelector选择器来实现 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity。 从操作指令来讲,可以有ln、Notln、Exists、DoesN

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

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

    2024年01月16日
    浏览(40)
  • 【k8s】pod调度——亲和,反亲和,污点,容忍

    官方网址:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ pod.spec.nodeAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策略  p开头 ●requiredDuringSchedulingIgnoredDuringExecution:硬策略  r开头 pod.spec.affinity.podAffinity/podAntiAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策

    2024年02月05日
    浏览(42)
  • k8s打污点、取消污点、驱动pod

    在 Kubernetes 中,可以使用 kubectl taint 命令来打污点,它有以下语法: 其中, node-name 是节点的名称, key 和 value 是用于标识污点的键和值, effect 则指定了污点的影响。 例如,要在名为 node-1 的节点上打一个污点,使它不能被调度 NoSchedule ,可以使用以下命令: 这将在 node-

    2024年02月12日
    浏览(38)
  • 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日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包