背景

搭建了一个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从来路过我的工位不看我在干什么。这是基于一种信任:能进美团基础架构部的,都是有技术追求和职业素养的。另外也是基于一种理念和文化:活儿干好了管你在干什么呢。

技术人员没有上班时间和下班时间,有空就多为工作思考。

相关阅读

《两地书》--K8s基础知识

Kubernetes的污点和容忍(上篇)

Kubernetes的污点和容忍(下篇)

作者是一个有美国硅谷、日本东京工作经验,十二年坚持一线写代码的程序媛。坚持原创文章。欢迎技术交流!

Kubernetes的污点和容忍(上篇)的更多相关文章

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

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

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

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

  3. Kubernetes之Taints与Tolerations 污点和容忍

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

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

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

  5. 七、kubernetes污点和容忍

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

  6. 009.kubernets的调度系统之污点和容忍

    Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...

  7. k8s-Pod污点与容忍

    目录 Pod污点与容忍 大白话先解释一下污点与容忍 为什么要用污点和容忍? 官方解释 Taints参数 标记污点 容忍污点 取消所有节点污点 Pod污点与容忍 大白话先解释一下污点与容忍 污点:被打上 ...

  8. 浅谈 kubernetes service 那些事(上篇)

    一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8 ...

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

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

随机推荐

  1. BZOJ_3697_采药人的路径_点分治

    BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...

  2. php与html实现交互的基本操作

    今天我们来实现php与html页面注册和登录的效果.中国有句古话叫: 第一步:我们来了解一些php的基本格式. <?php php代码 ?> 第二步:了解php与js的一些基本区别 我们在 ...

  3. angular开发环境配置全套教程

    第一步.安装node.js 1.需要下载的文件路径:https://nodejs.org/en/download/ 2.安装nodejs: 3.验证node.js 4.npm安装以及验证: npm的安 ...

  4. ffmpeg 获得视频的时间长度, 仅仅学习一下

    public static void main(String[] args) { String result = processFLV("E:\\test\\京视传媒\\体育类\\xiao. ...

  5. 禁用后退键 BackSpace

    <script language="JavaScript">document.onkeydown = check;function check(e) {    var  ...

  6. TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)

    在上一篇博客<TensorFlow之DNN(一):构建“裸机版”全连接神经网络>中,我整理了一个用TensorFlow实现的简单全连接神经网络模型,没有运用加速技巧(小批量梯度下降不算哦) ...

  7. Spring Boot + Vue 前后端分离,两种文件上传方式总结

    在Vue.js 中,如果网络请求使用 axios ,并且使用了 ElementUI 库,那么一般来说,文件上传有两种不同的实现方案: 通过 Ajax 实现文件上传 通过 ElementUI 里边的 U ...

  8. 微服务架构 - CentOS7离线部署docker

    1.环境准备 系统环境为: CentOS Linux release 7.5.1804 (Core) 安装docker版本为: 17.12.0-ce 2.准备部署文件 在http://mirrors. ...

  9. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  10. Protocol Buffers(3):阅读一个二进制文件

    目录 Proto文件 序列化 二进制文件解析 反序列化 参考 博客:blog.shinelee.me | 博客园 | CSDN 这篇文章中,我们将定义一个相对复杂的数据结构,直接分析其序列化后的二进制 ...