Kubernetes 高级调度 - Affinity

news2025/2/23 4:39:19

New-Project-2

Author:rab


目录

    • 前言
    • 一、Node 亲和性
      • 1.1 NodeAffinity
        • 1.1.1 Hard Node Affinity
        • 1.1.2 Soft Node Affinity
      • 1.2 NodeAntiAffinity
    • 二、Pod 亲和性
      • 2.1 PodAffinity
        • 2.1.1 Hard Pod Affinity
        • 2.1.2 Soft Pod Affinity
      • 2.2 PodAntiAffinity
    • 总结


前言

Kubernetes 中的 Affinity(亲和性)和 AntiAffinity(反亲和性)是用于 Pod 调度的关键概念,它们允许我们控制 Pod 在集群中的分布以满足不同的需求。这些概念分为两类:NodeAffinity(节点亲和性)和PodAffinity(Pod亲和性),以及它们的反对应概念,NodeAntiAffinity(节点反亲和性)和PodAntiAffinity(Pod反亲和性)。

首先我们要明白:Kubernetes 中的调度策略可以大致分为两种:

  • 全局调度策略:在启动调度器时配置,包括 kubernetes 调度器自带的各种 predicates、priorities 算法。
  • 运行时调度策略:也就是我们本次即将提到的 Affinity 与 AntiAffinity。

接下来,我们将对 Affinity 与 AntiAffinity 分别进行案例分析。

一、Node 亲和性

1.1 NodeAffinity

1、功能

NodeAffinity 允许我们定义 Pod 应该调度到具有特定节点标签或标签选择器匹配的节点上。通过使用 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution 字段,我们可以设置节点亲和性规则,要求或首选 Pod 与特定节点条件匹配。通常用于确保 Pod 在特定类型的节点上运行,以满足硬件、软件或其他特定的要求。

2、案例(片段)

...
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "gpu"
          operator: In
          values:
          - "true"
...

因此,定义节点亲和性规则有 2 种:硬亲和性(Hard Node Affinity)和软亲和性(Soft Node Affinity)。

  • 硬亲和性(Hard Node Affinity)对应字段:requiredDuringSchedulingIgnoredDuringExecution
  • 软亲和性(Soft Node Affinity)对应字段:preferredDuringSchedulingIgnoredDuringExecution

接下来分别看看这两种亲和性的具体应用。

1.1.1 Hard Node Affinity

1、功能

硬亲和性是一种强制性规则,要求 Pod 只能在满足特定条件的节点上运行。如果硬亲和性规则不满足,Pod 将不被调度,这意味着 Pod 可能无法运行。硬亲和性适用于需要绝对满足特定硬件或软件要求的情况,例如只在带有 GPU 的节点上运行。

2、案例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hard-affinity-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "gpu"
                operator: In
                values:
                - "true"
      containers:
      - name: my-container
        image: my-image:latest

在这个示例中,我们创建了一个名为 hard-affinity-deployment 的 Deployment 对象。在 Pod 模板中,我们设置了硬亲和性规则,要求 Pod 只能在带有 “gpu=true” 标签的节点上运行,如果没有满足此条件的节点可用,Pod将无法被调度。

这里需要注意的是:在 Pod 资源基于节点亲和性规则调度到某个节点之后,如果节点的标签发生了改变,调度器不会将 Pod对象从该节点上移除,因为该规则仅对新建的Pod对象有效。

1.1.2 Soft Node Affinity

1、功能

软亲和性是一种容忍性规则,它提供了一个首选条件,但不强制要求 Pod 在特定条件下运行。如果条件不满足,Pod 仍然可以被调度到不满足条件的节点上(但它会优先考虑满足条件的节点)。软亲和性适用于需要首选条件,但允许有一定的灵活性的情况。它可以用于提高性能或可用性,但不会阻止 Pod 的调度。

2、案例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: soft-affinity-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: "rack"
                operator: In
                values:
                - "rack-1"
            weight: 50
      containers:
      - name: my-container
        image: my-image:latest

在这个示例中,我们创建了一个名为 soft-affinity-deployment 的 Deployment。在 Pod 模板中,我们设置了软亲和性规则,优先在带有 “rack=rack-1” 标签的节点上运行(且权重为 50,数值越大则权重越高,则越优先匹配)。如果没有满足此条件的节点可用,Pod 仍然可以被调度到其他节点上,但它会优先考虑满足条件的节点。

那 Node 软硬亲和性是否可以结合使用呢?

答案是可以的,我们可以将上面的两个案例联合起来,具体 yaml 文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: combined-affinity-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "gpu"
                operator: In
                values:
                - "true"
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: "rack"
                operator: In
                values:
                - "rack-1"
            weight: 50
      containers:
      - name: my-container
        image: my-image:latest

我们设置了硬亲和性规则和软亲和性规则:

  • 硬亲和性规则要求 Pod 只能在带有 “gpu=true” 标签的节点上运行。如果没有满足此条件的节点可用,Pod 将无法被调度。
  • 软亲和性规则优先在带有 “rack=rack-1” 标签的节点上运行,但如果没有满足此条件的节点可用,Pod仍然可以被调度到其他节点上,但它会优先考虑满足条件的节点。

这个示例演示了如何同时使用硬亲和性和软亲和性规则,以控制 Pod 的调度行为,确保它们在满足硬性要求的节点上运行,并在有多个选择时优先考虑软亲和性要求(从而避免了 Pod 无法调度的问题)。这种配置可以用于更复杂的调度策略,以满足不同的需求。

1.2 NodeAntiAffinity

1、功能

NodeAntiAffinity 允许我们定义 Pod 不应该调度到带有特定节点标签或标签选择器匹配的节点上。通常用于提高容错性,防止相同应用的多个实例在同一节点上运行。应用也很简单,将 yaml 文件中的 nodeAffinity 改为 nodeAntiAffinity 即可,这里不再演示。通常用于提高容错性,防止相同应用的多个实例在同一节点上运行。

2、案例(片段)

...
affinity:
  nodeAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "app"
          operator: In
          values:
          - "my-app"
...

二、Pod 亲和性

2.1 PodAffinity

1、功能

PodAffinity 允许我们定义 Pod 应该一起调度在相同节点上的规则。同样通过使用 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution字段,我们可以设置 Pod 亲和性规则,要求或首选 Pod 与其他具有特定标签的 Pod 一起调度。通常用于确保相关的服务或应用实例在相同节点上运行,以减少网络延迟或提高性能。

2、案例(片段)

...
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "gpu"
          operator: In
          values:
          - "true"
...

因此,与 Node 亲和性一样,Pod 亲和性也分为硬性软性

2.1.1 Hard Pod Affinity

1、首先我们要定义一些我们即将规划用于部署服务的 Node 标签

为什么要给节点定义标签?

原因:为了组建拓扑域,让满足要求的 Pod 被调度到你指定的拓扑域节点中。

# node1 节点
kubectl label nodes k8s-node01 zone=www
kubectl label nodes k8s-node01 disk=ssd

# node2 节点
kubectl label nodes k8s-node02 zone=www
kubectl label nodes k8s-node02 disk=hdd

# node3 节点
kubectl label nodes k8s-node03 zone=www-test
kubectl label nodes k8s-node03 disk=hdd

...

2、定义 Pod 亲和性

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hard-affinity-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hard-affinity-pod
  template:
    metadata:
      labels:
        app: hard-affinity-pod
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - hard-affinity-pod
              topologyKey: "zone"
      containers:
        - name: my-container
          image: my-image
          ports:
            - containerPort: 80

这里说一下上面案例中 topologyKey 字段:这里会涉及到拓扑域(Topology Domain)的概念。

topologyKey 是亲和性和反亲和性中的一个关键字段,用于定义节点的拓扑域(Topology Domain)。拓扑域是指 Kubernetes 集群中的节点分组,可以根据节点的标签或其他属性进行定义。常见的拓扑域包括节点所在的区域(Region)、可用区(Availability Zone)或机架(Rack)等。

说白了,若多个 Node 节点具有相同的标签信息(即 Node 节点标签键/值均相同),则表示这些 Node 节点就在同一拓扑域。

因此,在上述示例中,我们定义了一个 Deployment 资源,其中 Pod 具有硬亲和性。并指定了拓扑域为 zone,这意味着只有满足 Pod 标签为 app: hard-affinity-pod 的 Pod 才会被调度到 zone 域中的节点上(不满足要求则无法调度)。那 zone 域中有哪些节点呢?我们说了,根据 Node 节点标签来划分,很明显,zone 域中的节点有 k8s-node01k8s-node02

2.1.2 Soft Pod Affinity
apiVersion: apps/v1
kind: Deployment
metadata:
  name: soft-affinity-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: soft-affinity-pod
  template:
    metadata:
      labels:
        app: soft-affinity-pod
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - soft-affinity-pod
                topologyKey: "disk"
      containers:
        - name: my-container
          image: my-image
          ports:
            - containerPort: 80

与 Node 软亲和性类似,满足 Pod 标签为 app: hard-affinity-pod 的 Pod 会优先被调度到 disk 域中的节点上,如果发现没有满足的条件,依然可正常部署与其他节点上。

2.2 PodAntiAffinity

1、功能

PodAntiAffinity 允许我们定义 Pod 不应该一起调度在相同节点上的规则,即要求或首选 Pod 不与其他具有特定标签的 Pod 一起调度。通常用于提高容错性,防止相同应用的不同实例在同一节点上运行。

2、案例(片段)

...
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: "app"
          operator: In
          values:
          - "my-app"
    topologyKey: "kubernetes.io/hostname"
...

总结

  • NodeAffinity:
    • 匹配标签:主机标签
    • 支持操作符:In/NotIn/Exists/DoesNotExist/Gt/Lt
    • 是否支持拓扑域:
    • 实现功能:决定 Pod 可以部署在哪些主机上
  • NodeAntiAffinity:
    • 匹配标签:主机标签
    • 支持操作符:In/NotIn/Exists/DoesNotExist/Gt/Lt
    • 是否支持拓扑域:
    • 实现功能:决定 Pod 不可以部署在哪些主机上
  • PodAffinity:
    • 匹配标签:Pod 标签
    • 支持操作符:In/NotIn/Exists/DoesNotExist
    • 是否支持拓扑域:
    • 实现功能:决定 Pod 可以和哪些 Pod 部署在同一拓扑域上
  • PodAntiAffinity:
    • 匹配标签:Pod 标签
    • 支持操作符:In/NotIn/Exists/DoesNotExist
    • 是否支持拓扑域:
    • 实现功能:决定 Pod 不可以和哪些 Pod 部署在同一拓扑域上

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OceanBase:02-单机部署(生产环境)

目录 一、部署规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录,修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、OBD命令行部署 1.修改配置文件(all-c…

网络质量探测

目录 一.BFD监测网络状态 二. NQA检测网络状态 一.BFD监测网络状态 BFD(BidrectionaL Forwarding Detection 双向转发检测)用于快速检测系统设备之间的发送和接受两个方向的通信故障,并在出现故障时通知生成应用。BFD 广泛用于链路故障检测,并能实现与…

探究Java虚拟机运行时数据区,了解方法区的奥秘

目录 一、栈、堆、方法区交互关系 二、方法区的理解 三、HotSpot中方法区的演进 四、设置方法区大小与OOM 五、如何解决OOM 六、方法区的内部结构 (一)类型变量 (二)域信息 (三)方法信息 &#x…

AN动画基础——遮罩动画

【AN动画基础——遮罩动画】 什么是遮罩动画基本使用方法实战:水墨遮罩 本篇内容:了解遮罩动画 重点内容:遮罩动画应用 工 具:Adobe Animate 2022 什么是遮罩动画 遮罩动画是一种常见的图形效果,利用遮罩层来实现元素…

ARPG----C++学习记录02 Section6位置,偏移,函数

设置actor位置 这一句代码就可以更改位置和旋转 给位置添加偏移offset 将debug的持久都设置为false,在tick中调用,球就会动。这是每帧移动,所以移动速度和帧率有关,需要更改 void Aitem::Tick(float DeltaTime) {Super::Tick(DeltaTime);Ad…

【洛谷算法题】P5710-数的性质【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5710-数的性质【入门2分支结构】🌏题目描述🌏输入格式&a…

Nginx搭配负载均衡和动静分离:构建高性能Web应用的完美组合

前言 在当今互联网时代,高并发访问已成为Web应用程序面临的重要挑战之一。为了保证系统的稳定性和用户体验,我们需要采取有效的措施来应对这一挑战。本文将介绍如何利用Nginx搭配负载均衡和动静分离技术,构建高性能的Web应用。 一、Nginx简…

java反射API

反射 什么是Java的动态机制什么是反射机制什么是Class类Class提供了诸多的get方法 反射机制实例化对象Class提供了一个方法 Constructor类指定构造器实例化对象 Method类获取一个类中的所有方法Class类提供了对应的方法 获取本类自定义的所有方法Class类提供了对应的方法 获取表…

第四章 应用SysML基本特性集的汽车示例 P2(断更)|系统建模语言SysML实用指南学习

仅供个人学习 使用试用版CSM很鸡肋,然后书中一些内容没有说明,自定义方面有点困难,第四章暂时停止 同时感觉画图的顺序也很随意?甚至需求图放在了后面,觉得很离谱。 准备跳过这一章节 汽车模型 续P1 序列图表示启…

SolidWorks2019安装教程(正版)

网盘资源附文末 一.简介 SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统,由于技术创新符合CAD技术的发展潮流和趋势,SolidWorks公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百…

Es中出现unassigned shards问题解决

1、一般后台会报primary shard is not active Timeout: … 出现这种问题表示该索引是只读了,没办法进行shard及存储操作,优先排除是系统存储盘满了 2、通过监控工具查看(cerebro) 发现该索引shard 1 损坏 也可以通过命令进行查看 GET _cluster/allo…

阿里云短信服务接口返回: 只能向已回复授权信息的手机号发送

1、问题描述 在阿里云短信服务控制台,调用发送短信接口,报错:只能向已回复授权信息的手机号发送 2、问题分析 所使用的签名 是 测试or个人学习的 ,所以会导致 有的手机号发送不出去验证码 3、解决 如果在测试阶段,非要…

Python小试牛刀:GUI(图形界面)实现计算器UI界面(一)

下一篇:Python小试牛刀:GUI(图形界面)实现计算器UI界面(二)-CSDN博客 Python GUI 是指 Python 图形用户界面库,它们可以帮助开发者创建在计算机上运行的图形用户界面(GUI)。下面是一些常用的 P…

64T存储松下mov和索尼mp4文件变0字节恢复案例

64T存储松下mov和索尼mp4文件变0字节恢复案例 小型入门的小NAS凭借超市的性价比在各行业中开始流行,可以通过搭配普通SATA硬盘就可以完成阵列上线,部署也很简单,一根网线就搞定。我们看一个影视公司64T小NAS存储比较奇怪的恢复案例。 故障存…

【JavaScript保姆级教程】for循环与for循环遍历数组

文章目录 前言一、for循环1.1 什么是For循环?1.2 For循环示例1. 打印偶数2. 倒序打印 1.3 For循环遍历数组 二、JavaScript中的循环嵌套1.1 while循环的嵌套示例1:乘法表 示例2:打印星号三角形2.2 for循环的嵌套示例1:二维数组遍历…

pwd - 显示当前工作目录的路径

pwd命令来自英文词组“print working directory”的缩写,其功能是用于显示当前工作目录的路径,即显示所在位置的绝对路径。 在实际工作中,我们经常会在不同目录之间进行切换,为了防止“迷路”,可以使用pwd命令快速查看…

linux二进制文件分析三大工具详解(ldd、readelf、nm)

介绍 测试代码源码、源码如下&#xff1a; #include <openssl/evp.h> #include <openssl/sm2.h> #include <openssl/rand.h> #include <iostream> #include <string>EVP_PKEY* generate_sm2_key_pair() {EVP_PKEY_CTX *ctx;EVP_PKEY *pkey nu…

Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题

文章目录 1 外联接口1.1 接口类的封装1.2 共享内存与配置文件 2 json格式配置文件的定义2.1 共享内存中存储的节点结构2.2 服务器端配置文件2.3 客户端配置文件2.4 改进配置文件 3 共享内存类修改4 将接口打包成库(静态/动态)4.1 相关的指令4.1.1 静态库4.1.2 动态库 4.2 外联接…

CONTAINING_RECORD宏

CONTAINING_RECORD宏的使用 已知类或结构体成员变量的地址&#xff0c;可以取得类或结构体对象的地址。 代码 #include <windows.h> #include <iostream>class MyClass { public:MyClass(){}virtual ~MyClass(){}public:int m_Value1;int m_Value2;int m_Value3; …

「图像 merge」无中生有制造数据

在进行一个新项目的时候&#xff0c;往往缺少一些真实数据&#xff0c;导致没办法进行模型训练&#xff0c;这时候就需要算法工程师自行制作一些数据了&#xff0c;比如这篇文章分享的 bag 目标检测&#xff0c;在检测区域没有真实的 bag数据 此时&#xff0c;就可以采用图像拼…