写点什么

44 K8S 之污点与容忍度

  • 2021 年 12 月 14 日
  • 本文字数:1569 字

    阅读完需:约 5 分钟

44 K8S之污点与容忍度

污点是定义在节点之上的键值型属性数据,用于让节点有能力主动拒绝调度器将 Pod 调度运行到节点上,除非该 Pod 对象具有接纳节点污点的容忍度。容忍度(tolerations)则是定义在 Pod 对象上的键值型属性数据,用于配置该 Pod 可容忍的节点污点。调度器插件 TaintToleration 负责确保仅那些可容忍节点污点的 Pod 对象可调度运行在上面。经典调度机制使用 PodToleratesNodeTaints 预选策略TaintTolerationPriority 优选函数完成该功能。


基于污点和容忍度的调度方式则是通过向节点添加污点信息来控制 Pod 对象的调度结果,从而给了节点控制何种 Pod 对象能够调度于其上的控制权。节点亲和调度使得 Pod 对象被吸引到一类特定的节点,而污点的作用则相反,它为节点提供了排斥特定 Pod 对象的能力。


污点定义在节点的 nodeSpec 中,而容忍度定义在 Pod 的 podSpec 中,它们都是键值型数据,但又都额外支持一个效用(effect)标识,语法格式为 key=value:effect,其中 key 和 value 的用法及格式与资源注解信息相似,而污点上的效用标识则用于定义其对 Pod 对象的排斥等级,容忍度上的效用标识则用于定义其对污点的容忍级别。


NoSchedule:不能容忍此污点的 Pod 对象不可调度至当前节点,属于强制型约束关系,但添加污点对节点上现存的 Pod 对象不产生影响。


PreferNoSchedule:NoSchedule 的柔性约束版本,即调度器尽量确保不会将那些不能容忍此污点的 Pod 对象调度至当前节点,除非不存在其他任何能够容忍此污点的可用节点;添加该类效用的污点同样对节点上现存的 Pod 对象不产生影响。


NoExecute:不能容忍此污点的新 Pod 对象不可调度至当前节点,属于强制型约束关系,而且节点上现存的 Pod 对象因节点污点变动或 Pod 容忍度变动而不再满足匹配条件时,Pod 对象将会被驱逐。


一个节点可以配置使用多个污点,而一个 Pod 对象也可以有多个容忍度,将一个 Pod 对象的容忍度套用到特定节点的污点之上进行匹配度检测时将遵循如下逻辑

1)首先处理与容忍度匹配的污点。

2)对于不能匹配到容忍度的所有污点,若存在一个污点使用了 NoSchedule 效用标识,则拒绝调度当前 Pod 至该节点。

3)对于不能匹配到容忍度的所有污点,若都不具有 NoSchedule 效用标识,但至少有一个污点使用了 PreferNoScheduler 效用标识,则调度器会尽量避免将当前 Pod 对象调度至该节点。

4)如果至少有一个不能匹配容忍度的污点使用了 NoExecute 效用标识,节点将立即驱逐当前 Pod 对象,或者不允许该 Pod 调度至给定的节点;而且,即便容忍度匹配到使用了 NoExecute 效用标识的污点,若在 Pod 上定义容忍度时同时使用 tolerationSeconds 属性定义了容忍时限,则在超出时限后当前 Pod 也将会被节点驱逐。


仅使用 NoExecute 标识的污点变动会影响节点上现有的 Pod 对象,其他两个效用标识都不会影响节点上的现有 Pod 对象。


任何符合键值规范要求的字符串均可用于定义污点信息:可使用字母、数字、连接符、点号和下划线,且仅能以字母或数字开头,其中键名的长度上限为 253 个字符,值最长为 63 个字符。实践中,污点通常用于描述具体的部署规划,它们的键名形如 node-type、node-role、node-project 或 node-geo 等,而且一般还会在必要时带上域名以描述一些额外信息,例如 node-type.ilinux.io 等。


Pod 对象的容忍度通过其 spec.tolerations 字段添加,根据使用的操作符不同,主要有两种可用形式:一种是与污点信息完全匹配的等值关系;另一种是判断污点信息存在性的匹配方式,它们分别使用 Equal 和 Exists 操作符表示。


Pod 优先级使用 32 位的非负整数表示,可用值范围为[0,1000000000],值越大优先级越高,而大于 1000000000 的优先级预留给了系统级的关键类 Pod,以防止这些 Pod 被驱逐。Kubernetes 使用集群级别的 API 资源类型 PriorityClass 完成从优先级到名称的映射,并可由 Pod 在其规范中按名引用。


若期望全局禁用优先级抢占功能,需要编辑 kube-scheduler 的 KubeSchedulerConfiguration 配置,设定 DisablePreemption 参数的值为 true


发布于: 1 小时前阅读数: 9
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
44 K8S之污点与容忍度