热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetestaint&toleration

一、概述前一篇文章讲解了Kubernetes亲和性调度,所涉及的内容都是描述pod的属性,来声明此pod希望调度到哪类nodes。而本文介绍的Taint(污点)刚好相反,它是nod


一、概述



前一篇文章讲解了 Kubernetes 亲和性调度
, 所涉及的内容都是描述 pod 的属性,来声明此 pod 希望调度到哪类 nodes。而本文介绍的 Taint(污点)
刚好相反,它是node 的一个属性,允许 node 主动排斥 pod 的调度。



对应的 k8s 又给 pod 新增了配套属性 toleration(容忍)
,用于表示这些 pod 可以(但不强制要求)被调度到具有相应 taints 的 nodes 上。


这两者经常一起搭配,来确保不将 pod 调度到不合适的 nodes。


看下 taint & toleration 结构体,下面足点介绍时会涉及相关字段。


type Taint struct {
Key string
Value string
Effect TaintEffect
// add taint 的时间点
// 只有 Effect = NoExecute, 该值才会被 nodeController 写入
TimeAdded *metav1.Time
}
type Toleration struct {
Key string
Operator TolerationOperator
Value string
Effect TaintEffect
// 容忍时间
TolerationSeconds *int64
}
type TaintEffect string
const (
TaintEffectNoSchedule TaintEffect = "NoSchedule"
TaintEffectPreferNoSchedule TaintEffect = "PreferNoSchedule"
TaintEffectNoExecute TaintEffect = "NoExecute"
)
type TolerationOperator string
const (
TolerationOpExists ToleratiOnOperator= "Exists"
TolerationOpEqual ToleratiOnOperator= "Equal"
)

二、Taint


我们可以对 node 设置多个 taints,当然也可以在 pod 配置相同个数的 tolerations。影响调度和运行的具体行为,我们可以分为以下几类:




  • 如果至少有一个 effect == NoSchedule
    的 taint 没有被 pod toleration,那么 pod 不会被调度到该节点上。


  • 如果所有 effect == NoSchedule
    的 taints 都被 pod toleration,但是至少有一个 effect == PreferNoSchedule
    没有被 pod toleration,那么 k8s 将努力尝试不把 pod 调度到该节点上。


  • 如果至少有一个 effect == NoExecute
    的 taint 没有被 pod toleration,那么不仅这个 pod 不会被调度到该节点,甚至这个节点上已经运行但是也没有设置容忍该污点的 pods,都将被驱逐。


三、Toleration


再看下 PodSpec 配置 Tolerations,其中的 key、value、effect 与 Node Taint 设置需要保持一致,operator 支持两类:



  • Exists: 这个配置下,不需要指定 value。

  • Equal: 需要配置 value 值。(operator 的默认值)


有几个特殊情况:


- key 为空并且 operator 等于 Exists,表示匹配了所有的 keys,values 和 effects。换句话说就是容忍了所有的 taints。


tolerations:
- operator: "Exists"

- effect 为空,则表示匹配所有的 effects(NoSchedule、PreferNoSchedule、NoExecute)


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


还有一个 TolerationSeconds
,该值与 effect 为 NoExecute
配套使用。用来指定在 node 添加了 effect = NoExecute 的 taint 后,能容忍该 taint 的 pods 可停留在 node 上的时间。


例如:


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

表示如果这个 pod 已经运行在 node 上并且该 node 添加了一个对应的 taint,那么这个 pod 将会在 node 上停留 3600 秒后才会被驱逐。但是如果 taint 在这个时间前被移除,那么这个 pod 也就不会被驱逐了。


来个比较形象的图,描述下:




该图参考: Taints and tolerations, pod and node affinities demystified · Banzai Cloud


四、内置行为


kubernetes 1.6 版本,node controller 会跟进系统情况自动设置 node taint 属性。


内置 taint key 如下:



  • node.kubernetes.io/not-ready: 节点尚未就绪

  • node.kubernetes.io/unreachable: 节点无法被访问

  • node.kubernetes.io/unschedulable: 节点不可调度

  • node.kubernetes.io/out-of-disk: 节点磁盘不足

  • node.kubernetes.io/memory-pressure: 节点有内存压力

  • node.kubernetes.io/disk-pressure: 节点有磁盘压力

  • node.kubernetes.io/network-unavailable: 节点网络不可用

  • node.kubernetes.io/pid-pressure: 节点有 pid 压力

  • node.cloudprovider.kubernetes.io/uninitialized: 云节点未初始化

  • node.cloudprovider.kubernetes.io/shutdown: 云节点已下线



kubernetes 会通过 DefaultTolerationSeconds admission controller
为创建的 pod 添加两个默认的 toleration: node.kubernetes.io/not-ready
node.kubernetes.io/unreachable
,并且设置 toleratiOnSeconds= 300
。当然这个默认配置,用户可以自行覆盖。


这些自动添加的默认配置,确保 node 出现问题后,pod 可以继续在 node 上停留 5 分钟。


DefaultTolerationSeconds admission controller 设置的 tolerationSeconds 值,也可以由用户指定。



具体参考: https://github.com/kubernetes/ ... on.go


还有一个默认行为,就是 DaemonSet。



所有 DaemonSet 创建的 pod 都会添加两个 toleration: node.alpha.kubernetes.io/unreachable
node.alpha.kubernetes.io/notReady
。设置 effect = NoExecute
,并且不指定 tolerationSeconds


目的是确保在 node 出现 unreachable 或 notReady 的问题时,DaemonSet Pods 永远不会被驱逐。


示例


常见的示例如下:




  • 专用节点




    • 如果你希望将一组节点专用于特定的用户,那可以将这些节点设置 taints: kubectl taint nodes nodename dedicated=groupName:NoSchedule
      , 然后为 pods 设置对应的 tolerations。

    • - 如果你希望节点被专用并且确保服务仅使用这批节点,那么你还应该向这批节点设置 labels (`dedicated=groupName`),并且为对应的 pods 设置 NodeAffinity,以控制 pods 只能跑到这批节点上。



  • 具有特殊硬件的节点


      - 有部分带有特殊硬件的节点,比如 GPU、FPGA 等,要确保不将不需要专用硬件的 pods 调度到这些节点。也可以和 `专有节点` 一样的方式设置 taints:`kubectl taint nodes nodename special=true:NoSchedule` 或 `kubectl taint nodes nodename special=true:PreferNoSchedule`。建议还可以通过 [Extended Resources](https://v1-12.docs.kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#extended-resources) 和 [ExtendedResourceToleration admission controller](https://v1-12.docs.kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#extendedresourcetoleration) 来更方便的调度依赖特殊硬件的 pods,而不需要手动添加容器的 toleration



  • 基于 taint 的驱逐


      - 前面也提到了,可以通过 `NoExecute taint` 来驱逐节点上已经运行的 pods。



五、参考资料



- community/taint-toleration-dedicated.md at master · kubernetes/community · GitHub



- community/taint-node-by-condition.md at master · kubernetes/community · GitHub



- Taints and Tolerations



- Taints and tolerations, pod and node affinities demystified · Banzai Cloud




推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • Iwanttointegratesort,order,maxandoffsetinafindAllquery.Thefollowingworksfine:我想在fin ... [详细]
  • vb6集成ad登录共享文件_SCSP实验2单点登录
    01—实验目的掌握单点登陆相关原理和深信服配置02—实验环境1.AC版本v12.0.42AC1地址:https:172.172.1.1AC2地址:htt ... [详细]
  • LinusTorvalds发布了 Linux4.17-rc1,关闭了合并窗口。Linux4.17的主 ... [详细]
author-avatar
x将臣x
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有