Kubernetes 高级调度 - Affinity

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.mfbz.cn/a/112747.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主从复制(gtid方式)

基于事务的Replication,就是利用GTID来实现的复制 GTID(全局事务标示符)最初由google实现,在MySQL 5.6中引入.GTID在事务提交时生成,由UUID和事务ID组成.uuid会在第一次启动MySQL时生成,保存在数据目录下的…

「专题速递」数据驱动赋能、赛事直播优化、RTC技术、低延时传输引擎、多媒体处理框架、GPU加速...

点击文末阅读原文, 免费报名【抖音背后的体验增长实战揭秘】专场 随着全行业视频化的演进,营销、知识、商业和空间的交互体验正在被重塑。这种变化不仅仅是一种抽象的趋势,更是关系到用户留存和业务增长的关键因素。面对这样的挑战&#xff0…

Debookee 8 for Mac网络数据分析工具

Debookee是一款用于网络数据流量分析和嗅探的软件。它为用户提供了一个直观的界面,让他们能够查看和分析来自从网络上的各种设备的数据流量。 Debookee具有以下主要功能: 实时监控:Debookee可以实时监控网络上的数据流量,并将其显…

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

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

NLP学习笔记:使用 Python 进行NLTK

一、说明 本文和接下来的几篇文章将介绍 Python NLTK 库。NLTK — 自然语言工具包 — NLTK 是一个强大的开源库,用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推…

Python 自动化(十六)静态文件处理

准备工作 将不同day下的代码分目录管理,方便后续复习查阅 (testenv) [rootlocalhost projects]# ls day01 day02 (testenv) [rootlocalhost projects]# mkdir day03 (testenv) [rootlocalhost projects]# cd day03 (testenv) [rootlocalhost day03]# django-admi…

windows docker desktop 更换镜像 加速

最近 docker hub 访问不了; 经过研究 可以通过添加 代理镜像网址 添加代理服务器的方式 实现完美访问 1添加镜像网站 修改成国内镜像地址就能享受到飞一般的速度,但有一个问题,部分站点镜像不全或者镜像比较老,建议使用多个镜像站。 https…

【Tomcat Servlet】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例: 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验

智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成,智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态,到空气质量情况、环…

按顺序判断对象a和b中第一个不同之处ax和bx【1】ax是否小于等于bx【2】不同处ax是否为空operator.le()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 按顺序判断对象a和b中 第一个不同之处ax和bx 【1】ax是否小于等于bx 【2】不同处ax是否为空 operator.le() [太阳]选择题 下列代码执行输出结果为True的个数为? import operator pr…

【ELFK】之Filebeat

一、Filebeat介绍 1、Filebeat是什么? Filebeat适用于转发和集中数据的轻量级传送工具,Filebeat监视了指定的日志文件或位置,收集日志事件,并将他们转发到Elasticsearch或Logstash进行索引。 **Filebeat的工作方式:*…

@reduxjs/toolkit配置react-redux解决createStore或将在未来被淘汰警告

通常 我们用redux都需要通过 createStore 但目前 你去用它 基本都会被划线 甚至有点厉害的的编辑器 他会直接告诉你这个东西基本快被弃用了 这个应该大家都知道 最好不要用已经被明确未来或弃用的语法 因为一旦弃用这个系统就需要维护 而且说 一般会被淘汰的语法 本身也就是有…

Python的网络编程一篇学透,使用Socket打开新世界

目录 1.网络概念 2.网络通信过程 2.1.TCP/IP 2.2.网络协议栈架构 3.TCP/IP介绍 3.1.ip地址 3.2.端口号 3.3.域名 4.Python网络编程 4.1.TCP/IP 4.2.socket的概念 4.3.Socket类型 4.4.Socket函数 4.5.Socket编程思想 5.客户端与服务器 5.1.tcp客户端 6.网络调试…

C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_DNN_Demo …

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及,越来越多的企业开始使用钉钉作为内部沟通工具。然而,对于企业管理者来说,如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法,帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

18.自监督视觉`transformer`模型DINO

文章目录 自监督视觉`transformer`模型DINO总体介绍DINO中使用的SSL和KD方法multicrop strategy损失函数定义`teacher`输出的中心化与锐化模型总体结构及应用reference欢迎访问个人网络日志🌹🌹知行空间🌹🌹 自监督视觉transformer模型DINO 总体介绍 论文:1.Emerging …

国际多语言出海商城源码/返佣产品自动匹配拼单商城源码

源码介绍&#xff1a; 国际多语言出海商城返佣产品自动匹配订单拼单商城源码&#xff0c;8国多语言出海拼单商城。此网站是很多巴西客户定制的原型&#xff0c;已投放运营符合当地本地化。 多语言商城返利返佣投资理财派单自带余额宝&#xff0c;采取全新支付端口&#xff0c…

Hadoop RPC简介

数新网络-让每个人享受数据的价值https://www.datacyber.com/ 前 言 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC它假定某些协议的存在&#xff0c;例…

师从IEEE Fellow|民办高校计算机专业教师自费赴美访学

D老师科研背景较弱&#xff0c;拟自费访学并带孩子出国就读&#xff0c;故要求申请到美国生活成本低且有较好公立中学教育资源的地区&#xff0c;并希望对方不收管理费。最终我们落实了德克萨斯大学达拉斯分校的邀请函&#xff0c;对方是IEEE Fellow、IET Fellow和EAI Fellow三…
最新文章