k8s污点与容忍

2021年11月25日 阅读数:5
这篇文章主要向大家介绍k8s污点与容忍,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

污点(taints)与容忍(tolerations)

污点taints是定义在节点之上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上, 除非该Pod对象具备接纳节点污点的容忍度。而容忍度tolerations是定义在 Pod对象上的键值型属性数据,用于配置其可容忍的节点污点,并且调度器仅能将Pod对象调度至其可以容忍该节点污点的节点之上.node

定义污点和容忍度

污点定义在节点的node Spec中,而容忍度则定义在Pod的podSpec中,它们都是键值型数据,但又都额外支持一个效果effect标记,语法格式为key=value:effect,其中key和value的用法及格式与资源注俯-信息类似, 而effect则用于定义对Pod对象的排斥等级,它主要包含如下三种类型:nginx

 

NoScheduleapi

不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,节点上现存的Pod对象不受影响。bash

PreferNoScheduleapp

NoSchedule的柔性约束版本,即不能容忍此污点的新Pod对象尽可能不要调度至当前节点,不过无其余节点可供调度时也容许接受相应的Pod对象。节点上现存的Pod对象不受影响。ide

NoExecuteui

不能容忍此污点的新Pod对象不可调度至当前节点,属于强制型约束关系,并且节点上现存的Pod对象因节点污点变更或Pod容忍度变更而再也不知足匹配规则时,Pod对象将被驱逐。spa

 

在Pod对象上定义容忍度时,它支持两种操做符:一种是等值比较Equal,表示容忍度与污点必须在key、value和effect三者之上彻底匹配;另外一种是存在性判断Exists,表示两者的key和effect必须彻底匹配,而容忍度中的value字段要使用空值。3d

 

Node1打污点:

对于没有控制器的pod,打完污点就会自动删除;若是有deploy控制器控制pod副本数,当前节点打污点,为了保持副本数一致,排除当前node节点,会在其余node节点运行。code

[root@master ~]# kubectl taint nodes node1 check=mew:NoExecute
node/node1 tainted

k8s污点与容忍_k8s污点与容忍

查看node节点污点属性:

[root@master ~]# kubectl describe node node1

k8s污点与容忍_k8s污点与容忍_02

污点容忍:

当前k8s集群工三台机器,node1和node2都打污点.

Node1污点kay/value属性:

k8s污点与容忍_k8s污点与容忍_03

Node2污点kay/value属性:

k8s污点与容忍_k8s污点与容忍_04

建立pod,查看pod容忍:

[root@master afff]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
name: nginx-example
labels:
app: nginx
spec:
containers:
- name: test-nginx
image: nginx
tolerations:
- key: "check"
operator: "Equal"
value: "mew"
effect: "NoExecute"
tolerationSeconds: 3600

[root@master afff]# kubectl get pod -o wide

NAME            READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES

nginx-example   1/1     Running   0          3m56s   10.244.1.31   node1   <none>           <none>

k8s污点与容忍_k8s_05

注释:虽然全部节点都有污点,可是能容忍check=mew:NoExcute属性的节点。

1. 其中key,value,effect要与Node上设置的taint保持一致

2. Operator的值Exists将会忽略value值

3. tolerationSeconds用于描述当前pod须要被驱逐时能够在pod上继续保留运行的时间

当不指定key值时,表示容忍全部的污点key:

  tolerations:

      operator: "Exists"

当不指定effect值时,表示容忍全部的污点做用

  tolerations:

    - key: "check"

      operator: "Exists"

有多个master存在时,防止资源浪费,能够以下设置:

# kubectl taint nodes master01 node-role.kubernetes.io/master=:PreferNoSchedule

注释:新pod尽可能不要调度到此节点,当其余node无可调度时,在不影响当前node运行的pod下,能够调度到此节点。

删除污点:

[root@master afff]# kubectl taint  nodes node2 check=mew22:NoExecute-
node/node2 untainted
[root@master afff]# kubectl taint nodes node1 check=mew:NoExecute-
node/node1 untainted

k8s污点与容忍_k8s_06