概念

关于 K8S 对 Pod 的调度,通常情况下Pod被分配到哪些Node是不需要我们操心的,这个过程会由scheduler自动实现。但有时,我们需要让Pod按照我们的预想运行在Node上(例如某些应用 “必须/或者尽量” 跑在具有SSD存储的节点上,有些彼此相关的Pod应用应该跑在同一个节点上)。为此,k8s为我们提供了这样的策略,我们可以通过使用 “亲和性/非亲和性” 制定一些规则来实现我们的需求。

亲和性调度可以分成软策略和硬策略两种方式:

  • 硬策略:可以理解为必须,就是如果没有满足条件的节点的话,就不断重试直到满足条件为止。对应的配置规则为 requiredDuringSchedulingIgnoredDuringExecution
  • 软策略:可以理解为尽量,就是如果现在没有满足调度要求的节点的话,pod就会忽略这条规则,继续完成调度的过程,说白了就是满足条件最好了,没有的话也无所谓。对应的配置规则为 preferredDuringSchedulingIgnoredDuringExecution

亲和性的配置规则分为 Node亲和性、Pod亲和性、Pod反亲和性

  • nodeAffinity :节点亲和性,用来控制 Pod 要部署在哪些节点上,以及不能部署在哪些节点上的,这个是 Pod 与 Node 之间匹配规则的。
  • podAffinity :pod 亲和性,这个是 Pod 与 Pod 之间匹配规则的。
  • podAntiAffinity :pod 反亲和性,与 podAffinity 相反。
  1. 这个亲和性看起来和一直使用的nodeSelector 作用比较重叠,但是你会发现它更的控制更为细致且概念更优。据说官方将会在后续的版本中废除 nodeSelector,故建议大家使用使用亲和性策略。
  2. 节点亲和性相较于 nodeSelector 在调度方式上,有几点增强:① 更多的表达式支持,不仅仅是ADD和精确匹配;② 可以设置soft/preference的调度策略,而不是刚性的要求;③ 可以通过Pod的标签进行调度约束,不仅仅是Node的标签。
  3. podAffinity 处理 Pod 和 Pod 在一起的规则,podAntiAffinity 处理的是 Pod 和 Pod 不能在一起的规则。它俩处理的是Kubernetes集群内部Pod和Pod之间的关系。
  4. 所有规则终究还是以 Label 为元数据的。
AFFINITY SELECTOR REQUIREMENTS MET REQUIREMENTS NOT MET REQUIREMENTS LOST
requiredDuringSchedulingIgnoredDuringExecution Runs Fails Keeps Running
preferredDuringSchedulingIgnoredDuringExecution Runs Runs Keeps Running
(un-implemented) requiredDuringSchedulingRequiredDuringExecution Runs Fails Fails

对于 label 的匹配规则,可选的操作符有:

操作符 规则说明
In label 的值在某个列表中
NotIn label 的值不在某个列表中
Exists 某个 label 存在
DoesNotExist 某个 label 不存在
Gt label 的值大于某个值(字符串比较)
Lt label 的值小于某个值(字符串比较)

如果 nodeAffinity 中 nodeSelectorTerms 有多个选项,则节点满足任何一个条件就可以;
如果 matchExpressions 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 Pod。

实例

  • 我们一般通过 Deployment 和 DaemonSet 来部署 Pod,纯粹部署一个 Pod 的情况却不太常见。
  • 在 Deployment 和 DaemonSet 的 yaml 中配置的 template 节点以下的内容,顾名思义就是其预部署的 Pod 的模板,在 template 节点这里配置的规则内容最终都会实际落实到具体 Pod 的 yaml 文件配置上。
  • 所以,网上看到的一些关于亲和性的示例中 kind: Deploymentkind: Pod 其实在具体规则上你可以认为是一样的。
apiVersion: apps/v1
kind: Deployment
metadata:name: affinity-testlabels:app: affinity-test
spec:replicas: 8selector:matchLabels:app: affinity-testtemplate:metadata:labels:app: affinity-testspec:containers:- name: nginximage: nginx:1.20.2ports:- containerPort: 80name: nginxwebaffinity:nodeAffinity:  # 作用域:Pod和Node之间requiredDuringSchedulingIgnoredDuringExecution:  # Node亲和性-硬策略nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: NotInvalues:- node3preferredDuringSchedulingIgnoredDuringExecution:  # Node亲和性-软策略- weight: 1preference:matchExpressions:- key: customlabeloperator: Invalues:- weblbpodAffinity:  # 作用域:Pod和Pod之间requiredDuringSchedulingIgnoredDuringExecution:  # Pod亲和性-硬策略- labelSelector:matchExpressions:- key: securityoperator: Invalues:- security1topologyKey: failure-domain.beta.kubernetes.io/zonepodAntiAffinity:  # 作用域:Pod和Pod之间preferredDuringSchedulingIgnoredDuringExecution:  # Pod非亲和性-软策略- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: securityoperator: Invalues:- security2topologyKey: kubernetes.io/hostname

(END)

K8s 亲和性和非亲和性(Affinity)相关推荐

  1. K8S调度之pod亲和性

    目录 Pod Affinity Pod亲和性调度 pod互斥性调度 Pod Affinity 通过<K8S调度之节点亲和性>,我们知道怎么在调度的时候让pod灵活的选择node,但有些时候 ...

  2. k8s中亲和性与反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  3. k8s之亲和性、反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  4. k8s学习(二十一) 亲和性调度

    亲和性调度可以分成软策略和硬策略两种方式: 软策略就是如果你没有满足调度要求的节点的话,pod 就会忽略这条规则,继续完成调度过程,说白了就是满足条件最好了,没有的话也无所谓了的策略 硬策略就比较强硬 ...

  5. k8s学习笔记-调度之Affinity

    Kubernetes中的调度策略可以大致分为两种 一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法,具体可以参看上一篇 ...

  6. 【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性

    该篇文章已经被专栏<从零开始学k8s>收录 Pod节点亲和性和常见的状态 Pod 节点亲和性 pod 节点反亲和性 写在最后 Pod 节点亲和性 pod 自身的亲和性调度有两种表示形式 p ...

  7. pod 的亲和性,反亲和性 实验

    文章目录 1 ,环境准备 2 亲和性+ In 测试 3 亲和性+NotIn 测试 4 非亲和性+In 测试 5 非亲和性 + NotIn 测试 1 ,环境准备 node01. node02 都有标签 ...

  8. Kubernetes 亲和性与反亲和性

    文章目录 一.前言 1. 概述 2. 亲和性和反亲和性的类型 3.硬亲和与软亲和 4.亲和性支持的运算符 二.nodeAffinity(节点亲和) 1. 测试环境准备 2. 节点硬亲和 3. 节点软亲 ...

  9. Kubernetes调度之亲和性和反亲和性

    背景 Kubernetes中的调度策略可以大致分为两种,一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法:另一种是运行 ...

  10. linux多核编程系列之调度亲和性,关于CPU亲和性,这篇讲得最全面

    何为CPU的亲和性 CPU的亲和性,进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性,进程迁移的频率小就意味着产生的负载小.亲和性一词是从affinity翻译来的,实际可以 ...

最新文章

  1. c++多线程编程:常见面试题
  2. PFLD:简单高效的实用人脸关键点检测算法
  3. 64位下搭载汇编环境
  4. 您是如何开始使用Linux的?
  5. Java基础知识之变量与常量、数据类型、类型转换
  6. MySQL数据库基础(三)——SQL语言
  7. 康托展开、康托逆展开原理
  8. 6 和 9 组成的最大数字
  9. 消失的梯度问题(vanishing gradient problem)
  10. 若依分离版在windows上部署(1)
  11. 离散数学-10.1群
  12. linux panic机制
  13. 阿里内推五面:一面+二面+三面+交叉面+HR面,含答案赠送
  14. [python]用request库来处理Http协议-收集北航表白墙内的数据
  15. 组件分享之后端组件——一个简单且高度可扩展的分布式文件系统seaweedfs
  16. 原来Java世界里也有这么多精彩的故事,学Java真有趣!
  17. 化工人员定位安全管理系统平台建设
  18. 最新版外贸找客户工具 LetsExtract Email Studio Crack
  19. 安装 | Matlab2022a / MATLAB R2022b下载及新功能一览
  20. hackmap-[windows权限提升(windows提权思路)]

热门文章

  1. js 实现文件下载——文档流形式和本地文件下载——基础积累
  2. 哈利波特英文单词统计频率
  3. 什么是智能DNS解析?
  4. PHP 5.6,7.0,7.1,7.2 和 HHVM 运行效率比较
  5. 【微机原理与接口技术】学习笔记9 DMA控制器8237A
  6. p3110 二叉堆练习3--排序
  7. windows7系统如何连接远程桌面
  8. 和刘备相关的人(八 )
  9. 数据报表体系搭建流程
  10. 流媒体播放器EasyPlayer.js如何实现动态设置解码H.265音频?