kubernetes调度之污点(taint)和容忍(toleration)

系列目录

节点亲和性(affinity),是节点的一种属性,让符合条件的pod亲附于它(倾向于或者硬性要求).污点是一种相反的行为,它会使pod抗拒此节点(即pod调度的时候不被调度到此节点)

污点和容易结合在一起以确保pod不会被调度到不适合的节点上.当一个或者多个污点添加到某个节点上,则意味着此节点不会接受任何不容忍这些污点的pod.Tolerations作用于pod上,允许(但不是必须)pod被调度到有符合的污点(taint)的节点上

概念

可以使用kubectl taint为一个节点(node)添加污点(taint),例如:

kubectl taint nodes node1 key=value:NoSchedule

这样就把键为key,值为value,效果为NoSchedule的污点添加到了节点node1上.这样除非pod有符合的容忍(toleration),否则不会被调度到此节点上

可以通过以下命令删除刚添加的taint

kubectl taint nodes node1 key:NoSchedule-

你可以在创建pod的yml里指定一个关于toleration的PodSpec,以下两个容忍都会匹配前面创建的taint,因此它们中的任意一个创建的pod都会被调度到节点node1

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"

只有pod的keyeffect都和某一个污点的key与effect匹配,才被认为是匹配,并且要符合以下情形:

  • operatorExists(这种情况下value不应当指定)
  • operatorEqual 并且value相同

如果operator没有指定,则默认是Equal

以下两种情况为特殊情况:

1) 如果key是空(是指key没有指定,而不是指key为空字符串),operatorExists则匹配所有的key,valueeffect,也即匹配任何node,

tolerations:
- operator: "Exists"

2) 空的effect匹配所有effect

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

以上会匹配所有key为key的所有taint节点

前面的示例中使用了NoSchedule类型的effect.此外,也可以使用PreferNoSchedule类型的effect,这是一个优先选择或者软性版本的NoSchedule,调度系统会尽量避免调度不容忍这种污点的pod到带有此污点的节点上,但是并不是硬性要求.第三种effect类型:NoExecute会在晚些时候讲到

你可以为一个节点(node)添加多个污点,也可以为一个pod添加多个容忍(toleration).kubernetes处理多个污点(taint)或者多个容忍(toleration)类似于过滤器:起初包含所有污点,然后忽略掉pod匹配的污点,剩下不可被忽略的污点决定此节点对pod的效果,特别地:

1) 如果至少有一个不可忽略的NoSchedule类型的效果(effect),kubernetes不会调度pod到此节点上来.

2) 如果没有不可忽略的NoSchedule类型的效果(effect),但是至少有一个PreferNoSchedule类型的效果,则kubernetes会尝试调度pod到此节点上

3) 如果至少有一个NoExecute类型的效果(effect),则此pod会被驱离此节点(当然,前提此pod在此节点上),并且如果pod不在此节点上,也不会被调度到此节点上

所谓驱离是指pod被从此节点上移除,调度到其它节点上

示例,假如你有一个以下类型的节点

kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule

和以下类型的pod

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"

这种情况下,pod不会被调度到node1上,因为没有容忍(toleration)来匹配第三个taint.但是如果它运行在此节点上,它仍然可以继续运行在此节点上,因为它仅仅不匹配第三个taint.(而第三个taint的效果是NoSchedule,指示不要被调度到此节点)

通常情况下,一个效果类型为NoExecutetaint被添加到一个节点上后,所有不容忍此taint的pod会被马上驱离,容忍的永远不会被驱离.但是效果类型NoExecute可以指定一个tolerationSeconds字段来指示当NoExecute效果类型的污点被添加到节点以后,pod仍然可以继续在在指定时间内留存在此节点上.

例如:

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
  tolerationSeconds: 3600

它意味着如果pod运行在一个可以容忍的节点上,则它可以继续运行3600秒,然后被驱离,在此段时间内如果污点被移除,则pod不会被驱离.

以上可以理解为有条件容忍,即便匹配也不能一直运行在此节点上,只能在符合条件的时段内运行在此节点上.

实例:

tainttoleration可以非常灵活地把指示pod不要调度到不合适的节点或者把已经存在的pod驱离节点,以下列举出一些用例:

  • 专用节点 假如你想让某些节点供特定的用户专用,你可以为这些节点添加污点,例如:(kubectl taint nodes nodename dedicated=groupName:NoSchedule),然后给专用这些节点的pod添加容忍(toleration),容忍节点污点的pod被允许调度到节点上,当然也可以调度到集群中的其它节点上(没有taint的节点,有taint的必须容忍).如果你想要pod仅被调度到专用的节点,则需要添加标签(使用前面讲到过的亲和属性)

pod的亲和性是以pod为中心的,而节点的污点则是以节点为中心.想要使pod被调度到指定节点,需要亲和属性,想要节点排斥非专用pod,则需要使用taint,同时使用亲和性和污点可以保证专用节点被特定pod专用,特定pod仅使用专用节点

  • 配有特殊硬件的节点 在一个集群中,有部分节点包含特殊硬件(例如特殊GPU),理想的情况是把让不需要特殊硬件的pod不被调度到这些节点上以便为可能需要特殊硬件的节点留存空间,这种情况下就可以用给指定节点添加污点(taint)的方法来实现效果.(例如kubectl taint nodes nodename special=true:NoSchedule or kubectl taint nodes nodename special=true:PreferNoSchedule),然后给需要使用特殊硬件的pod添加符合的容忍(toleration).
  • 基于taint的驱离策略(测试功能),当节点出现问题时,把不容忍的pod驱离.

基于taint的驱离策略

前面我们提到过NoExecute效果类型的taint,它将对已经存在于此节点上的pod产生效果:

  • 不容忍此taint的pod会被马上驱离
  • 容忍此taint但是没有指定tolerationSeconds的pod将会永远运行在此节点
  • 容忍此taint但是包含tolerationSeconds属性的节点将会在此节点上留存指定时间(虽然容忍,但是是有条件的,仅在一段时间内容忍)

第三点的言外之意即为即便容忍,但是超过容忍时间后仍然会被驱离

此外,kubernetes 1.6引入了对节点问题的展示.也就是说当满足了特定条件,节点控制器会自动为符合条件的节点添加taint,以下是一些内置的taint

  • 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

在kubernetes 1.13版本,基于污点的驱离策略提升到beta级别并且默认开启,因此污点被node控制器(kubelete)自动添加,并且普通的以节点的Ready状态为基础的驱离策略被禁用.

这项beta功能,加上tolerationSeconds,允许节点来指定仍然可以留存长时间即便节目有一种或者多种匹配的问题

例如:一个包含多种本地状态的应用在节点发生网络分裂情况时希望仍然可以留存一点时间,期望在指定的时段内网络能恢复正常以避免被驱离.这种情况下容忍此节点的pod编排如下

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

请注意,如果用户没有在pod的配置中指定node.kubernetes.io/not-ready,则kubernetes会自动为pod配置加上node.kubernetes.io/not-ready tolerationSeconds=300属性.同样地,如果没有配置,则自动添加node.kubernetes.io/unreachable tolerationSeconds=300

DaemonSet类型的pod创建时自动为以下两种类型的taint添加NoExecute效果类型并且没有tolerationSeconds

  • node.kubernetes.io/unreachable
  • node.kubernetes.io/not-ready

这确保即便节点出现问题,DaemonSet也不会被驱离.

有条件节点taint

在kubernetes 1.12版,有条件为节点添加taint(TaintNodesByCondition)特征被提升为beta级别,节点生命周期控制器会自动根据节点的状态为节点添加taint.同样地调度器不检测node的状态,而是检测node 的污点(taint).这确保node的状态不影响哪些pod可以调度到此node上,用户可以选择通过添加相应的容忍(toleration)来忽略node的指定的问题(通过node的状态体现).注意TaintNodesByCondition仅添加NoSchedule类型的污点.NoExecute效果类型由TaintBasedEviction控制(此功能为1.13版本的beta功能)

从kubernetes 1.8开始,DaemonSet controller自动以下类型的为所有的daemon添加NoSchedule效果类型的容忍(toleration),来防止DeamonSet分裂

  • node.kubernetes.io/memory-pressure
  • node.kubernetes.io/disk-pressure
  • node.kubernetes.io/out-of-disk (only for critical pods)
  • node.kubernetes.io/unschedulable (1.10 or later)
  • node.kubernetes.io/network-unavailable (host network only)

添加了这些类型的容忍是为了向后兼容,你可以为DaemonSet添加任意类型的容忍

原文地址:https://www.cnblogs.com/tylerzhou/p/11026364.html

时间: 2024-10-08 10:02:51

kubernetes调度之污点(taint)和容忍(toleration)的相关文章

kubernetes调度器

在Kubernetes上,我们很少会直接创建一个Pod,在大多数情况下,会通过RC.Deployment.DaemonSet.Job等控制器完成对一组Pod副本的创建.调度和整个生命周期的自动化控制. 在早期的Kubernetes版本上,是没有这么多Pod副本控制器的,只有一个Pod副本控制器RC(Replication Controller).RC独立于所控制的Pod,并通过label标签关联控制目标Pod的创建和销毁等动作.随着Kubernetes的发展,RC也出现了新的继承者——Deplo

kubernetes调度及调度器性能调优

kubernetes调度器在kubernetes中,调度指的是将新生成的pod调度到合适的Node节点上,然后Node上对应的kubelet才能运行pod. 1.调度概述调度器通过kubernetes的watch机制来发现新生成的且未调度到Node上的pod.调度器会将发现的每一个未调度的pod调度到合适的Node上运行,调度器会使用以下所述的调度原则来做出调度选择. 2.kube-schedulerkube-sceduler时kubernetes集群中默认调度器,并且是集群控制面的一部分,ku

深入kubernetes调度之NodeSelector

本文主要介绍kubernetes调度框架中的NodeName和NodeSelector. 1 NodeName Pod.spec.nodeName用于强制约束将Pod调度到指定的Node节点上,这里说是"调度",但其实指定了nodeName的Pod会直接跳过Scheduler的调度逻辑,直接写入PodList列表,该匹配规则是强制匹配. 例子: apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-

图解kubernetes调度器预选设计实现学习

Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正 1. 基础设计 1.1 预选场景 预选顾名思义就是从当前集群中的所有的node中,选择出满足当前pod资源和亲和性等需求的node节点,如何在集群中快速选择这样的节点,是个复杂的问题 1.2 平均分布 平均分布主要是通过让一个分配索引来进行即只有当所有的node都在本轮分配周期内分配一次后,才开始从头进行分配,从而保证集群的

# IT明星不是梦 # kubernetes调度器学习基础概览

scheudler是kubernetes中的核心组件,负责为用户声明的pod资源选择合适的node,同时保证集群资源的最大化利用,这里先介绍下资源调度系统设计里面的一些基础概念 基础任务资源调度 基础的任务资源调度通常包括三部分: 角色类型 功能 node node负责具体任务的执行,同时对包汇报自己拥有的资源 resource manager 汇总当前集群中所有node提供的资源,供上层的scheduler的调用获取,同时根据node汇报的任务信息来进行当前集群资源的更新 scheduler

# IT明星不是梦 #图解kubernetes调度器SchedulingQueue核心源码实现

chedulingQueue是kubernetes scheduler中负责进行等待调度pod存储的对,Scheduler通过SchedulingQueue来获取当前系统中等待调度的Pod,本文主要讨论SchedulingQueue的设计与实现的各种实现, 了解探究其内部实现与底层源码,本系列代码基于kubernets1.1.6分析而来 SchedulingQueue设计 队列与优先级 队列与场景 类型 描述 通常实现 队列 普通队列是一个FIFO的数据结构,根据元素入队的次序依次出队 数组或者

图解kubernetes调度器ScheduleAlgorithm核心实现学习框架设计

ScheduleAlgorithm是一个接口负责为pod选择一个合适的node节点,本节主要解析如何实现一个可扩展.可配置的通用算法框架来实现通用调度,如何进行算法的统一注册和构建,如何进行metadata和调度流程上下文数据的传递 1. 设计思考 1.1 调度设计 1.1.1 调度与抢占 当接收到pod需要被调度后,默认首先调用schedule来进行正常的业务调度尝试从当前集群中选择一个合适的node 如果调度失败则尝试抢占调度,根据优先级抢占低优先级的pod运行高优先级pod 1.1.2 调

kubernter相关内容

1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级研究计划局(ARPA)的无线.卫星网的分组交换技术的研究问世,一不小心搞出了TCP/IP,由此出现了我们所熟知的Internet互联网. 早期的电脑体积大,价格昂贵,一般只用在科学研究领域,后来随着集成电路,半导体的发展,电脑逐渐出现在我们的日常生活中.由此,我们对互联网的依赖越来越多,到现在已经成

【免费下载】全套最新 5、Kubernetes 视频教程+教学资料+学习课件+源代码+软件开发工具

5.Kubernetes视频教程 网盘地址: 链接:https://pan.baidu.com/s/11W8KDUjk36USxdrA8p0t4A 提取码:43xt 加公众号 获取更多新教程 教程目录大纲 ./5.Kubernetes ├── 10.Kubernetes - Helm 及其它功能性组件 │?? ├── 1.笔记 │?? │?? ├── 1.部署 Helm.pdf │?? │?? ├── 2.使用 Helm 部署 dashboard .pdf │?? │?? ├── 3.使用 He