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

Kubernetes(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-containerimage: affinity-image  # 指定容器所使用的镜像为 affinity-imageaffinity:  # 定义 Pod 的亲和性规则nodeAffinity:  # 指定节点亲和性规则requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性节点亲和性规则nodeSelectorTerms:  # 指定节点选择器条件- matchExpressions:  # 指定匹配表达式- key: zone  # 指定节点标签的键为 zoneoperator: In  # 指定匹配操作符为 Invalues:  # 指定匹配的值- us-west  # 匹配值为 us-west- key: environment  # 指定节点标签的键为 environmentoperator: In  # 指定匹配操作符为 Invalues:  # 指定匹配的值- 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-containerimage: affinity-image  # 指定容器所使用的镜像为 affinity-imageaffinity:  # 定义 Pod 的亲和性规则nodeAffinity:  # 指定节点亲和性规则preferredDuringSchedulingIgnoredDuringExecution:  # 指定为软性节点亲和性规则- weight: 1  # 指定权重为 1preference:  # 指定偏好条件matchExpressions:  # 指定匹配表达式- key: zone  # 指定节点标签的键为 zoneoperator: In  # 指定匹配操作符为 Invalues:  # 指定匹配的值- us-east  # 匹配值为 us-east- weight: 1  # 指定权重为 1preference:  # 指定偏好条件matchExpressions:  # 指定匹配表达式- key: zone  # 指定节点标签的键为 zoneoperator: In  # 指定匹配操作符为 Invalues:  # 指定匹配的值- 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-containerimage: anti-affinity-image  # 指定容器所使用的镜像为 anti-affinity-imageaffinity:  # 定义 Pod 的亲和性规则podAntiAffinity:  # 指定 Pod 反亲和性规则requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性 Pod 反亲和性规则- labelSelector:  # 指定标签选择器matchExpressions:  # 指定匹配表达式- key: app  # 指定标签的键为 appoperator: In  # 指定匹配操作符为 Invalues:  # 指定匹配的值- my-app  # 匹配值为 my-app

5、总结

在这里插入图片描述

在这里插入图片描述


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程的优先级环境变量

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 进程的优先级2.1 什么是优先级2.2 为什么要有优先级2.3 优先级的查看方式2.4 对优先级调整 3. 命令行参数4. 环境变量4.1 环境变量与配置文件4.1.1 环境变量初步介绍4.1.2 配置文件 4.2 更多环境变量4.3 整…

SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计 一:产品原型 在菜品列表页面,每个菜品后面对应的操作分别为修改、删除、停售,可通过删除功能完成对菜品及相关的数据进行删除。 删除菜品原型: 业务规则: 可以一次删除一个菜品,也可以批…

【Zabbix】zabbix 软件监控

使用zabbix监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控…

MongoDB 初识

1.介绍 什么是Mong MongoDB是一种开源的文档型数据库管理系统,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。与传统关系型数据库不同,MongoDB不使用表和行的结构,而是采用集合(Collection&#x…

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion,在此过程中,遇到很多的网络访问不通的问题,通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上,网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…

从零搭建部署最新AI系统源码ChatGPT网站AI绘画系统,图文详细搭建部署教程文档,Suno-AI音乐生成大模型

一、系统前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持…

(八)C++自制植物大战僵尸游戏植物基类讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 在植物大战僵尸游戏中,最重要的两个类别就是植物与僵尸。植物可以对僵尸进行攻击,不同的植物攻击方式千差万别,但是不同植物又有许多相同的属性。在基类(父类&#xf…

【C语言基础】:预处理详解(二)

文章目录 一、宏和函数的对比二、#和##运算符2.1 #运算符2.2 ##运算符 三、#undef四、命令行定义五、条件编译六、头文件的包含1. 头文件包含的方式2. 嵌套文件包含 上期回顾: 【C语言基础】:预处理详解(一) 一、宏和函数的对比 宏通常被应有于执行简单…

数图智慧零售解决方案,赋能零售行业空间资源价值最大化

数图智慧零售解决方案 赋能零售行业空间资源价值最大 在激烈的市场竞争中,如何更好地提升空间资源价值,提高销售额,成为行业关注的焦点。近日,NIQ发布的《2024年中国饮料行业趋势与展望》称,“在传统零售业态店内&…

单片机STM32中断与事件的区别

【转】1-单片机STM32---中断与事件的区别 - Engraver - 博客园 (cnblogs.com) 路径不同,处理方式不同,是否有程序不同,是否有cpu参与不同。 事件是比中断更新的升级产物。

3_2Linux中内核级加强型火墙的管理

### 一.Selinux的功能 ### 观察现象 ①当Selinux未开启时 在/mnt中建立文件被移动到/var/ftp下可以被vsftpd服务访问 匿名用户可以通过设置后上传文件 当使用ls -Z /var/ftp查看文件时显示"?" ps auxZ | grep vsftpd 时显示: - root 8546 0.0 0.0 26952 …

【QT+QGIS跨平台编译】181:【QGIS+Qt跨平台编译】—【错误处理:找不到_DEBUGA】

点击查看专栏目录 文章目录 一、找不到_DEBUGA二、原因分析三、错误处理 一、找不到_DEBUGA 报错信息: 二、原因分析 采用了非UNICODE: DEFINES - UNICODE没法识别 _DEBUGA 但可以识别 _DEBUG 三、错误处理 修改 _DEBUGA 为 _DEBUG

简单的车牌号识别

目录 处理流程与界面各接口编写时遇到的一些问题上传图片识别结果标签显示中文 处理流程与界面 首先点击“上传图片”按钮,可以选择文件夹中含有汽车车牌的图片,并显示在“图片框”中。 点击“检测车牌”按钮,会先对“图片框”中即含有汽车车…

【漏洞复现】通天星CMSV6车载视频监控平台inspect_file文件上传漏洞

Nx01 产品简介 通天星车载视频监控平台软件拥有多种语言版本,应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控等公共交通上。 Nx02 漏洞描述 通天星CMSV6车载视频监控平台/inspect_file/upload存在文件上传漏洞&…

阿姨吐槽年轻人卧铺挂帘子不让坐 评论区吵翻天了

近日,网络流传的一段短视频激起了公众的广泛热议。 这段视频展现了一位阿姨与在下铺挂帘子的年轻人之间的冲突。 视频中,阿姨情绪激动,她用镜头对准了那位年轻人,指责他在下铺挂帘子,使得一位70岁的老人无法坐下。 阿姨…

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么? 三、构造函数还具有类型转换的作用 🍎单参构造函数 ✨引出 explicit 关键字 🍍多参构造函数 ✨为什么需要explicit关键字? ✨怎么使用explicit关键字? 四、总结 五…

Angular学习第四天--问题记录及父子组件问题

问题一、 拉取完项目,使用npm install命令的时候遇到的。 解决办法: 在查找网上五花八门的解决方案之后,发现都不能解决。 我的解决办法是: 1. 把package-lock.json给删掉; 2. 把package.json中公司自己库的包给删除掉…

C# Solidworks二次开发:模型中实体Entity相关操作API详解

大家好,今天要讲的一些API是关于实体的相关API。 在开发的过程,很多地方会涉及到实体的相关操作,比如通过实体选中节点。下面就直接开始介绍API: (1)第一个API为Select4,这个API的含义为选中一…

Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer

一、前言 记录时间 [2024-4-10] 前置文章: Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识 Docker学习笔记(二):在Linux中部署Docker&…

FluentUI系列 - 1 - 介绍第一个窗口

介绍一个QML的UI库,国人编写,作者也耍知乎。这个UI库确实好用,但是教程基本等于无,个人在使用中顺便记录一下学习内容。这玩意儿也有Pyside6的版本,有需要的可以查看PySide6-FluentUI-QML。 FluentUI库地址​github.c…