NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。

Taints(污点)是Node的一个属性,设置了Taints(污点)后,因为有了污点,所以Kubernetes是不会将Pod调度到这个Node上的,

于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。

因此 Taints(污点)通常与Tolerations(容忍)配合使用。

1、设置污点:

 kubectl taint node [node] key=value[effect]
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule :一定不能被调度。
PreferNoSchedule:尽量不要调度。
NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
示例:kubectl taint node 10.3.1.16 test=16:NoSchedule

  

2、去除污点:

 比如设置污点:
kubectl taint node 10.3.1.16 test=16:NoSchedule
kubectl taint node 10.3.1.16 test=16:NoExecute
去除指定key及其effect:
kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value) 去除指定key所有的effect:
kubectl taint nodes node_name key- 示例:
kubectl taint node 10.3.1.16 test:NoSchedule-
kubectl taint node 10.3.1.16 test:NoExecute-
kubectl taint node 10.3.1.16 test-

 

查看 node1 上的 taint:

kubectl describe nodes node1

  

3、Pod 容忍污点示例:

首先给node设置个污点以观察调度效果:

 kubectl taint node 10.3.1.16 test=16:NoSchedule

  

当pod没有设置容忍时被调度到10.3.1.17:

apiVersion: v1
kind: Pod
metadata:
name: pod-taints
labels:
os: ubuntu
spec:
containers:
- name: pod-tains
image: 10.3.1.15:5000/ubuntu:16.04 root@ubuntu:#kubectl create -f pod-taints.yaml
pod "pod-taints" created
###
root@ubuntu# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-taints 1/1 Running 0 7s 192.168.77.216 10.3.1.17

  

 

给Pod设置容忍:

apiVersion: v1
kind: Pod
metadata:
name: pod-taints
labels:
os: ubuntu
spec:
tolerations: #设置容忍性
- key: "test"
operator: "Equal" #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal
value: "16"
effect: "NoSchedule"
#意思是这个Pod要容忍的有污点的Node的key是test Equal 16,效果是NoSchedule,
#tolerations属性下各值必须使用引号,容忍的值都是设置Node的taints时给的值。
containers:
- name: pod-tains
image: 10.3.1.15:5000/ubuntu:16.04 root@ubuntu15:/data/yaml# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-taints 1/1 Running 0 3m 192.168.150.216 10.3.1.16 #容忍后就立即调度到另外一个Node上了。需要在两个Node的Pod数量不平衡时才能看到效果。

  

 

对于tolerations属性的写法:

其中的key、value、effect 与Node的Taint设置需保持一致, 还有以下几点说明:

1、如果operator的值是Exists,则value属性可省略。

2、如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。

3、如果不指定operator属性,则默认值为Equal。

另外,还有两个特殊值:

1、空的key 如果再配合Exists 就能匹配所有的key与value ,也是是能容忍所有node的所有Taints。

2、空的effect 匹配所有的effect。

一个node上可以有多个污点:

比如     test=16:NoScheduler   test2=16:NoSchedule

而在Pod容忍时只容忍了其中一个:

tolerations:
- key: "test"
operator: "Equal"
value: "16"
effect: "NoSchedule"

  

 

这样的结果是此Pod无法被调度到key为test的node( 10.3.1.16)上去,因为此Node上设置了两个污点,

而这个Pod只匹配到了一个污点,也就是只容忍了一个污点,所以可以再加一个容忍:

 tolerations:
- key: "test"
operator: "Exists"
effect: "NoSchedule"
- key: "test2"
operator: "Equal"
value: "16"
effect: "NoSchedule"

  

如果在设置node的Taints(污点)之前,就已经运行了一些Pod,那么这些Pod是否还能继续在此Node上运行? 这就要看设置Taints污点时的effect(效果)了。

如果effect的值是NoSchedule或PreferNoSchedule,那么已运行的Pod仍然可以运行,只是新Pod(如果没有容忍)不会再往上调度。

而如果effect的值是NoExecute,那么此Node上正在运行的Pod,只要没有容忍的,立刻被驱逐。

虽然是立刻被驱逐,但是K8S为了彰显人性化,又给具有NoExecute效果的污点, 在容忍属性中有一个可选的

tolerationSeconds字段,用来设置这些Pod还可以在这个Node之上运行多久,给它们一点宽限的时间,到时间才驱逐。

如果是以Pod来启动的,那么Pod被驱逐后, 将不会再被运行,就等于把它删除了。

如果是deployment/rc,那么删除的pod会再其它节点运行。

如果是DaemonSet在此Node上启动的Pod,那么也不会再被运行,直到Node上的NoExecute污被去除或者Pod容忍。

#设置Pod的宽限时间
spec:
tolerations: #设置容忍性
- key: "test"
operator: "Equal" #如果操作符为Exists,那么value属性可省略
value: "16"
effect: "NoExecute"
tolerationSeconds: 180
#如果运行此Pod的Node,被设置了具有NoExecute效果的Taint(污点),这个Pod将在存活180s后才被驱逐。
#如果没有设置tolerationSeconds字段,将永久运行。
  

  

通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:

给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,

但是也不一定会调度给此特定Node,设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node

只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里

设置NodeAffinity到Node。如此就能达到要求了。

实例配置:

kubectl get deployment  h5-weifeng -o yaml  -n xitu-pretest

tolerations:
- effect: NoSchedule
key: xitu
operator: Equal
value: pretest

  

kubectl describe  nodes  cn-hangzhou.172.16.1.236

Taints:             xitu=pretest:NoSchedule

  

kubectl get pod -n xitu-pretest -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE mall-app-async-api-6c9d78c4b-msczt 1/1 Running 0 19h 10.20.2.68 cn-hangzhou.172.16.1.236 <none>
mall-audit-provider-5b7b5f4d5-559nf 1/1 Running 1 47h 10.20.2.120 cn-hangzhou.172.16.1.236 <none>
mall-basic-oss-web-567f7c6c76-h48kf 1/1 Running 0 45h 10.20.2.23 cn-hangzhou.172.16.1.236 <none>

  

Kubernetes之Taints与Tolerations 污点和容忍的更多相关文章

  1. kubernetes(k8s)Pod污点与容忍

    污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...

  2. Taints和Tolerations -- 污点- 容忍

    1.taint 定义在node上,排斥pod 2.toleration定义在pod中,容忍pod 3.可以在命令行为Node节点添加Taints:  kubectl taint nodes node1 ...

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

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

  4. 七、kubernetes污点和容忍

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

  5. Kubernetes的污点和容忍(下篇)

    背景 继上一篇<Kubernetes的污点和容忍(上篇)>,这是https://kubernetes.io/docs/concepts/configuration/taint-and-to ...

  6. Kubernetes的污点和容忍(上篇)

    背景 搭建了一个k8s(Kubernetes)的事件监听服务,监听事件之后对数据做处理.有天报了一个问题经调查是新版本的k8s集群添加会把unschedule等信息通过污点的方式反映.而这些污点是只有 ...

  7. Taints和Tolerations联用,将pod部署到k8s的master节点

    一般,k8s的master为了保持高性能,在这个主节点上只运行一些管理必须的POD. 如果我们限于资源,或是一些监控类的pod要部署到master节点呢? 昨天遇到这个问题,按网上通用的方法,未解决, ...

  8. K8S调度之Taints and Tolerations

    Taints和Tolerations(污点和容忍) 在<K8S之节点亲和性>中,我们说到的的NodeAffinity节点亲和性,是在pod上定义的一种属性,使得Pod能够被调度到某些nod ...

  9. Kubernetes-14:一文详解Pod、Node调度规则(亲和性、污点、容忍、固定节点)

    Kubernetes Pod调度说明 简介 Scheduler 是 Kubernetes 的调度器,主要任务是把定义的Pod分配到集群的节点上,听起来非常简单,但要考虑需要方面的问题: 公平:如何保证 ...

随机推荐

  1. React学习之路之创建项目

    React 开发环境准备 IDE工具 visual studio code 开发环境 开发环境需要安装nodejs和npm,nodejs工具包含了npm. nodejs下载官网:https://nod ...

  2. Gin-Go学习笔记一:Hello World

    Hello World 1>     Gin是一个golang的微框架,封装比较优雅,API友好.具有快速灵活,容错方便等特点.Gin自身的net/http足够简单,性能也非常不错. 2> ...

  3. vue工作原理分析

    初始化 在 new Vue() 时会调⽤用_init()进⾏行行初始化,会初始化各种实例例⽅方法.全局⽅方法.执⾏行行⼀一些⽣生命周期. 初始化props. data等状态.其中最重要的是data的「 ...

  4. XSS相关有效载荷及绕道的备忘录(下)| 文末有打包好的负载

    前言: 今天发布的是下半部分 进入正题 过滤的绕过和一些奇异的有效载荷 大小写绕过 <sCrIpt>alert(1)</ScRipt> 绕过标签黑名单 <script x ...

  5. uni-app项目配置记录

    新建项目 直接使用编辑器快速新建,具体方法很简单,官方文档很详细,这里不在叙说 配置项目: 项目搭建好了之后,我们配置一些 api 和 router,这些直接在插件市场上面进行配置,非常好用 封装的r ...

  6. javaEE复习重点个人总结

    最近在学院或集队的群里看见最多的就是求javaEE大作业了,那么突然有感而发,写点参考性的期末复习总结. 第一章JavaEE 概述: 1:两层体系应用体系结构 安全性低,部署困难,消耗系统资源 2 三 ...

  7. Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

    0x00 漏洞描述 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003.windows2008.windows2008 R2.windows ...

  8. 使用vnc远程操控Centos7.6

    安装vncserver [root@elegant-snap-3 ~]# yum install tigervnc-server -y Loaded plugins: fastestmirror De ...

  9. cmake设定boost python3

    在mac上操作的.python3是anaconda环境下装的,3.7.1. boost是用brew装的,1.71.0版本. 按照FindBoost.cmake官方写法的CMakeLists.txt: ...

  10. MySQL数据库(三)--表相关操作(二)之约束条件、关联关系、复制表

    一.约束条件  1.何为约束 除了数据类型以外额外添加的约束 2.约束条件的作用 为了保证数据的合法性,完整性 3.主要的约束条件 NOT NULL # 标识该字段不能为空,默认NULL,可设置NOT ...