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被驱逐。为了达到这个目的,可以这样用:

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添加容忍。

相关阅读

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

Kubernetes的污点和容忍(上篇)

Kubernetes的污点和容忍(下篇)

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

原文地址:https://www.cnblogs.com/xiexj/p/10561237.html

时间: 2024-08-03 10:01:40

Kubernetes的污点和容忍(下篇)的相关文章

Kubernetes设置污点以及容忍

K8S集群内有一台212专门用来做数据库服务器,磁盘是基于SSD. 1.设置212污点 kubectl taint node 172.17.10.212 disk=ssd:NoSchedule 2.数据库的deployment spec: tolerations: - key: "disk" operator: "Equal" value: "ssd" effect: "NoSchedule" nodeSelector: ku

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

Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这些“污点”,否则无法在这些node上运行.Toleration是pod的属性,让pod能够(注意,只是能够,而非必须)运行在标注了Taint的node上. 默认情况下,所有的应用pod都不会运行在有污点的节点上 [[email protected] deployment]# kubectl get

关于kubernetes我们还有什么可做的?

kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性.加上开放可扩展的理念,使得周边社区非常活跃.从既有调研结果看,kubernetes已成为容器编排领域的标准.但是它并不成熟,很多方面都大有可为,下面就是列举了一些方面: 1.集群联邦 kubernetes是一个集中式容器管理工具.横向上来说,集群管理工具还有分布式和共享式等.代表性的分布式容器管理工具如yarn与kubernetes的区别是yarn的一台宿主机作为一个master来进行容器管理.分配速度

kubernetes 的调度

kubernetes 的调度 标签(空格分隔): kubernetes系列 一: kubernetes的调度 二: kubernetes的节点的亲和性 三: kubernetes的污点与容忍 四: kubernetes的固定节点 一:kubernetes的调度 1.1 scheduler 的介绍 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 1.公平:如何保证每个节点都能被分配资源 2. 资源高效

Kubernetes污点(taints)与容忍(tolerations)

一.概述 Taint(污点)和 Toleration(容忍)可以作用于 node 和 pod 上,其目的是优化 pod 在集群间的调度,这跟节点亲和性类似,只不过它们作用的方式相反,具有 taint 的 node 和 pod 是互斥关系,而具有节点亲和性关系的 node 和 pod 是相吸的.另外还有可以给 node 节点设置 label,通过给 pod 设置 nodeSelector 将 pod 调度到具有匹配标签的节点上. Taint 和 toleration 相互配合,可以用来避免 pod

kubernetes高级调度简单说明

Node label使用说明 1.查看node label kubectl get nodes --show-labels=true 2.创建label kubectl label node $(node_name) $key=$value 3.更新label kubectl label --overwrite node $(node_name) $key=$value 4.删除 kubectl label node $(node_name) $key- Node调度几种模式 首先看一下,我测试

Kubernetes学习之路(一)之Kubeadm部署K8S集群

一个星期会超过多少阅读量呢??发布一篇,看看是否重新在51上写学习博文,有老铁支持嘛?? 使用kubeadm部署集群 节点名称 ip地址 部署说明 Pod 网段 Service网段 系统说明 k8s-master 192.168.56.11 docker.kubeadm.kubectl.kubelet 10.244.0.0/16 10.96.0.0/12 Centos 7.4 k8s-node01 192.168.56.12 docker.kubeadm.kubelet 10.244.0.0/1

kubernetes Pod 资源调度

1 概述 1 总述 API server 接受客户端提交的POD对象创建请求操作过程中,需要kube-scheduler 从当前集群中选择一个可用的最佳节点接受并运行,通常是默认调度器复制此类任务,对于每个待创建的POD来说,需要经过三个步骤.1 预选(predicate)节点预选: 基于一系列预选规则(podfitsresources 和 matchnode-selector等)对每个节点进行检查,将那些不符合条件的节点过滤.如果需要某些特殊服务,则需要通过组合节点标签,以及POD标签或标签选

【免费下载】全套最新 5、Kubernetes 视频教程+教学资料+学习课件+源代码+软件开发工具

5.Kubernetes视频教程 网盘地址: 链接:https://pan.baidu.com/s/11W8KDUjk36USxdrA8p0t4A 提取码:43xt 加公众号 获取更多新教程 教程目录大纲 ./5.Kubernetes ├── 10.Kubernetes - Helm 及其它功能性组件 │?? ├── 1.笔记 │?? │?? ├── 1.部署 Helm.pdf │?? │?? ├── 2.使用 Helm 部署 dashboard .pdf │?? │?? ├── 3.使用 He