kubenetes之污点和容忍度

容忍度(Tolerations)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。

用法:

可以使用kubectl给节点增加一个污点
kubectl taint nodes node1 key=value:NoSchedule

若要移除污点:
kubectl taint nodes node1 key:NoSedule-

您可以在 PodSpec 中定义 Pod 的容忍度。 下面两个容忍度均与上面例子中使用 kubectl taint 命令创建的污点相匹配, 因此如果一个 Pod 拥有其中的任何一个容忍度都能够被分配到 node1

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

下面是使用容忍度的一个pod

pods/pod-with-toleration.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "example-key"
    operator: "Exists"
    effect: "NoSchedule"

operator 的默认值是 Equal。

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

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

说明:
存在两种特殊情况:

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

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

effect 参数
effect :NoSchedule 当节点发生变化时,pod不会被驱逐
effect :PreferNoSchedule系统会 尽量 避免将 Pod 调度到存在其不能容忍污点的节点上, 但这不是强制的
effect :NoExecute 当节点发生变化时,pod会驱逐

使用例子

  • 专用节点:如果您想将某些节点专门分配给特定的一组用户使用,您可以给这些节点添加一个污点(即, kubectl taint nodes
    nodename dedicated=groupName:NoSchedule), 然后给这组用户的 Pod 添加一个相对应的
    toleration(通过编写一个自定义的 准入控制器,很容易就能做到)。 拥有上述容忍度的 Pod
    就能够被分配到上述专用节点,同时也能够被分配到集群中的其它节点。如果您希望这些 Pod
    只能被分配到上述专用节点,那么您还需要给这些专用节点另外添加一个和上述 污点类似的 label
    (例如:dedicated=groupName),同时 还要在上述准入控制器中给 Pod 增加节点亲和性要求上述 Pod
    只能被分配到添加了 dedicated=groupName 标签的节点上。
  • 配备了特殊硬件的节点:在部分节点配备了特殊硬件(比如 GPU)的集群中, 我们希望不需要这类硬件的 Pod
    不要被分配到这些特殊节点,以便为后继需要这类硬件的 Pod 保留资源。 要达到这个目的,可以先给配备了特殊硬件的节点添加 taint
    (例如 kubectl taint nodes nodename special=true:NoSchedule 或 kubectl
    taint nodes nodename special=true:PreferNoSchedule), 然后给使用了这类特殊硬件的
    Pod 添加一个相匹配的 toleration。 和专用节点的例子类似,添加这个容忍度的最简单的方法是使用自定义 准入控制器。
    比如,我们推荐使用扩展资源 来表示特殊硬件,给配置了特殊硬件的节点添加污点时包含扩展资源名称, 然后运行一个
    ExtendedResourceToleration 准入控制器。此时,因为节点已经被设置污点了,没有对应容忍度的 Pod
    会被调度到这些节点。但当你创建一个使用了扩展资源的 Pod 时, ExtendedResourceToleration 准入控制器会自动给
    Pod 加上正确的容忍度, 这样 Pod 就会被自动调度到这些配置了特殊硬件件的节点上。
    这样就能够确保这些配置了特殊硬件的节点专门用于运行需要使用这些硬件的 Pod, 并且您无需手动给这些 Pod 添加容忍度。

官方链接:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/taint-and-toleration/

你可能感兴趣的:(k8s)