找回密码
 立即注册
查看: 176|回复: 0

k8s摈除和污点容忍概念介绍

[复制链接]
发表于 2024-7-15 18:22 | 显示全部楼层 |阅读模式
1. 概念介绍

污点(Taint) 应用于node身上,暗示该节点有污点了,如果不能忍受这个污点的pod,你就不要调剂/运行到这个节点上。如果是不能运行到这个节点上,那就是污点摈除了。
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调剂器调剂带有对应污点的 Pod。或者允许这个pod继续运行到这个节点上。
可以看出来,污点和容忍度(Toleration)彼此配合,可以用来避免 Pod 被分配/运行到不合适的节点上。 每个节点上都可以应用一个或多个污点,每个pod也是可以应用一个或多个容忍度。
2. 污点详解

污点总共由4个字段组成:
key, value字段:可以任意字符。这个可以自定义。
Effect:NoExecute,PreferNoSchedule,NoSchedule 三选一

  • NoExecute暗示不能运行污点,意思是如果该节点有这种污点,但是pod没有对应的容忍度,那么这个pod是会被摈除的
  • NoSchedule暗示不能调剂污点,意思是如果该节点有这种污点,pod没有对应的容忍度,那么在调剂的时候,这个pod是不会考虑这个节点的
  • PreferNoSchedule 是NoSchedule的软化版。意思是如果该节点有这种污点,pod没有对应的容忍度,那么在调剂的时候,这个pod不会优先考虑这个节点,但是如果实在没有节点可用,它还是接受调剂到该节点上的。
TimeAdded : 这个污点是什么时候加的
  1. // The node this Taint is attached to has the ”effect” on
  2. // any pod that does not tolerate the Taint.
  3. type Taint struct {
  4.   // Required. The taint key to be applied to a node.
  5.   Key string `json:”key” protobuf:”bytes,1,opt,name=key”`
  6.   // Required. The taint value corresponding to the taint key.
  7.   // +optional
  8.   Value string `json:”value,omitempty” protobuf:”bytes,2,opt,name=value”`
  9.   // Required. The effect of the taint on pods
  10.   // that do not tolerate the taint.
  11.   // Valid effects are NoSchedule, PreferNoSchedule and NoExecute.
  12.   Effect TaintEffect `json:”effect” protobuf:”bytes,3,opt,name=effect,casttype=TaintEffect”`
  13.   // TimeAdded represents the time at which the taint was added.
  14.   // It is only written for NoExecute taints.
  15.   // +optional
  16.   TimeAdded *metav1.Time `json:”timeAdded,omitempty” protobuf:”bytes,4,opt,name=timeAdded”`
  17. }
复制代码
添加污点的方式也很简单:
  1. kubectl taint nodes node1 key1=value1:NoSchedule
  2. kubectl taint nodes node1 key1=value1:NoExecute
复制代码
k8s默认污点

  • http://node.kubernetes.io/not-ready:节点未筹备好,相当于节点状态Ready的值为False。
  • http://node.kubernetes.io/unreachable:Node Controller访谒不到节点,相当于节点状态Ready的值为Unknown
  • http://node.kubernetes.io/out-of-disk:节点磁盘耗尽
  • http://node.kubernetes.io/memory-pressure:节点存在内存压力
  • http://node.kubernetes.io/disk-pressure:节点存在磁盘压力
  • http://node.kubernetes.io/network-unavailable:节点网络不成达
  • http://node.kubernetes.io/unschedulable:节点不成调剂
  • http://node.cloudprovider.kubernetes.io/uninitialized:如果Kubelet启动时指定了一个外部的cloudprovider,它将给当前节点添加一个Taint将其标识表记标帜为不成用。在cloud-controller-manager的一个controller初始化这个节点后,Kubelet将删除这个Taint
3. 容忍度详解
  1. // Toleration represents the toleration object that can be attached to a pod.
  2. // The pod this Toleration is attached to tolerates any taint that matches
  3. // the triple <key,value,effect> using the matching operator <operator>.
  4. type Toleration struct {
  5.   // Key is the taint key that the toleration applies to. Empty means match all taint keys.
  6.   // If the key is empty, operator must be Exists; this combination means to match all values and all keys.
  7.   // +optional
  8.   Key string
  9.   // Operator represents a key&#39;s relationship to the value.
  10.   // Valid operators are Exists and Equal. Defaults to Equal.
  11.   // Exists is equivalent to wildcard for value, so that a pod can
  12.   // tolerate all taints of a particular category.
  13.   // +optional
  14.   Operator TolerationOperator
  15.   // Value is the taint value the toleration matches to.
  16.   // If the operator is Exists, the value should be empty, otherwise just a regular string.
  17.   // +optional
  18.   Value string
  19.   // Effect indicates the taint effect to match. Empty means match all taint effects.
  20.   // When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.
  21.   // +optional
  22.   Effect TaintEffect  //
  23.   // TolerationSeconds represents the period of time the toleration (which must be
  24.   // of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,
  25.   // it is not set, which means tolerate the taint forever (do not evict). Zero and
  26.   // negative values will be treated as 0 (evict immediately) by the system.
  27.   // +optional
  28.   TolerationSeconds *int64
  29. }
复制代码
容忍度应用在pod身上,可以看出来,对比污点,多了2个字段:
Operator: string类型,Exists,Equal 二选一
operator 的默认值是 Equal。
一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果,而且:

  • 如果 operator 是 Exists (此时容忍度不能指定 value), 例如这种
    tolerations:
    - key: ”key1”
      operator: ”Exists”
      effect: ”NoSchedule”
  • 如果 operator 是 Equal ,则它们的 value 应该相等。例如这种
  1. tolerations:
  2. - key: ”key1”
  3.   operator: ”Equal”
  4.   value: ”value1”
  5.   effect: ”NoSchedule”
复制代码
TolerationSeconds: 容忍时间。暗示在摈除之前,我还可以忍受你这个pod运行多久。只针对NoSchedule类型生效。
说明:
存在两种特殊情况:
如果一个容忍度的 key 为空且 operator 为 Exists, 暗示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。
如果 effect 为空,则可以与所有键名 key1 的效果相匹配。
TolerationSeconds: 容忍时间。如果没有设置默认是不容忍。
4. 污点摈除

污点摈除:node在运行过程中,被设置了NoExecute的污点,但是运行的pod没有对应的容忍度。因此需要将这些pod删除。
kcm中是nodelifeController控制污点摈除的。默认是开启的。如下参数默认是true。
  1. --enable-taint-manager=true --feature-gates=TaintBasedEvictions=true
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 21:11 , Processed in 0.133984 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表