Kubernetes的污点和容忍(下篇)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Kubernetes的污点和容忍(下篇)

背景


继上一篇《Kubernetes的污点和容忍(上篇)》,这是https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ 译文的下半部分。


经常看外文文档或书籍多了,会产生一个问题:“不方便沟通。”不太会用大家习惯的表述方式来阐述一个问题。所以需要定期看一些中文书籍来学习「行话」。

 

译文


使用场景


污点和容忍是一种让Pod不被调度到指定node或者是把不该在某个node上运行的Pod踢掉的灵活方法。下面列举一些使用场景。


  • 指定node:如果想为特殊的用户指定一组node,可以添加一个污点到这组node上(运行命令: kubectl taint nodes nodename dedicated=groupName:NoSchedule)。然后添加对应的容忍到这个Pod上(这个最容易实现的方法是写一个客户端准入控制器)。带有相应容忍的Pod就可以像被调度到集群中其他node一样被调度到带有相应污点的node上。


  • 特殊硬件的node:在一个有一小组特殊硬件(例如GPU)的集群中,更希望将没有特殊硬件需求的Pod不调度到这些node上,留出空间给后来的需要这些特殊硬件的Pod。这个通过给特殊硬件打上污点(例如:kubectl taint nodes nodename special=true:NoSchedule or kubectl taint nodes nodename special=true:PreferNoSchedule),然后添加相应的容忍到Pod上来实现。在这些使用场景,最容易实现的方法是使用客户端准入控制器来实现。例如,推荐使用Extended Resources 来代表特殊硬件,将带有扩展资源名的硬件打上污点。然后运行ExtendedResourceToleration准入控制器. 现在,由于这些node已经被打上污点了,没有容忍的Pod不会被调度到上面。但是当你提交了一个需要扩展资源的Pod,ExtendedResourceToleration准入控制器会自动的添加正确的容忍到Pod上,Pod就可以被调度到这个特殊硬件的node上了。这会确保这些特殊硬件的node是需要相应的硬件的,并且不需要手动给Pod添加容忍。


  • 基于污点的驱逐(beta版本特性):下面我们会介绍当node发生故障时基于单个Pod配置的驱逐行为。


基于驱逐的污点


早期我们提到了NoExecute污点的effect会影响已经在node上运行的Pod。


  • 不能容忍污点的Pod会被立即驱逐。


  • Pod上的容忍没有指定tolerationSeconds会好好的呆在node上。


  • Pod上的容忍带有tolerationSeconds的会在node上停留指定的时间。


另外,Kubernets 1.6 引入了代表node问题的污点(在1.6版本是alpha版试用)。换句话说,node控制器当某种条件成立的时候会自动的给node打上污点。下面是其中内置的污点:


  • node.kubernetes.io/not-ready:node不是ready状态。对应于node的condition ready=false.


  • node.kubernetes.io/unreachable:node controller与node失联了。对应于node的condition ready=unknown


  • node.kubernetes.io/out-of-disk:node磁盘空间不足了。


  • node.kubernetes.io/network-unavailable:node的网断了


  • node.kubernets.io/unschedulable:node不是可调度状态


  • node.cloudprovider.kubernetes.io/uninitalized:kubelet是由外部云提供商提供的时候,刚开始的时候会打上这个污点来标记还未被使用。当cloud-controller-manager控制器初始化完这个node,kubelet会自动移除这个污点。


在1.13版本中,「基于污点的驱逐」特性被提升至beta版,并且被默认开启。因为这些污点会被自动添加到node控制器(或kubelet)中。而之前的常使用的逻辑:基于condition中ready状态来驱逐pod也被禁用了。


注意:


为了维持在node故障时对存在的Pod驱逐做限流,系统实际上是用限速的方法来添加污点的。这种措施防止了master与node脑裂而产生的大规模驱逐Pod的场景。


这个beta版本特性再结合tolerationSeconds,可以使得pod指定当node节点出现问题的时候一个pod能在node上呆多久。


举个栗子:


一个有很多本地状态的应用可能想在产生网络脑裂的时候还能在node上呆很久。这样是希望脑裂会恢复,从而避免pod被驱逐。为了达到这个目的,可以这样用:


1112728-20190319204921184-81973134.png


Kubernetes会自动给pod添加容忍:node.kubernetes.io/not-ready 实效是tolerationSeconds=300。但是如果用户自己给这个pod添加了node.kubernets.io/not-ready的容忍,用户的配置不会被覆盖。


类似的,它也会自动给pod添加容忍:node.kubernetes.io/unreachable 实效是tolerationSeconds=300。但是如果用户自己给这个pod添加了node.kubernetes.io/unreahable,用户的配置不会被覆盖。


这种自动添加容忍机制确保了默认pod如果宿主机发生故障在5分钟之内不会被自动驱逐。这两个默认的容忍都是https://github.com/kubernetes/kubernetes/tree/master/plugin/pkg/admission/defaulttolerationseconds (DefaultTolerationSeconds admission controller)这个控件来添加的。


DaemonSet的pod会默认添加一个NoExecute不带有tolerationSeconds的容忍:


  • node.kubernetes.io/unreachable


  • node.kubernetes.io/not-ready


这种方式确保了DaemonSet的Pod在发生故障的时候永远不会被驱逐。


condition驱动的污点


在版本1.12中,「condition驱动的污点」特性被提升到beta版,node的生命周期控制器自动的创建condition相应的污点。类似的,调度器并不检查node的condition,而是检查污点。这种方式是用来保证node的condition不会影响已经调度到这台node的Pod。用户可以用添加合适的容忍来忽视node的一些问题(condition是其中的代表)。在这个版本中「condition驱动的污点」只是打上了effect=NoSchedule的污点。而在1.13版本中才将effect=NoExcute作为beta版默认开启。


从Kubernetes1.8版本开始,DaemonSet控制器自动的添加了NoSchedule容忍到所有的daemon线程来避免DaemonSets中断。


  • node.kubernetes.io/memory-pressure


  • node.kubernetes.io/disk-pressure


  • node.kubernetes.io/out-of-disk(只对重要的pod生效)


  • node.kubernetes.io/unschedulable(1.10版本后生效)


  • node.kubernetes.io/network-unavailable(只针对主机网络)


添加这些容忍确保了向后兼容,用户可以随意对DaemonSets添加容忍。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 调度 Perl
在K8S中,说下Pod污点与容忍的理解?
在K8S中,说下Pod污点与容忍的理解?
|
3月前
|
Kubernetes 调度 容器
在K8S中,内置的污点主要有哪些?
在K8S中,内置的污点主要有哪些?
|
3月前
|
Kubernetes 调度 开发者
在K8S中,如何理解Pod污点与容忍?
在K8S中,如何理解Pod污点与容忍?
|
6月前
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
|
6月前
|
Kubernetes 应用服务中间件 调度
k8s-高级调度-污点容忍、亲和性调度
k8s-高级调度-污点容忍、亲和性调度
|
6月前
|
存储 Kubernetes 调度
K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)
本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。
|
6月前
|
Kubernetes Cloud Native 调度
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
744 0
|
6月前
|
Kubernetes Cloud Native 调度
k8s学习-污点和容忍(概念、模版、创建、删除)
k8s学习-污点和容忍(概念、模版、创建、删除)
86 0
|
22天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
23天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。