污点和容忍度

污点:主体是node,在node上标记特定的键值对,以此来标识该node的特殊属性
容忍度:主体是pod,当pod被调度到有污点的node时,该pod能否容忍node的污点标记

在查看master节点的信息

~]# kubectl describe node master-node | grep Taints
Taints:     node-role.kubernetes.io/master:NoSchedule

可以看到master的节点集群在创建时已经被自动标记了taint,保证了创建未经指定容忍度的pod时,不会调度到master节点

节点污点

三种类型:

  • NoSchedule:不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,节点上现存的Pod对象不受影响。
  • PreferNoSchedule:NoSchedule的柔性约束版本,即不能容忍此污点的新Pod对象尽量不要调度至当前节点,不过无其他节点可供调度时也允许接受相应的Pod对象。节点上现存的Pod对象不受影响。
  • NoExecute:不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,而且节点上现存的Pod对象因节点污点变动或Pod容忍度变动而不再满足匹配规则时,Pod对象将被驱逐。

污点设置:

kubectl taint nodes node2 test=slave:NoSchedule

撤销污点:

kubectl taint nodes node2 test:NoSchedule-

pod容忍度

当node已经设定了污点,通过设置容忍度将pod调度到相应的节点上

示例:

...
tolerations:
  - key: "key"
    operator: "Equal" 
    value: "value"
    effect: "NoScheduale"
...

operator: 没指定默认为Equal,当为Equal时value必须指定并且key的值和vaule的值匹配才能执行,当为Exists时可以不写value

此外,空的 key(是指key没有指定,而不是指key为空字符串) 如果再配合operator Exists 就能匹配所有的 key 与 value,也是能容忍所有 node 的所有 Taints,空的 effect 匹配所有的 effect

当配置NoExecute时,pod可以通过设定tolerationSeconds(秒),表示pod可以容忍该节点并在该节点继续运行指定的时间

比如,一个使用了很多本地状态的应用程序在网络断开时,仍然希望停留在当前节点上运行一段较长的时间, 愿意等待网络恢复以避免被驱逐。在这种情况下,Pod 的容忍度可能是下面这样的:

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

在k8s的集群中,当某种条件为真时,节点控制器会自动给节点添加一个污点。包括如下:

  • node.kubernetes.io/not-ready:节点未准备好。这相当于节点状态 Ready 的值为 "False"。
  • node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状态 Ready 的值为 "Unknown"。
  • node.kubernetes.io/out-of-disk:节点磁盘耗尽。
  • node.kubernetes.io/memory-pressure:节点存在内存压力。
  • node.kubernetes.io/disk-pressure:节点存在磁盘压力。
  • node.kubernetes.io/network-unavailable:节点网络不可用。
  • node.kubernetes.io/unschedulable: 节点不可调度。
  • node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个 "外部" 云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。

daemonset 容忍度的添加

DaemonSet 控制器自动为所有守护进程添加如下 NoSchedule 容忍度(不同版本有差别)以防 DaemonSet 崩溃:

  • node.kubernetes.io/memory-pressure
  • node.kubernetes.io/disk-pressure
  • node.kubernetes.io/out-of-disk (只适合关键 Pod)
  • node.kubernetes.io/unschedulable (1.10 或更高版本)
  • node.kubernetes.io/network-unavailable (只适合主机网络配置)
    添加上述容忍度确保了向后兼容,您也可以选择自由向 DaemonSet 添加容忍度

另外:在集群运行的过程中当节点由于资源的紧缺,会出现集群自动将资源紧缺的节点标记污点,让无法忍受的pod自动剥离该node

posted @ 2021-06-29 15:10  fat_girl_spring  阅读(134)  评论(0编辑  收藏  举报