Taint 和 Toleration

节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 pod

Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上

污点(Taint)

I、污点 ( Taint ) 的组成

使用kubectl taint命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去

每个污点的组成如下:

key=value:effect

每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。当前 tainteffect 支持如下三个选项:

  • NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的Node 上
  • PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的Node 上
  • NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod驱逐出去

II、污点的设置、查看和去除

# 设置污点
kubectl taint nodes node1 key1=value1:NoSchedule
# 节点说明中,查找 Taints 字段
kubectl describe pod  pod-name
#结果:
`Taints:             key1=value1:NoSchedule`
# 去除污点
kubectl taint nodes node1 key1:NoSchedule-

测试启动三个副本的Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 3selector:matchLabels:app: myapprelease: stabeltemplate:metadata:labels:app: myapprelease: stabelenv: testspec: containers:- name: myappimage: nginximagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80
kubectl apply -f dep.yml

发现3个pod都调度到了node2节点上(node1有污点)

[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-5db79b5cb6-c6phz   1/1     Running   0          26s   10.244.2.30   node2   <none>           <none>
myapp-deploy-5db79b5cb6-gkqlc   1/1     Running   0          26s   10.244.2.29   node2   <none>           <none>
myapp-deploy-5db79b5cb6-qkjb7   1/1     Running   0          26s   10.244.2.28   node2   <none>           <none>

去除污点:

kubectl taint nodes node1 key1:NoSchedule-

删除一个pod后:
服务就可以调度到node1节点

[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-5db79b5cb6-c6phz   1/1     Running   0          35m   10.244.2.30   node2   <none>           <none>
myapp-deploy-5db79b5cb6-gkqlc   1/1     Running   0          35m   10.244.2.29   node2   <none>           <none>
myapp-deploy-5db79b5cb6-qkjb7   1/1     Running   0          35m   10.244.2.28   node2   <none>           <none>[root@master k8s]# kubectl delete pod myapp-deploy-5db79b5cb6-c6phz
pod "myapp-deploy-5db79b5cb6-c6phz" deleted[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-5db79b5cb6-dpcjf   1/1     Running   0          6s    10.244.1.34   node1   <none>           <none>
myapp-deploy-5db79b5cb6-gkqlc   1/1     Running   0          35m   10.244.2.29   node2   <none>           <none>
myapp-deploy-5db79b5cb6-qkjb7   1/1     Running   0          35m   10.244.2.28   node2   <none>           <none>

node1节点使用NoExecute:(发现原来在node1节点的pod被驱逐到node2)

[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-5db79b5cb6-dpcjf   1/1     Running   0          6s    10.244.1.34   node1   <none>           <none>
myapp-deploy-5db79b5cb6-gkqlc   1/1     Running   0          35m   10.244.2.29   node2   <none>           <none>
myapp-deploy-5db79b5cb6-qkjb7   1/1     Running   0          35m   10.244.2.28   node2   <none>           <none>[root@master k8s]# kubectl taint nodes node1 key1=value1:NoExecute
node/node1 tainted[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-5db79b5cb6-gkqlc   1/1     Running   0          52m   10.244.2.29   node2   <none>           <none>
myapp-deploy-5db79b5cb6-qkjb7   1/1     Running   0          52m   10.244.2.28   node2   <none>           <none>
myapp-deploy-5db79b5cb6-x9kc9   1/1     Running   0          2s    10.244.2.31   node2   <none>           <none>

容忍(Tolerations)

设置了污点的 Node 将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍 ( Toleration ) ,意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上

pod.spec.tolerations

tolerations:- key: "key1"operator: "Equal"value: "value1"  effect: "NoSchedule"  tolerationSeconds: 3600- key: "key1"  operator: "Equal"  value: "value1"  effect: "NoExecute"- key: "key2"  operator: "Exists"  effect: "NoSchedule"
  • 其中 key, vaule, effect 要与 Node 上设置的 taint 保持一致
  • operator 的值为 Exists 将会忽略 value 值
  • tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间

1、当不指定 key 值时,表示容忍所有的污点 key(master节点也会部署):

tolerations:
- operator: "Exists"

2、当不指定 effect 值时,表示容忍所有的污点作用

tolerations:
- key: "key"operator: "Exists"

3、有多个 Master 存在时,防止资源浪费,可以如下设置(还没有测试)

kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

例子1:
使用下面的容忍度:

tolerations:- key: "key1"  operator: "Equal"  value: "value1"  effect: "NoExecute"
[root@master k8s]# cat dep-tolerator.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 3selector:matchLabels:app: myapprelease: stabeltemplate:metadata:labels:app: myapprelease: stabelenv: testspec: tolerations:- key: key1operator: Equalvalue: value1effect: NoExecutecontainers:- name: myappimage: nginximagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80

查看结果会看到node1和node2都有部署

[root@master k8s]# kubectl apply -f dep-tolerator.yml
deployment.apps/myapp-deploy created
[root@master k8s]# kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-67d655bffc-7bn6n   1/1     Running   0          12s   10.244.2.32   node2   <none>           <none>
myapp-deploy-67d655bffc-9fqc2   1/1     Running   0          12s   10.244.1.36   node1   <none>           <none>
myapp-deploy-67d655bffc-vmmd4   1/1     Running   0          12s   10.244.1.35   node1   <none>           <none>

例子2:
使用

tolerations:
- operator: "Exists"
[root@master k8s]# cat dep-tolerator-all.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploynamespace: default
spec:replicas: 3selector:matchLabels:app: myapprelease: stabeltemplate:metadata:labels:app: myapprelease: stabelenv: testspec: tolerations:- operator: Existscontainers:- name: myappimage: nginximagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80
 kubectl apply -f dep-tolerator-all.yml

结果:会发现连master节点也调度 了

[root@master k8s]# kubectl get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
myapp-deploy-b9d684ff-2525s   1/1     Running   0          21m   10.244.2.33   node2    <none>           <none>
myapp-deploy-b9d684ff-bsrbg   1/1     Running   0          21m   10.244.0.8    master   <none>           <none>
myapp-deploy-b9d684ff-fggcg   1/1     Running   0          21m   10.244.1.37   node1    <none>           <none>

例子3:(容忍带有key: "key1"的)

tolerations:
- key: "key1"operator: "Exists"

k8s-污点和容忍度相关推荐

  1. K8S 污点和容忍度

    污点和容忍度 节点亲和性(详见这里) 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点. 这可能出于一种偏好,也可能是硬性要求. Taint(污点)则相反,它使节点能够排斥一类特定的 Po ...

  2. 图解 K8S(06):调度利器之污点与容忍度(压力驱逐)

    本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...

  3. Kubernetes 调度 - 污点和容忍度详解

    当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...

  4. 《Kubernetes知识篇:Kubernetes污点和容忍度》

    文章目录 一.简介 二.pod对象的排斥等级 三.污点且无容忍度 3.1.污点之排斥等级NoSchedule 3.2.污点之排斥等级NoExecute 3.3.污点之排斥等级PreferNoSched ...

  5. Pod 污点和容忍度

    Pod 污点和容忍度 给了节点选则的主动权,我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属性数据,可以定决定拒绝那些pod: taints是键值数据,用在节点上,定义污 ...

  6. 3.11 污点和容忍度

    文章目录 一.污点和容忍度介绍 1.显示污点信息 2.显示容忍度信息 3.污点因子 二.污点应用 三.污点容忍度应用 上一章节介绍了,pod的调度方式有选择器.节点亲和性.pod亲和性和反亲和性,本章 ...

  7. 云原生之Kubernetes:24、污点和容忍度详解

    文章目录 前言 1.概念引入 2.污点和容忍度配置 3.该如何配置? 4.内置污点 5.常用命令补充 6.实战:Taints and Tolerations 前言 Taint(污点)和Tolerati ...

  8. kubernetes 【调度和驱逐】【1】污点和容忍度

    kubernetes 学习污点和容忍度 tags: 策略 文章目录 kubernetes 学习污点和容忍度 1. 概念 2. 示例 3. 基于污点的驱逐 4. 基于节点状态添加污点 1. 概念 节点亲 ...

  9. Kubernetes 笔记(08)— Daemonset 产生缘由、yaml 描述、使用方法、污点和容忍度的定义及使用、静态 Pod

    DaemonSet,它会在 Kubernetes 集群的每个节点上都运行一个 Pod,就好像是 Linux 系统里的"守护进程"(Daemon). 1. 产生缘由 Deployme ...

  10. k8s污点容忍度概念介绍

    1. 概念介绍 污点(Taint) 应用于node身上,表示该节点有污点了,如果不能忍受这个污点的pod,你就不要调度/运行到这个节点上.如果是不能运行到这个节点上,那就是污点驱逐了. 容忍度(Tol ...

最新文章

  1. ubuntu利用apt-get卸载软件
  2. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
  3. Visual Studio Code 常用快捷键
  4. python计算每月工资-Python实现扣除个人税后的工资计算器示例
  5. mysql git 获取 稳定版本 源码_webmagic新版文档(更新中)
  6. Gtest在vs 2010上的配置
  7. php post请求 下载文件,POST请求 下载文件
  8. 终于要来了!苹果明年将推出11英寸版mini-LED屏iPad Pro
  9. 【基础】网络常见的9大命令,非常实用!
  10. 人工智能的Hello World!
  11. Pgadmin4转圈圈无法进入到界面(pgadmin v4一直卡在loading页面)
  12. 笔记本AutoCAD启动时闪退怎么办_autocad2010打开闪退怎么办?autocad2010闪退解决方法...
  13. Delphi XE8 TStyleBook的使用
  14. win7关于无线连接的服务器,win7网络连接受限
  15. JS实现俄罗斯方块小游戏
  16. finecms aip.php漏洞,FineCMS漏洞挖掘
  17. Arduino 用声音传感器制作简单的“声纹锁”
  18. Acorn Mac 7.1.1
  19. 高德地图 地理编码报result参数报 USERKEY_PLAT_NOMATCH INVALID_USER_SCODE
  20. 接触vsto,开发word插件的利器

热门文章

  1. flutter图片识别_Flutter 图片解码与缓存管理研究
  2. 王道计算机组成原理课代表 - 考研计算机 第四章 指令系统 究极精华总结笔记
  3. 华为:鸿蒙 Harmony OS 明年将正式登陆欧洲
  4. oracle大对象的存储,(16 ) Oracle数据库可以存储极大的对象,CLOB表示【16】大对象。...
  5. ICMAX解析无线路由器WAN口应该怎么设置
  6. 水晶报表打印s删除数据
  7. Javaweb学生信息管理系统(Mysql+JSP+MVC+CSS)
  8. 终于打通了《火焰之纹章——烈火之剑》
  9. JavaScript Dom编程艺术学习笔记(第4章)
  10. 用PHP写出自己喜欢的天气,我喜欢的天气作文