【k8s】:深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

【k8s】:深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

  • 1、什么是亲和性?
  • 2、节点亲和性(Node Affinity)
    • 2.1 硬性节点亲和性规则(required)
    • 2.2 软性节点亲和性规则(preferred)
  • 3、Pod亲和性(Pod Affinity)
    • 3.1 Pod硬性亲和性规则
    • 3.2 Pod软性亲和性规则
  • 4、Pod 反亲和性(Pod Anti-Affinity)
  • 5、总结


💖The Begin💖点点关注,收藏不迷路💖

在 Kubernetes(K8s)集群中,亲和性(Affinity)是一项强大的功能,它允许我们通过标签选择器来指定 Pod 与节点或其他 Pod 之间的关系,以影响调度决策。

在这篇博客中,我们将深入探讨 Kubernetes 中的亲和性概念、不同类型的亲和性以及它们在集群调度中的应用。

1、什么是亲和性?

在Kubernetes中,亲和性是一种调度策略,用于指定Pod倾向于被调度到具有特定属性的节点。亲和性分为两种类型:

1、节点亲和性(Node Affinity):指定Pod倾向于被调度到具有特定标签或标签表达式的节点。
2、Pod亲和性(Pod Affinity):指定Pod倾向于与具有特定标签或标签表达式的其他Pod共存。

2、节点亲和性(Node Affinity)

节点亲和性允许我们指定 Pod 应该在哪些节点上运行。它可以根据节点的标签来决定 Pod 的调度位置。

节点亲和性规则可以是硬性的或软性的。硬性规则要求 Pod 必须在匹配的节点上运行,而软性规则则更加宽松,只是倾向于将 Pod 调度到符合条件的节点上。

2.1 硬性节点亲和性规则(required)

1、硬性规则指定了 Pod 必须被调度到满足规则条件的节点上,否则 Pod 将无法被调度和启动。

例如,可以使用硬性节点亲和性规则来确保 Pod 只能被调度到拥有特定标签的节点上。这在需要确保特定类型的节点才能运行某些任务时非常有用。

下面是一个示例 YAML 文件,其中定义了一个 Pod,并指定了硬性节点亲和性规则,要求 Pod 只能被调度到具有标签为 “gpu=true” 的节点上:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # 定义 Pod 的名称为 "nginx-pod"
spec:
  containers:
  - name: nginx-container  # 定义 Pod 中的容器名称为 "nginx-container"
    image: nginx:latest  # 使用最新版本的 nginx 容器镜像
  affinity:
    nodeAffinity:  # 指定节点亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬性节点亲和性规则,要求在调度过程中必须满足条件
        nodeSelectorTerms:  # 指定节点选择条件
        - matchExpressions:  # 指定匹配表达式
          - key: gpu  # 定义匹配表达式的键为 "gpu"
            operator: In  # 使用 In 操作符进行匹配
            values:  # 定义匹配的值
            - "true"  # 要求节点的标签中包含值为 "true" 的 "gpu" 标签

2.2 软性节点亲和性规则(preferred)

软性规则指定了 Pod 更倾向于被调度到满足规则条件的节点上,但并不强制要求。

例如,可以使用软性节点亲和性规则来指定 Pod 更倾向于被调度到某个特定区域的节点上,以减少数据传输延迟。

下面是一个示例 YAML 文件,其中定义了一个 Pod,并指定了软性节点亲和性规则,要求 Pod 更倾向于被调度到具有标签为 “zone=us-west” 的节点上:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # Pod的名称
spec:
  containers:
  - name: nginx-container  # 容器的名称
    image: nginx-image  # 容器使用的镜像
  affinity:
    nodeAffinity:  # 节点亲和性
      preferredDuringSchedulingIgnoredDuringExecution:  # 在调度期间优先考虑,但在执行期间被忽略
      - weight: 1  # 权重为1,表示较高的优先级
        preference:  # 优先选择的条件
          matchExpressions:  # 匹配表达式列表
          - key: zone  # 标签的键
            operator: In  # 匹配操作符,表示在值列表中的任何一个
            values:
            - "us-west"  # 匹配的值为"us-west"

3、Pod亲和性(Pod Affinity)

Pod 亲和性允许我们指定 Pod 应该与哪些其他 Pod 共同运行。它可以确保相关的服务或组件在同一节点或不同节点上运行,以提高性能或可用性。与节点亲和性类似,Pod 亲和性规则也可以是硬性的或软性的。

3.1 Pod硬性亲和性规则

硬性亲和性规则指定了 Pod 必须满足的条件,如果这些条件不能满足,Pod 将不会被调度到任何节点上。

以下是一个使用硬性亲和性规则的示例,要求 Pod 只能被调度到具有 “zone=us-west” 和 “environment=production” 标签的节点上:

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: affinity-pod  # 指定 Pod 的名称为 affinity-pod
spec:
  containers:
  - name: affinity-container  # 定义 Pod 中的容器名称为 affinity-container
    image: affinity-image  # 指定容器所使用的镜像为 affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    nodeAffinity:  # 指定节点亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性节点亲和性规则
        nodeSelectorTerms:  # 指定节点选择器条件
        - matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-west  # 匹配值为 us-west
          - key: environment  # 指定节点标签的键为 environment
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - production  # 匹配值为 production

3.2 Pod软性亲和性规则

软性亲和性规则指定了 Pod 偏好的条件,如果这些条件可以满足,Pod 将会优先被调度到符合条件的节点上,但如果无法满足,Pod 仍然可以被调度到其他节点上。

以下是一个使用软性亲和性规则的示例,要求 Pod 偏好被调度到具有 “zone=us-east” 或 “zone=us-west” 标签的节点上:

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: affinity-pod  # 指定 Pod 的名称为 affinity-pod
spec:
  containers:
  - name: affinity-container  # 定义 Pod 中的容器名称为 affinity-container
    image: affinity-image  # 指定容器所使用的镜像为 affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    nodeAffinity:  # 指定节点亲和性规则
      preferredDuringSchedulingIgnoredDuringExecution:  # 指定为软性节点亲和性规则
      - weight: 1  # 指定权重为 1
        preference:  # 指定偏好条件
          matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-east  # 匹配值为 us-east
      - weight: 1  # 指定权重为 1
        preference:  # 指定偏好条件
          matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-west  # 匹配值为 us-west

4、Pod 反亲和性(Pod Anti-Affinity)

Pod 反亲和性(Pod Anti-Affinity)是一种 Kubernetes 调度策略,用于指定 Pod 不能被调度到与其他特定 Pod 相同的节点上。这有助于提高应用程序的可靠性和可用性,避免将相互依赖或相互竞争的 Pod 部署在同一节点上。

以下是一个 Pod 反亲和性的示例 :

要求该 Pod 不能被调度到具有标签 app=my-app 的其他 Pod 所在的节点上。这样可以确保这两个相互关联的 Pod 不会被部署在同一节点上,从而提高应用程序的可靠性。

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: anti-affinity-pod  # 指定 Pod 的名称为 anti-affinity-pod
spec:
  containers:
  - name: anti-affinity-container  # 定义 Pod 中的容器名称为 anti-affinity-container
    image: anti-affinity-image  # 指定容器所使用的镜像为 anti-affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    podAntiAffinity:  # 指定 Pod 反亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性 Pod 反亲和性规则
      - labelSelector:  # 指定标签选择器
          matchExpressions:  # 指定匹配表达式
          - key: app  # 指定标签的键为 app
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - my-app  # 匹配值为 my-app

5、总结

在这里插入图片描述

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

如何制作二维码电子画册?轻松入门,快速上手!

在当今数字化时代,二维码电子画册成为了企业推广和信息传递的重要工具之一。相比传统纸质画册,二维码电子画册不仅环保节能,而且可以通过扫描二维码轻松获取更多详细信息,为用户提供了更加便捷的阅读体验。 今天就教大家如何制作二…

【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 Java 空行强制类型转换Java 基本数据类型内置数据类型引用类型 Java 空行 空白行或者有注释的行,Java 编译器都会忽略掉。 强制类型转换 当需要将一个数据类型转换为另一个数据类型时&#xff0c…

浅尝 express + ORM框架 prisma 的结合

一、prisma起步 安装: npm i prisma -g查看初始化帮助信息: prisma init -h查看初始化帮助信息结果: Set up a new Prisma projectUsage$ prisma init [options] Options-h, --help Display this help message --datasource-provider …

Intewell-Hyper II_V2.1.1_工业实时操作系统软件版本发布

Intewell-Hyper II_V2.1.1_工业实时操作系统软件版本发布 Intewell-Hyper II_V2.1.1 版本号:V2.1.1 版本特点 新增V1.3.2分支上SHV构型合并及问题回归 版本或修改说明 增加功能: 1.V1.3.2分支上SHV构型合并及问题回归 2.适配NewPre3102和NewPre3101…

node+vue3的websocket前后端消息推送

nodevue3的websocket前后端消息推送 前期写web项目时,前端获取数据的方式一般是向后端发起数据请求,然后后端向前端发送数据,然后对数据进行渲染,这是最常规的一种数据通讯方式,适用于绝大部分前后端分离的项目 实际…

java的ConcurrentHashMap深入理解

概要 怎么保证线程安全: 在初始化数组时用了cas操作,sizectl作为占位标志(U.compareAndSwapInt(this, SIZECTL, sc, -1);获取数组中的元素是否已经有了,用Volatile修饰数组(保证可见性)&#…

边缘计算网关有哪些优势?-天拓四方

随着信息化、智能化浪潮的持续推进,计算技术正以前所未有的速度发展,而边缘计算网关作为其中的重要一环,以其独特的优势正在逐步改变我们的生活方式和工作模式。本文将详细解析边缘计算网关的优势。 首先,边缘计算网关具有显著的…

【好书推荐6】《Excel函数与公式应用大全for Excel 365 Excel 2021》

【好书推荐6】《Excel函数与公式应用大全for Excel 365 & Excel 2021》 写在最前面《Excel函数与公式应用大全for Excel 365 & Excel 2021》关键点内容简介作者简介前言/序言目录 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光&…

Linux之命令行参数的原理以及实现,环境变量限时增加删除和永久增加删除以及代码获取环境变量

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 一.命令行参数 1.1main函数参数 在我们学习c语言时我们的main函数…

Vue - 5( 16000 字 Vue2 入门级教程)

一:Vue 初阶 1.1 组件自定义事件 在 Vue 中,组件间通过自定义事件进行通信是一种常见的模式。自定义事件允许子组件向父组件发送消息,也可以在组件内部进行事件的绑定、触发和解绑。让我们详细讲解这些知识点。 1.1.1 组件自定义事件 在 …

最前沿・量子退火建模方法(2) : Domain wall encoding讲解和python实现

前言 上篇讲的subQUBO属于方法论,这次讲个通过编码量子比特的方式,同样的约束条件,不同的编码,所需的量子比特数是不同的。有的编码方式,很节省量子比特。比如,这次要讲的Domain wall encoding。 一、Doma…

一文总结:Python的封装、继承和多态

整个程序员的生涯,最重要的一个知识根基就是面向对象的理解和掌握深度。如果你意识到了面向对象开发思想的重要性,请仔细学习这篇文章。 希望对你有帮助! 这篇详细地解释封装、继承和多态,并在最后提供一个综合示例来总结这三个…

PyQt介绍——弹框介绍和使用

PyQt介绍——弹框介绍和使用 一、QMessageBox QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈 QMessageBox类提供了许多常用的弹出式对话框,如提示、警告、错误、询问、关于等对话框。这…

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD...,无法按下任何按键

Hyper-v 新建 Windows 虚拟机卡在“Press any key to boot from CD or DVD…,无法按下任何按键 在显示这个界面之后点击启动,之后立刻狂按F2, 然后就能进去了

​代码混淆的原理是什么?常见代码混淆方法介绍

本文主要想你介绍代码混淆的原理,常见代码混淆方法,欢迎查阅~ 移动应用代码安全非常重要,代码逆向会导致代码逻辑被获取,进一步导致控制流被hook,安全防线被破,给APP安全带来巨大风险,因此开发者…

淘宝扭蛋机小程序:扭转购物新风尚,开启惊喜连连之旅

随着移动互联网的飞速发展,淘宝作为国内领先的电商平台,始终致力于为用户带来更加新颖、有趣的购物体验。如今,我们隆重推出淘宝扭蛋机小程序,将传统扭蛋机的乐趣与电商购物的便捷完美结合,为用户带来前所未有的惊喜与…

PyTorch构建自然语言处理模型

一、整体流程 二、 详细步骤 1. 准备数据 在构建自然语言处理模型之前,首先需要准备数据。可以使用PyTorch提供的Dataset和DataLoader类来加载和处理数据。 # 导入必要的库 import torch from torch.utils.data import Dataset, DataLoader # 定义自定义Dataset类…

Linux进程控制篇

1. 进程创建 fork()函数创建一个进程: 父进程返回子进程的pid子进程返回0 创建进程后,我们希望子进程做的事有两种: 子进程帮父进程完成同样的工作子进程干其他任务 进程 内核的相关管理数据结构(tack_struct mm_struct 页表) 代码和数据…

python零基础入门笔记【源源老师】

1. print() 输出 (1)认识英文单词 print: 输出(2)print() 的作用 print():用于在控制台上输出你想要的内容。 (3)代码演示 举例1: 【注意:】用双引号包裹的&#xff0…

OpenHarmony开发实例:【新闻客户端】

介绍 本篇Codelab我们将教会大家如何构建一个简易的OpenHarmony新闻客户端(JS版本)。应用包含两级页面,分别是主页面和详情页面,两个页面都展示了丰富的UI组件,其中详情页的实现逻辑中还展示了如何通过调用相应接口&a…