我是靠谱客的博主 老迟到小熊猫,这篇文章主要介绍k8s调度之污点和容忍,现在分享给大家,希望可以做个参考。

污点和容忍官方文档:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/taint-and-toleration/

污点是定义在节点之上的键值类型的数据,用于让节点有能力拒绝调度器将一些Pod运行到节点上。容忍度是定义在Pod上的,用于配置该Pod可容忍的节点污点。

虽然污点和容忍度与节点亲和的目的都是影响Pod的调度结果,但节点亲和调度使Pod对象被吸引到某一类节点,而污点的作用相反,它为节点提供了排斥Pod的能力

污点和容忍度介绍

污点定义在节点的nodeSpec中,是键值类型的数据,但要额外加一个效用(effect)标识,格式为key=value:effect,其中key和value的用法及格式与标签类似,而效用标识则用于定义节点对Pod对象的排斥等级。效用标识主要有以下3种:

  1. NoSchedule:不能容忍此污点的Pod对象不可调度至当前节点,属于强制性约束关系,但添加此效用标识的污点不会影响节点上已有Pod运行
  2. PreferNoSchedule:NoSchedule的柔性约束版本,调度器尽量确保不能容忍此污点的Pod不会被调度至当前节点。添加此效用标识的污点同样不会影响节点上已有Pod运行
  3. NoExecute:不能容忍此污点的Pod对象不可调度至当前节点,属于强制性约束关系。假如为节点添加此效用标识的污点,节点上现存的Pod中不能容忍此污点的会被驱逐;能容忍此污点,但设置了tolerationSeconds属性,等待tolerationSeconds指定的时间污点还存在Pod也会被驱逐,未设置tolerationSeconds属性的Pod不会被驱逐

在Pod上定义容忍度需要指定key、vlaue、effect和操作符(operator),支持两种操作符:Equal(等值比较,默认)和Exists(存在性判断)

在定义容忍度时,可以使用下面几种形式:

  1. 指定key、value和effect,operator为Equal,表示容忍度和污点的key、value和effect必须相等
  2. 指定key和effect,operator为Exists,表示容忍度和污点的key和effect相等即可
  3. 指定effect,operator为Exists,表示容忍度和污点的effect相等即可
  4. 指定key,operator为Exists,表示容忍度和污点的key相等即可
  5. 只指定operator为Exists,表示容忍所有污点

定义节点污点

任何符合键值规范的字符串都可用于定义污点信息。kubectl taint命令用于管理节点的污点,语法如下:

复制代码
1
2
kubectl taint nodes <node-name> <taint-key>=<taint-value>:<effect> ...

例如,为节点192.168.122.20定义一个disktype=ssd:NoSchedule的污点

复制代码
1
2
kubectl taint nodes 192.168.122.20 disktype=ssd:NoSchedule

在这里插入图片描述
需要注意,即使key和value完全相同,但effect不同,就代表两个不同的污点。例如,再为192.168.122.20节点添加一个disktype=ssd:NoExecute污点:

复制代码
1
2
kubectl taint nodes 192.168.122.20 disktype=ssd:NoExecute

在这里插入图片描述

删除污点的语法如下,省略effect表示删除指定键名的所有污点

复制代码
1
2
kubectl taint nodes <node-name> <taint-key>[:effect]-

例如,删除192.168.122.20上的disktype=ssd:NoExecute污点:

复制代码
1
2
kubectl taint nodes 192.168.122.20 disktype:NoExecute-

在这里插入图片描述

如果希望删除节点上的所有污点,可以使用kubectl patch指令将节点的spec.taints属性置空。例如下面的命令:

复制代码
1
2
kubectl patch nodes 192.168.122.21 -p '{"spec":{"taints": []}}'

定义Pod容忍度

Pod对象的容忍度通过spec.tolerations字段定义,根据使用的操作符不同,主要有两种可用形式:一种是与污点信息完全匹配的等值关系;另一种是判断污点信息存在性的匹配方式。

下面是一个示例,基于Equal操作符,表示容忍节点上disktype=ssd:NoSchedule的污点

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
piVersion: apps/v1 kind: Deployment metadata: name: taint-toleration-equal spec: replicas: 5 selector: matchLabels: app: taint-toleration-equal template: metadata: labels: app: taint-toleration-equal spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: - key: disktype value: ssd effect: NoSchedule operator: Equal

如下图,Pod可以被调度到192.168.122.20节点,192.168.122.20节点具有污点disktype=ssd:NoSchedule
在这里插入图片描述

下面是另一个示例,基于Exists操作符,表示容忍节点上key为disktype,effect为NoExecute的污点

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: apps/v1 kind: Deployment metadata: name: taint-toleration-exists spec: replicas: 5 selector: matchLabels: app: taint-toleration-exists template: metadata: labels: app: taint-toleration-exists spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 tolerations: - key: disktype effect: NoExecute operator: Exists tolerationSeconds: 60 #能容忍此污点的时长,即如果超过此时间段此污点还存在Pod会被驱逐

取消192.168.122.20节点上的NoSchedule污点,然后添加一个NoExecute污点

复制代码
1
2
3
kubectl taint nodes 192.168.122.20 disktype:NoSchedule- kubectl taint nodes 192.168.122.20 disktype=ssd:NoExecute

在这里插入图片描述

查看Pod,如下图,可以被调度到192.168.122.20节点,但如果60s后192.168.122.20节点的disktype=ssd:NoExecute污点还存在Pod会被驱逐,因为设置了tolerationSeconds属性
在这里插入图片描述

最后

以上就是老迟到小熊猫最近收集整理的关于k8s调度之污点和容忍的全部内容,更多相关k8s调度之污点和容忍内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(89)

评论列表共有 0 条评论

立即
投稿
返回
顶部