k8s 亲和 & 反亲和介绍

文章内容来自k8s文档翻译以及个人理解和实际使用过程中的实践内容
参考:https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/

目录

文章目录

  • k8s 亲和 & 反亲和介绍
    • 目录
    • pod调度到node(nodeSelector)
    • 亲和与反亲和(Affinity and anti-affinity)
      • 节点亲和
      • Pod间亲和 & 反亲和
    • 其他需要注意的点:

pod调度到node(nodeSelector)

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector: # 匹配节点的label,多个label之间为‘与’关系disktype: ssd

节点内置label: Well-Known Labels, Annotations and

亲和与反亲和(Affinity and anti-affinity)

节点亲和

节点亲和在概念上和nodeSelector类似–根据node的label来约束pod可以调度到哪些节点。

有两种类型的节点亲和

硬亲和 requiredDuringSchedulingIgnoredDuringExecution

软亲和 preferredDuringSchedulingIgnoredDuringExecution

硬亲和指定将pod调度到节点上必须满足的规则(类似于nodeelector,但语法更形象)
软亲和指定首选项,调度器将尝试执行但没有保证。
名称中IgnoredDuringExecution的部分表示:如果pod根据亲和规则被调度到某节点运行之后,此时node上的labels发生变化(不再符合pod上的亲和性规则)不会对在该节点上运行的pod造成影响。
在未来,k8s计划提供requireduringschedulingrequireduringexecution,除了从不再符合pod亲和规则的节点上会自动驱逐pod,其他功能和requireduringschedulingignoredduringexecution一致。

apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/e2e-az-nameoperator: Invalues:- e2e-az1- e2e-az2preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: another-node-label-keyoperator: Invalues:- another-node-label-valuecontainers:- name: with-node-affinityimage: k8s.gcr.io/pause:2.0

查询表达式中可以使用的操作符有:In, NotIn, Exists, DoesNotExist, Gt, Lt等。操作符为In, NotIn时可以有多个值,Gt, Lt只能有且必须有一个值,Exists, DoesNotExist值必须为空。

可以使用NotInDoesNotExist来实现节点反亲和行为,或使用node taints驱逐特定节点上的Pod。

如果同时指定了nodeSelectornodeAffinity,则必须同时满足这两个条件,才能将pod调度到候选节点上

requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms数组的多个元素之间为的关系

requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[i].matchExpressions数组的多个元素之间为的关系

preferredDuringSchedulingIgnoredDuringExecution数组的多个元素之间为的关系

preferredDuringSchedulingIgnoredDuringExecution中的weight字段的范围是1-100。对于每个满足所有调度要求的节点(资源需求, requireduringscheduling亲和表达式等等),调度程序就计算preferredDuringSchedulingIgnoredDuringExecution下所有匹配MatchExpressions的条目的weight的总和,然后将此分数与该节点的其他优先级函数的分数合并,优先选择总得分最高的节点。

Node affinity per scheduling profile

FEATURE STATE: Kubernetes v1.20 [beta]

另外可以通过kube-scheduler的multiple-profiles特性来实现不同的亲和策略。即在KubeSchedulerConfiguration的profiles中配置不同调度器的亲和规则

apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler- schedulerName: foo-schedulerpluginConfig:- name: NodeAffinityargs:addedAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: scheduler-profileoperator: Invalues:- foo

Pod间亲和 & 反亲和

pod间亲和与反亲和调度算法计算量较大,集群规模越大、节点越调度降速越明显,呈指数级增长。需要在使用此特性时考虑对调度速度的影响。

与节点不同,因为Pod是命名空间(因此Pod上的标签是隐式命名空间),所以Pod标签上的标签选择器必须指定选择器应用于哪些命名空间。若namespaces为空,则默认是和pod的namespace相同。

apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- S1namespaces:- ns-1- ns-2topologyKey: topology.kubernetes.io/zonepodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: securityoperator: Invalues:- S2topologyKey: topology.kubernetes.io/zonecontainers:- name: with-pod-affinityimage: k8s.gcr.io/pause:2.0

查询表达式中可以使用的操作符只有:In, NotIn, Exists, DoesNotExist

pod间亲和与反亲和的调度尺度不一定是以节点区分的,还可能是机架、机房、云服务提供商等拓扑域。
其拓扑域是通过topologyKey字段定义的,这个字段的值是node的一个label的key,针对这个label,拥有相同value的节点属于同一拓扑域,pod亲和调度的时候会以拓扑域为基础,即根据该拓扑域(可能是一个节点、也可能是多个节点)中已存在的pod,判断新的pod应该(或不应该)调度到该拓扑域中的节点上。

原则上,topologyKey可以是任何合法的标签的key。然而,出于性能和安全方面的原因,对topologyKey有一些限制:

  1. pod亲和与反亲和的requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution都不允许topologyKey为空。
  2. pod反亲和的requiredDuringSchedulingIgnoredDuringExecution被引入的admission controllerLimitPodHardAntiAffinityTopology限制,只能是kubernetes.io/hostname,如果想使用自定义的topologyKey您可以修改或禁用掉admission controller。

其他需要注意的点:

节点亲和与pod间亲和为&的关系,即需要同时满足两者或三者。

应当避免多个同时部署的的k8s负载资源pod间亲和配置存在相互依赖关系,如果形成死锁会导致无法成功调度。

k8s 亲和 反亲和介绍相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. K8S node亲和与反亲和:affinity应用

    简介: affinity是K8S 1.2版本后引入的新特性,类似于nodeSelector,允许使用者指定一些pod在Node间调度的约束,目前支持两种形式: 1. requireDuringSche ...

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

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

  9. kubernetes 亲和、反亲和、污点、容忍

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

最新文章

  1. Java虚拟机 —— 类的加载机制
  2. Java浮点值拒绝服务漏洞危害分析
  3. Spring Boot 2.2.0 正式发布,大幅性能提升 + Java 13 支持
  4. Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19
  5. OpenGL相机控制之二
  6. 集成学习之sklearn中的xgboost基本用法 (转载)
  7. bootstraptable获得所有行_2020广汽本田安全中国行·首届道路安全创新大赛成功举办...
  8. Linux 杀掉所有Java进程
  9. GAT GAX 简介
  10. Golang面试问题汇总
  11. Java开发基础面试知识点
  12. TiCDC同步延迟问题处理
  13. 肖sir__面试就业课___数据库
  14. pica8公司和picOS
  15. 10个超赞的jQuery图片滑块动画
  16. -Xms -Xmx等jvm参数的含义
  17. Binary XML file line #2 in com.example.helloworld:layout/activity_main: Binary XML file line #2 in c
  18. 对未来的打算和本专业的认识
  19. 一个骨灰级玩家的游戏加速器使用心得分享
  20. 【笔记】29元microbit套装如何玩——套装硬件简介

热门文章

  1. Invalid prop: custom validator check failed for prop “pagination“.
  2. python交互编程模式_进入python交互模式的方法
  3. 华硕无双+2022款笔记本重装系统笔记
  4. oa项目经验描述_(完整版)简历中的项目经验范文
  5. Incorrect string value: ‘\xF0\x9F\x91\x82‘ for column ‘address‘ at row 1
  6. Android-第十三节04Room框架详解
  7. 互联网金融热浪下丨看看美国的互联网金融怎么玩?
  8. 【仿真】后仿真中的notifier是奏啥滴!
  9. 2020蚂蚁集团招股说明书.pdf
  10. 天蝎座2019年4月运势