目录

一、K8s调度

二、亲和与反亲和

1、Pod和Node

2、硬亲和和软亲和

三、污点与容忍

3.1  污点(Taint)

3.1.1 污点的组成

3.1.2 污点的设置和去除

3.2  容忍(Tolerations)

3.2.1 Toleration 基本用法

3.2.2 Toleration案例

3.3  多污点与多容忍配置

一、K8s调度

  1. 调度器通过kubernetes的list-watch机制来发现集群中新创建且尚未被调度到Node上的Pod。调度器会将发现的每一个未调度的Pod调度到一个合适的Node上来运行。
  2. kube-scheduler是Kubernetes集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler在设计上是允许你自己写一个调度组件并替换原有的kube-scheduler。
  3. 在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。

二、亲和与反亲和

1、Pod和Node

  1. 从pod出发,可以分成亲和性和反亲和性,分别对应podAffinity和podAntiAffinity。
  2. 从node出发,也可以分成亲和性和反亲和性,分别对应nodeAffinity和nodeAntiAffinity。
  3. 从操作指令来讲,可以有ln、Notln、Exists、DoesNotExist等等。
针对亲和性来讲,in代表我要调度到有这个标签的位置
针对反亲和性来讲,in代表我不要调度到有这个标签的位置

2、硬亲和和软亲和

preferredDuringSchedulingIgnoredDuringExecution 软亲和

软策略:结合下面的 “operator: NotIn”,意思就是尽量不要将 pod 调度到匹配到的节点,但是如果没有不匹配的节点的话,也可以调度到匹配到的节点。

requiredDuringSchedulingIgnoredDuringExecution 硬亲和

硬策略:结合下面的 “operator: In”,意思就是必须调度到满足条件的节点上,否则就等着 Pending。

不管哪种方式,最终还是要依赖 label 标签。

kubectl get pods -n company ai-action-statistic-gray-86465f9c4b-hdfk4 -oyaml | grep nodeSelector -B 5 -A 5uid: ed47f094-f70a-45ed-b7dd-d46f2d01986f
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:    #硬策略nodeSelectorTerms:- matchExpressions:- key: node-role.kubernetes.io/grayoperator: Invalues:- graypreferredDuringSchedulingIgnoredDuringExecution:  #软策略- weight: 1preference:matchExpressions:- key: pc-appoperator: NotInvalues:- luna

三、污点与容忍

K8s 每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有相应 taint 的节点上。

3.1  污点(Taint)

  1. 如果一个节点被标记为有污点,那么意味着不允许pod调度到该节点,除非pod也被标记为可以容忍污点节点。
  2. 在使用kubeadm部署的k8s集群的时候应该会发现,通常情况下,应用是不会调度到master节点的。因为kubeadm部署的k8s集群默认给master节点加了Taints(污点)。

3.1.1 污点的组成

使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。

每个污点的组成如下:

key=value:effect

每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用。

污点有三种策略:

  1. PreferNoSchedule:NoSchedule的软策略版本,表示尽量不调度到污点节点上去。
  2. NoExecute:该选项意味着一旦Taint生效,如该节点内正在运行的Pod没有对应容忍(Tolerate)设置,则会直接被逐出。
  3. NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上

3.1.2 污点的设置和去除

使用kubectl设置和去除污点的命令示例如下:

# 设置污点
kubectl taint nodes node1 key1=value1:NoSchedule
# 去除污点
kubectl taint nodes node1 key1:NoSchedule-

接下来看一个具体的例子,使用kubeadm部署和初始化的Kubernetes集群,master节点被设置了一个node-role.kubernetes.io/master:NoSchedule的污点,可以使用kubectl describe node 命令查看。这个污点表示默认情况下master节点将不会调度运行Pod,即不运行工作负载。对于使用二进制手动部署的集群设置和移除这个污点的命令如下:

kubectl taint nodes <node-name> node-role.kubernetes.io/master=:NoSchedule
kubectl taint nodes <node-name> node-role.kubernetes.io/master:NoSchedule-

3.2  容忍(Tolerations)

设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。

3.2.1 Toleration 基本用法

pod 的 Toleration 声明中的 key 和 effect 需要与 Taint 的设置保持一致,并且满足以下条件之一:

  1. operator 的值为 Exists,这时无需指定 value
  2. operator 的值为 Equal 并且 value 相等
  3. 如果不指定 operator,则默认值为 Equal。

另外还有如下两个特例:

  1. 空的 key 配合 Exists 操作符能够匹配所有的键和值
  2. 空的 effect 匹配所有的 effect

上面的例子中 effect 的取值为 NoSchedule,下面对 effect 的值作下简单说明:

  1. NoSchedule:如果一个 pod 没有声明容忍这个 Taint,则系统不会把该 Pod 调度到有这个 Taint 的 node 上
  2. PreferNoSchedule:NoSchedule 的软限制版本,如果一个 Pod 没有声明容忍这个Taint,则系统会尽量避免把这个 pod 调度到这一节点上去,但不是强制的。
  3. NoExecute:定义 pod 的驱逐行为,以应对节点故障。

NoExecute 这个 Taint 效果对节点上正在运行的 pod 有以下影响:

  1. 没有设置 Toleration 的 Pod 会被立刻驱逐
  2. 配置了对应 Toleration 的 pod,如果没有为 tolerationSeconds 赋值,则会一直留在这一节点中
  3. 配置了对应 Toleration 的 pod 且指定了 tolerationSeconds 值,则会在指定时间后驱逐

3.2.2 Toleration案例

tolerations:- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"- key: "key2"
operator: "Exists"
effect: "NoSchedule"
  • 其中key, vaule, effect要与Node上设置的taint保持一致
  • operator的值为Exists将会忽略value值
  • tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间

下面看一下在Pod上设置容忍的两个特例:

示例1: 当不指定key值时,表示容忍所有的污点key:

tolerations:
- operator: "Exists"

示例2:当不指定effect值时,表示容忍所有的污点作用:

tolerations:
- key: "key"
operator: "Exists"

注意,在节点故障情况下,为了保持现存的 pod 驱逐的限速设置,系统将会以限速的模式逐步给 node 设置 Taint,这就能防止在一些特定情况下(比如 master 暂时失联)造成的大量 pod 被驱逐的后果。这一功能兼容于 tolerationSeconds,允许 pod 定义节点故障时持续多久才被逐出。

3.3  多污点与多容忍配置

**系统允许在同一个 node 上设置多个 taint,也可以在 pod 上设置多个 Toleration。**Kubernetes 调度器处理多个 Taint 和 Toleration 能够匹配的部分,剩下的没有忽略掉的 Taint 就是对 Pod 的效果了。下面是几种特殊情况:

  1. 如果剩余的 Taint 中存在 effect=NoSchedule,则调度器不会把该 pod 调度到这一节点上。
  2. 如果剩余的 Taint 中没有 NoSchedule 的效果,但是有 PreferNoSchedule 效果,则调度器会尝试不会 pod指派给这个节点
  3. 如果剩余 Taint 的效果有 NoExecute 的,并且这个 pod已经在该节点运行,则会被驱逐;如果没有在该节点运行,也不会再被调度到该节点上。
kubectltaint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule

kubernetes 亲和、反亲和、污点、容忍相关推荐

  1. k8s 亲和 反亲和介绍

    k8s 亲和 & 反亲和介绍 文章内容来自k8s文档翻译以及个人理解和实际使用过程中的实践内容 参考:https://kubernetes.io/docs/concepts/schedulin ...

  2. k8s调度之亲和/反亲和

    Pod的调度流程 在k8s集群中kube-scheduler组件负责为Pod选择运行节点,并由对应节点上的kubelet创建Pod.对于每个未绑定至任何节点的Pod对象,无论是新建.被驱逐等,kube ...

  3. Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理

    目录: 一.kubernetes调度介绍 二.nodename节点选择约束 三.nodeSelector 亲和 1.节点亲和 2.节点反亲和 1. pod亲和 2.pod反亲和 四.Taints(污点 ...

  4. k8s调度(nodeName、nodeSelect、节点、pod的亲和和反亲和、Taints)

    k8s调度 nodeName nodeSelector 亲和与反亲和 节点亲和 pod 亲和性和反亲和性 Taints(污点) 调度器通过 kubernetes 的 watch 机制来发现集群中新创建 ...

  5. 容器亲和、反亲和、污点、容忍以及驱逐的介绍

    nodeSelector简介: 官方文档: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/ 可用于干预pod的调度结果,例 ...

  6. k8s 亲和、反亲和、污点、容忍

    目录 一.K8s调度 二.亲和与反亲和 2.1.Pod和Node 2.2.硬亲和和软亲和 三.污点与容忍 3.1  污点(Taint) 3.1.1  污点的组成 3.1.2  污点的设置和去除 3.2 ...

  7. k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令

    1 调度简介 [root@server2 ~]# kubectl get pod -n kube-system 2 影响kubernetes调度的因素 2.1 nodeName(针对节点) [root ...

  8. 图解 K8S(07):调度利器之亲和与反亲和(服务容灾)

    本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...

  9. k8s自动扩缩容、健康检查、Qos、资源管理、亲和度、污点与宽容

    环境为centos7.9 安装k8s 1.23.1 一.自动扩缩容 1.安装Metrics Server wget https://github.com/kubernetes-sigs/metrics ...

最新文章

  1. 电脑屏保海底世界_一款电脑桌面锁屏软件:梦幻水族馆(好多鱼)
  2. java线程删除文件,线程“main”java.io.jgitinernalexception中的异常:无法删除临时文件c:\users\13 dec...
  3. matlab新手入门(四)(翻译)
  4. 沟通模型包含5个状态
  5. outlook advanced find 快捷键不起作用
  6. YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】
  7. https open api_通过bilibili_api获取弹幕+绘制词云的方法
  8. SQL SERVER事务处理
  9. 鼠标放到图片上替换图片,改变样式。
  10. 微型计算机原理与接口技术朱金钧课后答案,微型计算机原理及应用技术 第3版...
  11. 5s管理常用工具汇总
  12. android 蓝牙打印乱码,蓝牙打印机打印中文乱码
  13. 采用esxcli命令操作esxi主机防火墙
  14. 计算机辅助教育相关论文,计算机辅助教育论文
  15. 外贸老手告诉你:外贸实用工具
  16. 盘点电脑速度变慢的七大原因
  17. 配置失败还原请勿关闭计算机,win7系统遇到更新失败提示“配置windwos update 失败还原更改,请勿关闭计算机”的解决方法...
  18. Python爬虫实战练习:爬取微信公众号文章
  19. Vue和Servlet搭配使用
  20. 永磁同步电机PMSM极对数的测量方法

热门文章

  1. Visio绘制网络模型
  2. 算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)
  3. c语言第五次上机作业,大连理工c语言第五次上机作业参考答案(5页)-原创力文档...
  4. 互联网运营面试题_产品运营面试常见问题
  5. LeetCode 1240. Tiling a Rectangle with the Fewest Squares
  6. CSS 新属性 《设置容器长宽比》
  7. Soul聊天记录备份和恢复(旧机迁移至新机)
  8. readiness与liveness
  9. 滴滴校招笔试题及解析
  10. Java基础之《netty(28)—TCP粘包拆包原理》