【k8s】【重要概念】详解污点和容忍度

举报
huahua.Dr 发表于 2022/09/30 17:11:57 2022/09/30
【摘要】 一、基本概念先弄清楚一下一些基本概念,才能理解污点和容忍度(1)节点亲和性和反亲和性我们的pod拉起来,需要使用节点来承载,那么我们是如何将pod调度到我们预期的节点上呢?我们可以给节点打上标签,然后在我们在控制pod调度的时候指定它可以调度到那些标签的节点上。那么是如何实现打标签的呢?K8s上面有个资源对象,节点选择器nodeSelector,它是节点上的一个属性,设置预期的节点标签,k8...

一、基本概念

先弄清楚一下一些基本概念,才能理解污点和容忍度

(1)节点亲和性和反亲和性

我们的pod拉起来,需要使用节点来承载,那么我们是如何将pod调度到我们预期的节点上呢?

我们可以给节点打上标签,然后在我们在控制pod调度的时候指定它可以调度到那些标签的节点上。那么是如何实现打标签的呢?

K8s上面有个资源对象,节点选择器nodeSelector,它是节点上的一个属性,设置预期的节点标签,k8s调度pod的时候,会读取节点的nodeSelector上的约束标签,k8s只会讲pod调度到我们设置的指定标签的节点上。

节点亲和性与nodeSelector的关系?

nodeSelector 提供了一种最简单的方法来将 Pod 约束到具有特定标签的节点上。 亲和性和反亲和性扩展了你可以定义的约束类型。

节点亲和性:指的是节点的标签约束pod可以调度到那些节点上,跟nodeSelector 功能差不多,有两种节点亲和性调度方式:

  • requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。
  • preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。

节点反亲和性:与节点亲和性相反,尽可能约束pod调度在不同的节点上,提高HA能力;当我们使用requiredDuringSchedulingIgnoredDuringExecution/preferredDuringSchedulingIgnoredDuringExecution设置节点调度策略时,支持的operator操作: In, NotIn, Exists, DoesNotExist, Gt, Lt. 其中,NotIn 和 DoesNotExist用于实现反亲和性。

二、什么是污点

了解了节点亲和性后,知道节点亲和性是pod的一种属性,它使pod被吸引到一类特定的节点。而污点(Taint)则相反,污点能够让节点排斥一类特定的pod,有点跟节点反亲和性类似。

三、什么是容忍度

容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。

污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的。

四、如何实现污点和容忍度

(1)给节点打上污点

执行命令:kubectl taint nodes <nodeName>  key1=value1:NoSchedule

例如执行如下命令,给node1节点添加node.kubernetes.io/out-of-disk污点:

kubectl taint nodes <nodeName> node.kubernetes.io/out-of-disk='':NoSchedule

(2)查询是够存在污点

1)执行命令:kubectl describe nodes <nodeName> |grep Taints

如果输出:Taints:             <none>则证明没有污点,否则存在污点

2)执行命令:kubectl get nodes paas-addon-1 -oyaml |grep taints:

如果输出不为空,则存在污点,否则不存在。

(3)消除污点

在添加污点的命令后面加上-即可

kubectl taint nodes <nodeName>  key1=value1:NoSchedule-

(4)在pod中设置容忍度

容忍度与kubectl taint 命令创建的污点相匹配, 因此如果一个 Pod 拥有key1或者等于key1污点,都能容忍,都能够被调度到  ,通过设置operator实现:

operator 的默认值是 Equal。

一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果:

  • 如果 operator 是 Exists (此时容忍度不能指定 value),
  • 如果 operator 是 Equal ,则它们的 value 应该相等

说明:存在两种特殊情况

  • 如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。
  • 如果 effect 为空,则可以与所有键名 key1 的效果相匹配。

例如:

apiVersion: v1

kind: Pod

metadata:

  name: nginx

  labels:

    env: test

spec:

  containers:

  - name: nginx

    image: nginx

    imagePullPolicy: IfNotPresent

tolerations:

- key: "key1"

  operator: "Equal"

  value: "value1"

  effect: "NoSchedule"

或者

apiVersion: v1

kind: Pod

metadata:

  name: nginx

  labels:

    env: test

spec:

  containers:

  - name: nginx

    image: nginx

    imagePullPolicy: IfNotPresent

tolerations:

- key: "key1"

  operator: "Exists"

  effect: "NoSchedule"

(5)污点和容忍度的协调

上述例子中 effect 使用的值为 NoSchedule,你也可以使用另外一个值 PreferNoSchedule、NoExecute等,

可以给一个节点添加多个污点,也可以给一个 Pod 添加多个容忍度设置。 Kubernetes 处理多个污点和容忍度的过程就像一个过滤器:从一个节点的所有污点开始遍历, 过滤掉那些 Pod 中存在与之相匹配的容忍度的污点。余下未被过滤的污点的 effect 值决定了 Pod 是否会被分配到该节点。

1) NoSchedule : Kubernetes 会尽量避免将 Pod 调度到存在其不能容忍污点的节点上, 但这不是强制的。

2)NoExecute:如果未被忽略的污点中存在至少一个 effect 值为 NoExecute 的污点, 则 Kubernetes 不会将 Pod 调度到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。

3)PreferNoSchedule:

  • 如果未被忽略的污点中不存在 effect 值为 NoSchedule 的污点, 但是存在至少一个 effect 值为 PreferNoSchedule 的污点, 则 Kubernetes 会 尝试 不将 Pod 调度到该节点。
  • 如果未被忽略的污点中不存在 effect 值为 NoSchedule 的污点, 但是存在至少一个 effect 值为 PreferNoSchedule 的污点, 则 Kubernetes 会 尝试 不将 Pod 调度到该节点。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。