技术笔记分享

官方文档:https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/#example-use-cases

污点(taint)是定义在Node之上的键值型的数据,用于让节点拒绝将Pod调度运行于其上,除非该Pod对象具有接纳Node污点的容忍度。而容忍度(tolerations)是定义在Pod对象的键值型属性数据,用于·配置其可容忍的Node污点,而且调度器仅能将Pod对象调度至其能够容忍该Node污点的Node之上。

如下图所示:
Pod-A具备k8s-node01污点的容忍度,所以能够被调度器调度至k8s-node01上。
Pod-A不完全具备k8s-node02污点的容忍度,所以不能被调度至k8s-node02。
Pod-A虽然具备容忍度,但同样可以调度至没有污点的k8s-node03节点上。
Pod-B自身没有容忍度,所以只能被调度至没有污点的k8s-node03节点上。

undefined

污点介绍及定义

1.污点类型介绍

污点定义在nodeSpec中,容忍度定义在PodSpec中,他们都是键值型数据,但又都额外支持一个效果(effect)标记,语法格式为 “key=value:effect” ,其中key和value的用法及格式与资源注解信息相似,而effect则用于定义对Pod对象的排斥等级,它主要包含以下三种排斥类型。

  • NoSchedule :为Node添加污点等级为NoSchedule,除容忍此污点的Pod以外的其它Pod将不在被调度到本机。
  • PreferNoSchedule:为Node添加污点等级为PreferNoSchedule,不能容忍此污点的Pod对象尽量不要调度到当前节点,如果没有其它节点可以供Pod选择时,也会接受没有容忍此污点的Pod对象。
  • NoExecute:为Node添加污点等级为NoExecute,能容忍此污点的Pod将被调度到此节点,而且节点上现存的Pod对象因节点使用了NoExceute等级的污点,则现存的Pod将被驱赶至其它满足条件的Node(除非现存Pod容忍了当前节点的污点)。

2.Master污点介绍

以kubeadm部署的kubernetes集群,其Master节点将自动添加污点信息以阻止不能容忍此污点的Pod对象调度至此节点,因此用户可以手动创建Pod来容忍Master的污点。

查看kubernetes集群中master节点的污点:

不过,有些系统级别应用,如kube-proxy或者kube-flannel等也是以Pod形式运行在集群上,这些资源在创建时就添加上了相应的容忍度以确保他们被 DaemonSet 控制器创建时能够调度至 Master 节点运行一个实例。

查看系统级别Pod的容忍度

另外,这类Pod是构成Kubernetes系统的基础且关键的组件,它们甚至还定义了更大的容忍度,从下面某kube-flannel实例的容忍度定义来看,它还能容忍那些报告了磁盘压力或内存压力的节点,以及未就绪的节点和不可达的节点,以确保它们能在任何状态下正常调度至集群节点上运行。

3.定义污点

定义污点语法
kubectl taint nodes <node-name> <key>=<value>:<effect>

node-name:指定需要打污点的Node主机名
key=value:指定污点的键值型数据
effect:为污点的等级

key名称长度上线为253个自负,可以使用字母或者数字开头,支持字母、数字、连接符、点号、下划线做为key或者value。
value最长是 63个字符。
污点通常用于描述具体的部署规划,它们的键名形式如 node-type、node-role、node-project、node-geo等。

1.添加污点
为k8s-node02添加污点,污点程度为NoScheduletype=calculate为标签

kubectl taint node k8s-node02 type=calculate:NoSchedule

2.查看污点

kubectl describe nodes k8s-node02 | grep Taints

这样的话我们创建Pod就不会被调度到我们打上污点的k8s-node02的节点上

3.创建Pod资源配置清单

我们创建3个Pod,看看其是否会将Pod调度到我们打污点Node上

4.查看Pod被调度的Node

下面三个Pod都被调度到了Node03上,效果可能不是很明显,我们为Node02打了污点,还有Node01没有体现出来

5.扩容Pod

我们将Pod扩容至9台,让Pod分配到Node01节点,可以直观的展现污点

以上调度了两台Pod到Node02,目前Node03和Node01都可以分配到Pod,而被打了污点的Node02无法分配Pod

6.删除污点

删除污点之需要指定标签的 key 及污点程度

kubectl taint node k8s-node02 type:NoSchedule-

容忍度介绍及定义

Pod对象的容忍度可以通过其spec.tolerations字段进行添加,根据使用的操作符不同,主要有两种可用的形式:

  • 1.容忍度与污点信息完全匹配的等值关系,使用Equal操作符。
  • 2.判断污点是否存在的匹配方式,使用Exists操作富。

容忍度所用到的参数tolerations,tolerations参数下的还有以下几个二级参数:

  • operator:此值被称为运算符,值可以为[Equal|Exists],Equal表示污点的key是否等于value(默认参数),Exists只判断污点的key是否存在,使用该参数时,不需要定义value。
  • effect:指定匹配的污点程度,为空表示匹配所有等级的污点,值可以为 [NoSchedule|PreferNoSchedule|NoExecut]。
  • key:指定Node上污点的键key。
  • value:指定Node上污点的值value。
  • tolerationSeconds:用于定于延迟驱赶当前Pod对象的时长,如果设置为0或者负值系统将立即驱赶当前Pod。(单位为秒)

1.为Node打上不同的等级污点

2.查看三个Node被打上的污点

3.创建容忍NoSchedule级别污点的Pod并查看Pod调度结果

4.创建容忍PreferNoSchedule级别污点的Pod并查看Pod调度结果

5.创建容忍NoExecute级别污点的Pod并查看调度结果

6.创建没有容忍度的Pod并查看调度结果

PreferNoSchedule污点级别为尽量不接受没有容忍此污点的Pod,如果没有其它节点可以供Pod选择时,也会接受没有容忍此污点的Pod对象。所以创建一个没有容忍度的Pod看其调度结果。

实践中,若集群中的一组机器专用于为运行非生产典型的容器应用而备置,而且它们可能随时按需上下线,那么就应该为其添加污点信息,以确保仅那些能够容忍此污点的非生产型Pod对象可以调度到其上,另外,某些有种特殊硬件的节点需要专用于运行一类有着SSD、或者GPU的设备,也应该为其添加污点信息以排除其它Pod对象。

发表评论

邮箱地址不会被公开。 必填项已用*标注