说明:

  Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署在打了污点的服务器上。

  Toleration是让Pod容忍节点上配置的污点,可以让一些需要特殊配置的Pod能够调用到具有

  污点和特殊配置的节点上

一、Taint配置解析

  1-1、创建一个污点(一个节点可以有多个污点)

kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT

  创建基本命令。例如在node1节点上面创建污点命令如下:

[root@k8s-master1 ~]# kubectl taint node node-1 node=node:NoSchedule
node/node-1 tainted

  1-2、污点类型

    NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响

    NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)

    PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点

  1-3、Toleration配置解析

#方式一完全匹配:
tolerations:
- key: "taintKey"
operator: "Equal"
value: "taintValue"
effect: "NoSchedule" #方式二不完全匹配:
tolerations:
- key: "taintKey"
operator: "Exists"
effect: "NoSchedule" #方式三大范围匹配(不推荐key为内置Taint)
tolerations:
- key: "taintKey"
operator: "Exists" #方式四匹配所有(不推荐):
tolerations:
- operator: "Exists" #停留时间配置:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 120 #停留120秒后在驱逐

  1-4、利用Deployment 控制器配置nginx容器指定到node-1节点部署示例

  • 节点上打上污点和标签
#禁止调度到该解决,如果不符合这个污点会立马驱逐(或在一段时间内)
[root@k8s-master1 taint]# kubectl taint node node-1 web=web:NoExecute
node/node-1 tainted #禁止调度到该节点,已经存在该节点上的pod不受影响。
[root@k8s-master1 taint]# kubectl taint node node-1 web=web:NoSchedule
node/node-1 tainted #给节点打上标签,利用spec.nodeSelector把创建的pod调度到设置的标签节点上面
[root@k8s-master1 taint]# kubectl label nodes node-1 web=web
node/node-1 labeled
  • 利用nodeSelector指定标签key:value部署容器到node-1节点。及结合Toleration配置Deployment。

  

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-taint
name: nginx-taint spec:
replicas: 1
selector:
matchLabels:
app: nginx-taint
template:
metadata:
labels:
app: nginx-taint
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
name: nginx-taint
nodeSelector:
web: "web" #这里是上面设置web=web标签。key:value例如:上面设置的是web:web
tolerations:
- key: "web" #这里是taint key名称 web
operator: "Equal" #匹配规则
value: "web" #这里是taint value值 web
  • 创建状态
[root@k8s-master1 taint]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-taint-68c7f46677-vk8xh 1/1 Running 0 6s 172.23.119.165 node-1 <none> <none>

  注:在使用nodeSelector的时候不能在tolerations下设置effect 匹配Taint规则

  • 在不使用nodeSelector指定标签。创建示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-taint
name: nginx-taint spec:
replicas: 1
selector:
matchLabels:
app: nginx-taint
template:
metadata:
labels:
app: nginx-taint
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
name: nginx-taint
tolerations:
- key: "web"
operator: "Equal"
value: "web"
effect: "NoExecute" #指定Taint 污点规则
  • 创建状态
[root@k8s-master1 taint]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-taint-667d7688dd-mlhcd 1/1 Running 0 9s 172.24.247.48 node-2 <none> <none>

  注:在没有使用nodeSelector 指定标签的时候,创建的容器部署到了其它节点上面

二、内置污点

  ➢ node.kubernetes.io/not-ready:节点未准备好,相当于节点状态Ready的值为False。

  ➢ node.kubernetes.io/unreachable:Node Controller访问不到节点,相当于节点状态Ready的值为Unknown。

  ➢node.kubernetes.io/out-of-disk:节点磁盘耗尽。

  ➢ node.kubernetes.io/memory-pressure:节点存在内存压力。

  ➢ node.kubernetes.io/disk-pressure:节点存在磁盘压力。

  ➢ node.kubernetes.io/network-unavailable:节点网络不可达。

  ➢ node.kubernetes.io/unschedulable:节点不可调度。

  ➢ node.cloudprovider.kubernetes.io/uninitialized:如果Kubelet启动时指定了一个外部的cloudprovider,它

   将给当前节点添加一个Taint将其标记为不可用。在cloud-controller-manager的一个controller初始化这个
   节点后,Kubelet将删除这个Taint。
  
  2-1、节点宕机快速恢复示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-taint
name: nginx-taint spec:
replicas: 1
selector:
matchLabels:
app: nginx-taint
template:
metadata:
labels:
app: nginx-taint
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine
name: nginx-taint
nodeSelector:
web: "web"
tolerations:
- key: "web"
operator: "Equal"
value: "web"
- effect: NoExecute
key: node.kubernetes.io/unreachable #设置的是内置污点
operator: Exists #设置的tolerations不完全匹配规则
tolerationSeconds: 10 #节点不健康,10秒以后迁移该节点
- effect: NoExecute #指定Taint污点规则
key: node.kubernetes.io/not-ready #内置污点规则
operator: Exists
tolerationSeconds: 10 #节点状态为NotReady 10秒以后迁移

  注:在设置nodeSelector指定节点部署容器的时候。节点宕机后其它节点要有相同的标签key和value如果不相同

    或没有迁移后会一直处于Pending状态

  2-2、查看节点机器宕机后迁移状态

[root@k8s-master1 taint]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-taint-5f69bb844-8mq54 1/1 Terminating 0 11m 172.23.119.167 node-1 <none> <none>
nginx-taint-5f69bb844-khrmt 1/1 Running 0 5m3s 172.24.247.49 node-2 <none> <none>
taint-nginx-6bfcd7dff-wx768 1/1 Terminating 0 14m 172.23.119.166 node-1 <none> <none>
taint-nginx-6bfcd7dff-zttzj 1/1 Running 0 13s 172.24.247.50 node-2 <none> <none>

  注:从上面状态可以看出设置了内置污点10秒健康检查很快进行了迁移,另一个容器没有设置使用默认时间(300秒)等很长时间进行迁移。

    Terminating状态会在该节点启动会自动去除

三、Taint 常用命令

#创建一个污点(一个节点可以有多个污点):
kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
#示例:
kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule #查看一个节点的污点:
kubectl get node k8s-node01 -o go-template --template {{.spec.taints}}
kubectl describe node k8s-node01 | grep Taints -A 10 #删除污点(和label类似):
基于Key删除: kubectl taint nodes k8s-node01 ssd-
基于Key+Effect删除: kubectl taint nodes k8s-node01 ssd:PreferNoSchedule- #修改污点(Key和Effect相同):
kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite

  

容忍和污点Taint和Toleration的更多相关文章

  1. kubernetes调度之污点(taint)和容忍(toleration)

    系列目录 节点亲和性(affinity),是节点的一种属性,让符合条件的pod亲附于它(倾向于或者硬性要求).污点是一种相反的行为,它会使pod抗拒此节点(即pod调度的时候不被调度到此节点) 污点和 ...

  2. Kubernetes 配置 Taint 和 Toleration(污点和容忍)

    通过污点和容忍让pod运行在特定节点上 参考官网:https://k8smeetup.github.io/docs/concepts/configuration/taint-and-toleratio ...

  3. 【云原生 · Kubernetes】Taint和Toleration(污点和容忍)

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying Taint和Toleration(污点和容忍) 概念 添加多个tainit(污点) 使用例子 ...

  4. 调度《Taint(污点) 和 Toleration(容忍)》

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

  5. pod(九):污点taint 与容忍度tolerations

    目录 一.系统环境 二.前言 三.污点taint 3.1 污点taint概览 3.2 给节点添加污点taint 四.容忍度tolerations 4.1 容忍度tolerations概览 4.2 设置 ...

  6. Kubernetes高级调度- Taint和Toleration、Node Affinity分析

    此文分享了污点和Node Affinity实际使用过程中的细节.坑和思维误区.同时整理且回答了诸多细节问题,尤其那些在官方文档中不曾提及的细节. 阅读提示:文中的节点指Node (避免Pod和Node ...

  7. Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration

    由于博客园不支持markdown,推荐以下url阅读: 原创url:https://blog.csdn.net/weixin_42495873/article/details/103364868 ## ...

  8. 七、kubernetes污点和容忍

    Kubernetes污点和容忍 一.Taint 和 Toleration介绍 节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使节点能 ...

  9. Kubernetes之调度器和调度过程

    scheduler 当Scheduler通过API server 的watch接口监听到新建Pod副本的信息后,它会检查所有符合该Pod要求的Node列表,开始执行Pod调度逻辑.调度成功后将Pod绑 ...

  10. K8S 高级调度方式

    可以使用高级调度分为: 节点选择器: nodeSelector.nodeName 节点亲和性调度: nodeAffinity Pod亲和性调度:PodAffinity Pod反亲和性调度:podAnt ...

随机推荐

  1. cs231n__4.2 神经网络 Neural networks

    CS231n 学习笔记 4.2 神经网络 Neural networks 之前我们已经使用了 很多线性分类函数 现在我们不用单变换的: 我们首先有线性层,然后有这个非线性计算,继而在顶层再加入另一个线 ...

  2. Lombok中@Builder和@SuperBuilder注解的用法

    @Builder 是 lombok 中的注解.可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值. Person person1 = Pers ...

  3. 安装pytorch-gpu的经验与教训

    首先说明 本文并不是安装教程,网上有很多,这里只是自己遇到的一些问题 我是以前安装的tensorflow-gpu的,但是发现现在的学术论文大部分都是用pytorch复现的,因此才去安装的pytorch ...

  4. 面试官:JVM是如何判定对象已死的?

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 知道的越多,才知知道的越少.--苏格拉底 目录 引用计数算法 可达性分析算法 引用类型 ...

  5. PHP判断访问来源是PC端还是移动端

    一个方法轻松搞定,各种判断后当返回true为移动端,反之为PC端. function isMobile(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($ ...

  6. Python修改柱状图边缘柱子与图边界的距离

      本文介绍基于Python中matplotlib.pyplot模块,修改柱状图.条形图最两侧的柱子与图像边缘之间距离的方法.   最近,绘制了一个水平的柱状图,但是发现图的上.下边距(不是柱子与柱子 ...

  7. 真正“搞”懂HTTP协议10之缓存控制

    HTTP缓存相关的问题好像是前端面试中比较常见的问题了,上来就会问什么cache-control字段有哪些,有啥区别啥的.嗯--说实话,我觉得至少在本篇来说,HTTP缓存还算不上复杂,只是字段稍微多了 ...

  8. Redis01 Redis详细介绍

    参考:https://blog.csdn.net/u011863024/article/details/107476187 学习视频 redis官网 redis中文网 JAVA源码 1 sql的发展 ...

  9. ASP.NET Core - .NET 6 的入口文件

    自从.NET 6 开始,微软对应用的入口文件进行了调整,移除了 Main 方法和 Startup 文件,使用顶级语句的写法,将应用初始化的相关配置和操作全部集中在 Program.cs 文件中,如下: ...

  10. JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)

    \(\text{Solution}\) 观察到关于 \(x\) 的函数在 \(n\) 个操作之后一定是这样的: 一段水平直线加上一段斜率为 \(1\) 的直线再加上一段水平直线 于是线段树维护这个分段 ...