我们都知道 k8s 集群中 master 节点默认是存在不可调度的污点的,也就是普通的 pod 默认是不会被调度到 master 节点的,这也是 Taint(污点) 的作用。

在实际应用中,也可能会给 worker 节点也去添加污点,是为了达到避免 Pod 调度到特定的节点中。

本文将会介绍关于节点 Taint 的设置以及如何调度要具有 Taint 的节点

Taint

应用场景:

  • 专用节点,例如配备了特殊硬件的节点。
  • 基于 Taint 的驱逐

查看 Taint

kubectl describe node [node_name] | grep -i taints

添加 Taint

kubectl taint node [node_name] key=value:{effect}

其中 effect 可取值:

  • NoSchedule: 一定不能被调度(master节点默认存在该taint)
  • PreferNoSchedule: 尽量不要调度
  • NoExecute: 不仅不会调度,还会驱逐节点上已有的 pod

去除Taint

仅仅是在末尾添加了一个 -

kubectl taint node [node_name] key=value:{effect}-

Toleration

前面说到有污点的服务器是默认不会调度任何 pod 的,而 Toleration 就是用来打 Taint 的脸的。

使用 Toleration 可以允许 pod 被调度到存在污点的节点,当在特定场景下要使用存在污点的节点时,可做如下配置

apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
  template:
    spec:
      tolerations:
      - key: "disktype"                        # 污点的key
        operator: "{Equal|Exists}"     # 默认是Equal
        value: "ssd1"                      # 污点的value
        effect: "{NoSchedule|PreferNoSchedule|NoExcute}"
        tolerationSeconds: 3600

tolerationSeconds 只有在 effect 为 NoExcute 时使用,表示当正在运行的节点,被添加了和容忍度一样,且 effect 为 NoExcute 的污点时,该pod还能继续在节点中运行的时长,3600s。不配置该参数,则不会被驱逐,可以完全容忍。

这里重点说一下 operatorEqual是等于的意思,节点污点的 value 必须与指定 value 相等,如:节点污点为 disytype=ssd:NoSchedule,在上述示例中,指定的 value 为 ssd1,则依旧不能被调度;Exists是存在的意思,此时不可以指定 value ,只要节点污点中与容忍度指定的 key 和 effect 一致即可被调度。

说明

存在两种特殊情况:

如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key 、value 和 effect 都匹配,即这个容忍度能容忍任意 taint。

如果 effect 为空,则可以与所有键名 key1 的效果相匹配。

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0