文章目录

  • 一、简介
  • 二、pod对象的排斥等级
  • 三、污点且无容忍度
    • 3.1、污点之排斥等级NoSchedule
    • 3.2、污点之排斥等级NoExecute
    • 3.3、污点之排斥等级PreferNoSchedule
  • 四、污点且有容忍度
    • 4.1、容忍度NoSchedule之通配
    • 4.2、容忍度NoExecute完全匹配
    • 4.3、容忍度NoSchedule完全匹配
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?

一、简介

Kubernetes官方文档:污点和容忍度
kubernetes污点和容忍度测试用例

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


二、pod对象的排斥等级

NoSchedule
如果新创建pod没有设置容忍度的话,那么该pod不会被调度,但是不会影响之前已经调度的pod。

NoExecute
既影响调度过程,又影响现存的pod,如果已经存在的pod不能容忍节点后来加的污点,这个pod就会被驱逐。

PreferNoSchedule
尽量避免将Pod调度到具有污点的节点上,如果集群中有没有污点的节点则优先调度到干净节点,如果所有工作节点都被打上污点,则也可以正常调度到这些有污点的工作节点上。

如下图所示:


三、污点且无容忍度

问题一:为什么master节点的污点排斥等级为Noschedule,却有pod可以被调度呢?

原因:因为这些可以被调度的pod都设置了容忍度NoExecute,而NoExecute排斥等级高于Noschedule,可以向下包容的,所以可以被调度。如下所示:


3.1、污点之排斥等级NoSchedule

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-16增加一个污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule


若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 3           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:

结论:由于k8s-worker-16节点有污点,且没有配置pod容忍度,所以pod无法被调度到k8s-worker-16节点,而当前k8s集群工作节点只有k8s-worker-16和k8s-worker-21,所以pod全部被调度到另外一台工作节点,即k8s-worker-21节点上。

4、使用命令kubectl taint给节点k8s-worker-21增加一个污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

5、创建Deployment,观察pod调度情况

[root@k8s-client-17 yaml]# kubectl delete -f taintNoSchedule.yaml
deployment.apps "nginx-deployment" deleted
[root@k8s-client-17 yaml]# kubectl apply -f taintNoSchedule.yaml
deployment.apps/nginx-deployment created
[root@k8s-client-17 yaml]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-845d4d9dff-4hp4h   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
nginx-deployment-845d4d9dff-6shr8   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
nginx-deployment-845d4d9dff-fxk2s   0/1     Pending   0          5s    <none>   <none>   <none>           <none>

如下所示:

结论:由于k8s-worker-16节点和k8s-worker-21节点都被打上污点,且没有配置pod容忍度,所以新创建的pod无法被调度到这两个节点,而当前k8s集群工作节点只有k8s-worker-16和k8s-worker-21,无其他工作节点,所以新创建的pod无法调度到合适的节点,pod会一直处于Pending状态。

6、k8s-worker-21移除污点

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-
node/k8s-worker-21 untainted
[root@k8s-client-17 yaml]# kubectl describe node k8s-worker-21 | grep Taints
Taints:             <none>

7、创建Deployment,观察pod调度情况

结论:k8s-worker-21移除污点,重新创建pod,则该pod可以正常调度到k8s-worker-21节点上。


3.2、污点之排斥等级NoExecute

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-21增加一个污点,排斥等级为NoExecute,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoExecute
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoExecute

若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-21 deploy=nginx:NoExecute-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 3           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:

结论:k8s-worker-21工作节点被打上污点,排斥等级为NoExecute,且没有配置pod容忍度的话,会自动删除该节点上已经存在的pod。


3.3、污点之排斥等级PreferNoSchedule

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-21增加一个污点,排斥等级为NoExecute,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:PreferNoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:PreferNoSchedule

若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-21 deploy=nginx:PreferNoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim taintNoSchedule.yaml
apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80

如下图所示:

结论:k8s-worker-16和k8s-worker-21工作节点被打上污点,排斥等级为PreferNoSchedule,且没有配置pod容忍度的话,经观察pod可以正常调度到k8s-worker-16和k8s-worker-21工作节点上。


四、污点且有容忍度

容忍度属性字段参数详解,如下图所示:


4.1、容忍度NoSchedule之通配

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-
kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-1.yamlapiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Exists"  #表示等值关系,只要对应的键是存在的,exists,其值被自动定义成通配符value: ""  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等effect: "" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,空意味着匹配所有的排斥等级

如下图所示:

结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoExecute,yaml文件中定义的tolerations属性,operator等值关系为Exists,其值被自动定义成通配符value和effect对应的值为空,表示匹配value和effect值为任意值,即被打上污点的节点key对应的值为deploy,value的值为任意值,effect排斥等级为NoSchedule或NoExcuete或PreferNoschedule均可被容忍,即可正常调度到该节点。


4.2、容忍度NoExecute完全匹配

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoExecute
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoExecute
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoExecute
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoExecute

若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoExecute-
kubectl taint node k8s-worker-21 deploy=nginx:NoExecute-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-2.yamlapiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Equal"  #表示等值关系,即必须完全匹配,effect字段、value值必须与节点保持一致value: "nginx"  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等,不能为空effect: "NoExecute" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,不能为空 tolerationSeconds: 30 #表示容忍的时间周期,必须是NoExecute,否则该字段将被忽略,没有设置,这意味着永远容忍污染,不会驱逐,0和负值将被视为0表示立即驱逐

如下图所示:

等待30秒后,如下图所示:

说明:这里设置为30秒,符合污点的节点创建并且运行1分钟后进入回收状态,新的pod又调度到此节点,一分钟后再次删除,创建、删除…一直下去。

结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoExecute,yaml文件中定义了pod的容忍度为NoExecute,与当前k8s-worker-16节点和k8s-worker-21节点污点排斥等级一致,则是可以正常调度的。这里要注意的是tolerationSeconds: 30,表示容忍的时间周期,必须是NoExecute,否则该字段将被忽略,没有设置,这意味着永远容忍污染,不会驱逐,0和负值将被视为0表示立即驱逐。


4.3、容忍度NoSchedule完全匹配

1、k8s集群worker节点默认是没有污点的,如下图所示:

2、使用命令kubectl taint给节点k8s-worker-16和k8s-worker-21增加污点,如下图所示:

[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule
node/k8s-worker-16 tainted
[root@k8s-client-17 yaml]# kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule
node/k8s-worker-21 tainted
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-16 | grep Taints
Taints:             deploy=nginx:NoSchedule
[root@k8s-client-17 yaml]# kubectl describe nodes k8s-worker-21 | grep Taints
Taints:             deploy=nginx:NoSchedule

若要移除上述命令所添加的污点,你可以执行:

#移除污点
kubectl taint node k8s-worker-16 deploy=nginx:NoSchedule-
kubectl taint node k8s-worker-21 deploy=nginx:NoSchedule-

3、创建Deployment,观察pod调度情况,如下所示:

vim tolerations-3.yaml apiVersion: apps/v1      #apiVersion是当前配置格式的版本
kind: Deployment         #kind是要创建的资源类型,这里是Deploymnet
metadata:                #metadata是该资源的元数据,name是必须的元数据项name: nginx-deploymentlabels:app: nginx
spec:                   #spec部分是该Deployment的规则说明replicas: 8           #relicas指定副本数量,默认为1selector:matchLabels:app: nginxtemplate:             #template定义Pod的模板,这是配置的重要部分metadata:           #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定labels:app: nginxspec:               #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80tolerations: #容忍度属性- key: "deploy"  #label标签名称,对等于app: nginx中左边的appoperator: "Equal"  #表示等值关系,即必须完全匹配,effect字段、value值必须与节点保持一致value: "nginx"  #label标签名称,对等于app: nginx中有右边的nginx,为空的话表示比配nginx="任意值",可以是app: nginx1或app: nginx2等,不能为空effect: "NoSchedule" #effect表示要匹配的排斥等级,NoSchedule、NoExecute、PreferNoSchedule,不能为空

如下图所示:

结论:k8s-worker-16节点和k8s-worker-21节点都被打上污点,排斥等级为NoSchedule,按照规则新创建的pod是调度不了的,但是在yaml文件中定义了pod的容忍度为NoSchedule,与当前k8s-worker-16节点和k8s-worker-21节点污点排斥等级一致,则是可以正常调度的。


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

《Kubernetes知识篇:Kubernetes污点和容忍度》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Visual Studio 快捷键 转载
  2. c 语言乘法代码,C++实现大数乘法算法代码
  3. C驱动程序是怎么跑起来的
  4. JDBC MySQL Servlet Java入门编写时的一些问题(html背景图片设置、input=date与Java和数据库之间的通信、SQL的基础语句与变量的编写)
  5. 深度学习综述(LeCun、Bengio和Hinton)
  6. Agile PLM 9.3.1 安装 checklist
  7. 想要成为Java架构师不容放过的知识—Maven的版本发布
  8. CCNA第二学期中文final
  9. python post请求实例_Python使用requests发送POST请求实例代码
  10. 2.用Python套用Excel模板,一键完成原亮样式
  11. python做excel表格柱状图_Python Excel 绘制柱形图
  12. java 图片组合 分解_切分和组合图片(二)
  13. api工具 graphql_为什么GraphQL是API的未来
  14. 生成器函数,推导式,生成器表达式
  15. solr 6.5.1 创建core失败的原因 Can‘t find resource ‘solrconfig.xml‘
  16. 机器学习常见的优化算法
  17. 第6章 Python 数字图像处理(DIP) - 彩色图像处理1 - RGB彩色模型,RGB to Gray,CMK和CMYK彩色模型,HSI彩色模型
  18. 安卓x5webview 加载网页 失败_#PY小贴士# 抓下来的网页为什么没有我要的内容?...
  19. 百合网“免费”革命 一场饮鸩止渴的大戏
  20. api文档 luci_开发OpenWrt路由器上LuCI的模块

热门文章

  1. C++ 两两交换链表中的节点
  2. 5分钟外设学堂:耳机不响别慌,换个插头能救活!
  3. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)
  4. 新浪微博第三方登录 文件不存在 c8998
  5. Windows7使用Programmer Dvorak键盘布局
  6. HALCON_XLD轮廓算子_二
  7. 天耀18期 -09.数组-排序【作业】.doc
  8. 阿里注资新浪微博 冲击最大的是腾讯
  9. VMware vSphere Client 安装虚拟机
  10. c++学习书籍推荐《C++程序设计语言(特别版)》下载