Kubernetes的污点和容忍(上篇)
背景
搭建了一个k8s(Kubernetes)的事件监听服务,监听事件之后对数据做处理。有天报了一个问题经调查是新版本的k8s集群添加会把unschedule等信息通过污点的方式反映。而这些污点是只有key没有value的。我的服务中只对value不会空的进行了处理就不对了。
发现这个问题,我跟leader解释了一下。解释的时候我就把k8s官方文档https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ 拿出来。但是我当时只能给leader指一下是哪一行。现场翻译不能优雅的表达出来。
静儿是翻译出身的,很惭愧啊。所以今天把这篇文章笔译一下,也顺便加深一下理解。为避免篇幅过长,分成两篇。上篇是概念,下篇是使用场景。
译文
node(宿主机)的affinity,是pod(容器)用来关联到一组node的属性(不管是作为preference还是强需求)。污点是相反的,他们允许一个node排斥一组pod。
污点和容忍一起协作来确保pod不被调度到不合适的node上。一个或者多个污点如果被应用于一个node,这个标志着这个node不应该接收任何不容忍这个污点的pod。
容忍被应用于pod,允许这个pod被调度到相对应的污点上。
概念
添加一个污点到一个node上,使用kubectl taint。例如:

在一个node上打上污点node1。污点有key「key」,value「value」,污点effect「NoSchedule」。这意味着除非有相应的容忍,没有pod能够调度到node1上。想删除这个污点,可以执行下面的命令

在PodSpec可以指定一个容忍到一个pod上。下面的两个容忍都能匹配上面node上的污点,因此带有下面任意一个容忍的pod都能调度到node1上。

一个匹配污点容忍的条件是:key相同、effect相同,并且满足 operator 是Exists(这时候不应该指定value)或者operator是Equal并且value相同。
注意:有两种特殊的场景
1.一个空的key,operator是Exists 匹配所有的key、value、effect。就是说容忍任何污点

2. 一个空的effect 匹配所有的key为「key」的effect

上面的例子使用了effect=NoSchedule。也可以使用effect=PreferNoSchedule。这是一个preference或者soft版本的NoSchedule。系统会尽量避免将没有容忍的pod调度到这台node上,但是不是必须的。还有第三种effect叫NoExcute,一会儿讲。
一个node可以有多个污点,一个pod可以有多个node。k8s执行多个污点和容忍方法类似于过滤器:从node的所有污点开始,忽略pod所带的相应容忍,剩余不能被忽略的污点显式的作用到pod上。
注意:
如果至少有一个不能被忽略的污点带有effect=NoSchedule,k8s就不会调度pod到这台node上。
如果没有不能被忽略的污点带有effect=NoSchedule,但是至少有一个不能被忽略的污点带有effect=PreferNoShedule,这时候k8s会努力不要调度这个pod到这个node上。
如果至少有一个不能被忽略的污点effect=NoExecute,这个已经在node上运行的pod会被从node上驱逐掉。没有运行在node的pod不能被调度到这个node上。
举个例子:如果一个node被打了下面的污点

一个pod有两个容忍。

在这种场景下,pod就不能被调度到这个node上。因为没有容忍能够匹配第三个污点。但是添加这个污点的时候,如果pod已经在这个node上运行了,这个pod不会被踢掉,仍然可以继续运行。因为第三个污点是这个pod唯一没有容忍的污点。
正常情况下,如果一个污点带有effect=NoExecute被添加到了这个node。那么不能容忍这个污点的所有pod就会立即被踢掉。而带有容忍标签的pod就不会踢掉。然而,一个带有effect=Noexecute的容忍可以指定一个tolerationSeconds来指定当这个污点被添加的时候在多长时间内不被踢掉。例如:

意思是如果这个pod已经在有一个对应的污点上跑了。这个pod可以一直跑3600s后再被踢掉。如果这时候node的污点被移除了,这个pod就不会被踢掉。
总结
感悟
最近静儿发布代码的质量越来越高。在工作中也有了更大的灵活性。发现一个特别舒服的现象:我们leader从来路过我的工位不看我在干什么。这是基于一种信任:能进美团基础架构部的,都是有技术追求和职业素养的。另外也是基于一种理念和文化:活儿干好了管你在干什么呢。
技术人员没有上班时间和下班时间,有空就多为工作思考。
相关阅读
作者是一个有美国硅谷、日本东京工作经验,十二年坚持一线写代码的程序媛。坚持原创文章。欢迎技术交流!
Kubernetes的污点和容忍(上篇)的更多相关文章
- Kubernetes的污点和容忍(下篇)
背景 继上一篇<Kubernetes的污点和容忍(上篇)>,这是https://kubernetes.io/docs/concepts/configuration/taint-and-to ...
- Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...
- Kubernetes之Taints与Tolerations 污点和容忍
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod. Taints(污 ...
- kubernetes(k8s)Pod污点与容忍
污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...
- 七、kubernetes污点和容忍
Kubernetes污点和容忍 一.Taint 和 Toleration介绍 节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使节点能 ...
- 009.kubernets的调度系统之污点和容忍
Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...
- k8s-Pod污点与容忍
目录 Pod污点与容忍 大白话先解释一下污点与容忍 为什么要用污点和容忍? 官方解释 Taints参数 标记污点 容忍污点 取消所有节点污点 Pod污点与容忍 大白话先解释一下污点与容忍 污点:被打上 ...
- 浅谈 kubernetes service 那些事(上篇)
一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8 ...
- Kubernetes 配置 Taint 和 Toleration(污点和容忍)
通过污点和容忍让pod运行在特定节点上 参考官网:https://k8smeetup.github.io/docs/concepts/configuration/taint-and-toleratio ...
随机推荐
- 解决jQuery的$符号的冲突问题
强大的jQuery框架在设计的时候不仅考虑到自己的符号定义问题,还想到了与其他框架的和平共处问题,(给别人留条路也是写在给自己留路),设计者以博大的胸怀和包罗万象的设计理念赋予了jq顽强的生命力. 废 ...
- Axure使用——创建折叠菜单
1.先添加动态面板 2.往动态面板中添加矩形 3.接着先隐藏下面的矩形(也就是你要折叠起来的内容) 4.一定要注意: 5.添加动态面板的状态 6.把之前做的那个矩形全部复制到state1中 7.把之前 ...
- 阅读nsq源码 ---初步架构设计图
- 【双连通分量】Bzoj2730 HNOI2012 矿场搭建
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- (6)STM32使用HAL库实现modbus的简单通讯
1.判断地址.校验 2.读取本机数据并校验打包 3.发送数据包 4.本机数据长度比要读取的长度短怎么办 4.校验错误怎么办
- ASP.Net Core MVC 发生二次请求
Bug回忆录 昨天搭建新框架的时候,遇到一个很奇怪的“Bug”,每次请求都会触发两次Aciton,举例子吧,Demo: _Layout.cshtml <!DOCTYPE html> < ...
- C++线程安全日志库-Win32接口实现
分享一个C++日志库,使用Win32接口编写,而且是线程安全的日志库.比较简单,只有2个文件,容易上手,使用起来也很简单 头文件 如下是日志库的头文件,接口看似很多,但是使用起来最常用的也就那么几个 ...
- user 不在 sudoers 文件中。此事将被报告。
在使用sudo -i或su root命令时,被提示出“user不在 sudoers 文件中.此事将被报告”的错误信息.这是因为当前登录的账号不在sudo权限里面.sudo命令可以让你以root身份执行 ...
- Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值
在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...
- 『vue踩坑日常』 在index.html中引入静态文件不生效
Vue日常踩坑日常 -- 在index.html中引入静态文件不生效问题 本文针对的是Vue小白,不喜勿喷,谢谢 出现该问题的标志如下 控制台warning(Resource interpreted ...