k8s集群可以通过设置节点污点和pod容忍度来避免或者指定pod调度到目标节点。
给节点设置污点

kubectl taint nodes nodename key=value:effect

其中value值可以省略,effect有三个值可以选,分别是NoSchedule,NoExecute,PreSchedule。
去点污点

kubectl taint nodes nodename key:effect-

NoSchedule表示新的pod将不会调度到该节点,NoExecute表示新的pod将不会调度到该节点,已经在该节点上运行的pod将会被驱逐。PreSchedule表示尽量不会将新的pod调度到该节点。

如果希望将某些pod调度到设置有污点的节点上,则需要在pod的Spec中设置容忍度。例子如下:

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

operator的值默认为Equal
Equal表示value的值需要和taint设置的value值相等。
Exists表示可以不指定具体的value。
当pod的容忍度和节点的污点相匹配的时候,pod调度的时候便会忽略节点的污点。

注意:
如果只设置了Exists,则表示该Pod会匹配任意的key,value,effect,会容忍任意的taint。
如果effect为空,则可以与所有键名为key的污点相匹配。

当effect为NoExecute时,可以设置tolerationSeconds,如下所示

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

这个值表示已经在该节点上运行的pod的不会被立刻驱逐,还可以运行3600秒。 如果在此之前上述污点被删除了,则 pod 不会被驱逐。

通过结合taint和tolerations可以灵活的避免将某些pod调度到特殊的节点。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐