当前位置: 首页 > article >正文

k8s学习记录(四):节点亲和性

一、前言

  在上一篇文章里,我们了解了 Pod 中的nodeNamenodeSelector这两个属性,通过它们能够指定 Pod 调度到哪个 Node 上。今天,我们将进一步深入探索 Pod 相关知识。这部分内容不仅信息量较大,理解起来也有一定难度,如果在学习过程中感觉吃力,建议大家反复研读,以便更好地掌握。

二、亲和性

  在 Kubernetes 的 Pod 调度场景中,尽管我们可以借助nodeName和nodeSelector指定 Pod 的调度节点,但它们存在明显的局限性。nodeName依赖节点名称进行调度,nodeSelector则基于节点标签来确定调度目标,二者都不够灵活,扩展性也欠佳。那么,是否存在其他更丰富的属性能够助力 Pod 调度呢?例如,能否依据 CPU、内存等资源属性来决定 Pod 的部署节点?作为强大的容器编排工具,Kubernetes 显然考虑到了这一需求,接下来我们将深入学习的 “亲和性”,便是解决这一问题的关键。
  亲和性同样用于 Pod 的节点调度,与nodeSelector有一定相似之处,但亲和性的优势更为显著。它支持定义多个调度规则,还能为这些规则设定优先级,从而实现更精细的调度控制。亲和性主要分为节点亲和性和 Pod 亲和性。简单来讲,亲和性就是一组预先设定的规则,其作用是明确告知 Kubernetes 该如何调度 Pod。
  其中,节点亲和性又细分为软亲和性和硬亲和性。软亲和性是一种较为灵活的调度策略,当多个节点都满足设定条件时,它会优先选择优先级更高的节点;若所有节点都无法完全满足条件,Pod 依然可以被调度到其他相对合适的节点。打个比方,这就像是你向 Kubernetes 提出请求:“请帮我把 Pod 调度到某个节点上,这个节点最好能满足条件 1 和条件 2,如果实在没有完全符合的,那就找一个最接近要求的节点部署吧。”
  而硬亲和性则截然不同,它是一种严格的调度策略。只有当节点完全满足设定的所有条件时,Pod 才会被调度到该节点;若不存在任何满足条件的节点,Pod 将无法运行,这正如成语 “宁缺毋滥” 所表达的含义。

软亲和性例子:

女生A和媒婆说:我要找个男朋友,条件1:身高1米8;条件2:有车有房,如果两者都不满足那么性格好就行了。

硬亲和性例子:我要个男朋友条件1:身高1米8;条件2:有车有房,这两个条件缺一不可,否则我宁可单身!

1、先查看一下描述

kubectl explain pods.spec.affinity

亲和性总共有3个字段:节点亲和性、pod亲和性、pod反亲和性

  • nodeAffinity(节点亲和性):通过标签选择器和表达式来约束Pod
  • podAffinity(pod亲和性):用于指定Pod应该被部署到符合某些条件的Pod所在的Node:例如我们将多个业务关联性高的Pod部署在同一个节点。
  • podAntiAffinity(Pod反亲和性):用于指定Pod应该避免部署到符合某些条件的Pod所在的Node,场景:例如避免把相似的Pod都部署到同一个Node,从而可能产生单点故障。

三、节点亲和性(nodeAffinity)

1、解释

kubectl explain pods.spec.affinity

这里有两个字段

  • preferredDuringSchedulingIgnoredDuringExecution :软亲和性

它是一种建议性的规则,Kubernetes 调度器会尽量依据此规则来调度 Pod 到符合条件的节点上,但并非强制要求。若不存在满足规则的节点,Pod 依然可以被调度到其他节点。此规则在调度阶段起作用,调度器会优先考虑将 Pod 调度到满足软亲和性规则的节点上。而在 Pod 运行期间,一旦节点的标签发生变化,导致不再符合软亲和性规则,Pod 不会被驱逐。


  • requiredDuringSchedulingIgnoredDuringExecution:硬亲和性

和软亲和性不同,硬亲和性是一种强制的规则,要求调度器在调度的时候必须满足一定的规则,否则将不会进行调度,pod会一直处于pending状态。同时运行期间如果节点的标签发生变化导致不符合规则,Pod会被驱逐。

2、实操

我们现在有两个节点,分别是node2和node3,其中node2包含标签cpu=high ,而node3包含标签cpu=low,我们用这个标签来测试节点亲和性。

1、软亲和性

(1)我们先测试软亲和性,即期望pod会被调度到cpu=high的节点,资源清单如下

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buybox:1.28imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: cpuoperator: Invalues:- high    

接下来我们使用命令 apply -f busybox.yaml 来创建这个pod,预期的效果是会被调度到node2节点,结果如下

可以看到和我们的预期一样,Pod被调度到了node2节点上。

(2)我们修改一下资源清单,写一个不存在的标签值看是否能够调度。预期结果:也能正常调度只不过会在node2和node3中随机选择。

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buybox:1.28imagePullPolicy: IfNotPresentaffinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: cpuoperator: Invalues:- best    

调度结果:node3 (不用管这里的状态是 ErrImagePull,这个是笔者网络问题导致拉取镜像有问题,但是和调度没关系)

(3)小结

案例1预期结果实际结果
正常情况,标签cpu=high节点2节点2
都不满足,标签cpu=best节点2或者节点3节点3

小结:软亲和性是一种建议,即如果满足要求就选择某个节点,若不存在满足规则的节点,Pod 依然可以被调度到其他节点。

1、硬亲和性

还是刚才的案例,我们把软亲和性换成硬亲和性

(1)cpu=high 我们预期是调度到node2

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buyboxports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: cpuoperator: Invalues:- high

结果调度了node2,符合预期

(2)我们修改规则,将values改成不存的值,预期无法调度到任何一个节点

apiVersion: v1
kind: Pod
metadata:name: buybox-pod
spec:containers:- name: buybox-containerimage: buyboxports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: cpuoperator: Invalues:- best

结果如下

可以看到状态一直处于Pending状态,查看一下pod详细信息,使用命令 kubectl describe pods buybox-pod

错误信息:

Warning FailedScheduling 12s (x3 over 89s) default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn’t tolerate, 2 node(s) didn’t match Pod’s node affinity.

调度失败了,因为3个节点都不满足亲和性条件。

小结:

案例1预期结果实际结果
正常情况,标签cpu=high节点2节点2
都不满足,标签cpu=best无法调度无法调度

四、总结

本文聚焦 Kubernetes 的节点亲和性。在 Pod 调度中,以往的 nodeName 和 nodeSelector 存在局限,亲和性则更为强大,其中节点亲和性包含软、硬亲和性。

软亲和性是建议性规则。测试时,期望调度到cpu=high的节点,Pod 成功被调度到 node2;设置不存在的标签值,Pod 也能在现有节点随机调度,如被调度到 node3,说明无满足节点时 Pod 仍可调度。硬亲和性requiredDuringSchedulingIgnoredDuringExecution是强制规则。同样的测试场景下,要求调度到cpu=high的节点,Pod 被调度到 node2;设置不存在的标签值,Pod 处于 Pending 状态,调度失败,表明不满足条件时 Pod 无法调度。

学习节点亲和性的软、硬亲和性,有助于精准控制 Pod 部署,提升集群资源利用率和应用稳定性,为 Kubernetes 复杂应用部署管理筑牢基础。下一篇我们将继续学习亲和性,希望对你有所帮助

五、未完待续

相关文章:

k8s学习记录(四):节点亲和性

一、前言 在上一篇文章里,我们了解了 Pod 中的nodeName和nodeSelector这两个属性,通过它们能够指定 Pod 调度到哪个 Node 上。今天,我们将进一步深入探索 Pod 相关知识。这部分内容不仅信息量较大,理解起来也有一定难度&#xff0…...

文本预处理(NLTK)

1. 自然语言处理基础概念 1.1 什么是自然语言处理 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于…...

一些常见的资源池管理、分布式管理和负载均衡的监控工具

资源池管理监控工具 Prometheus 是一款开源的系统监控和警报工具。它可以通过收集各种指标数据,如CPU使用率、内存使用量、磁盘I/O等,来监控资源池中的服务器、容器等资源。Prometheus具有强大的查询语言和可视化功能,能够帮助管理员快速了解资源的使用情况,并及时发现潜在…...

Neo4j 可观测性最佳实践

Neo4j 介绍 Neo4j 是一款领先的图数据库管理系统,采用图数据模型来表示和存储数据。它以节点、关系和属性的形式组织数据,节点代表实体,关系表示节点间的连接,属性则为节点和关系附加信息。Neo4j 使用 Cypher 查询语言&#xff0…...

JAVA服务内存缓慢上涨,年轻代GC正常但Full GC频繁,如何定位?

1. 分析 : 年轻代GC正常,说明年轻代的对象回收没有问题,可能大部分对象都是朝生夕死的,所以Minor GC能有效清理。但Full GC频繁,通常意味着老年代空间不足,导致频繁进行Full GC来回收老年代。而内存缓慢上…...

C++入门(讲解1)

1. namespace的定义 1.1 定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中就是命名空间的成员。命名空间中可以定义变量/函数/类型等。 1.2 namespace的本质是定义出一个域,这个…...

react的ant-design-pro框架左侧菜单修改为动态路由

在使用 React 框架结合 Ant Design Pro 进行项目开发时,动态路由的修改是一项常见且重要的任务。动态路由能够根据用户的角色、权限或者其他运行时的条件来展示不同的页面内容,极大地提升了应用的灵活性和安全性。本文将结合一个完整的示例项目&#xff…...

【教程】Windows通过网线共享网络给其它设备

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、打开“控制面板”。 2、点击“网络和共享中心”。 3、点击“更改适配器设置”。 4、选中要共享的网络适配器,右击选中“属性”。 5、勾选…...

百度AI开发者大会:连发多款AI应用,覆盖AI数字人等热门赛道

4月25日,Create2025百度AI开发者大会在武汉隆重举办。百度创始人李彦宏发表了题为《模型的世界 应用的天下》的演讲。60分钟的演讲中,李彦宏发布了两大模型,多款热门AI应用,并宣布将帮助开发者全面拥抱MCP。 当天发布的文心大模型…...

Java 线程的六种状态与完整生命周期详解

🚀 Java 线程的几种状态详解 在 Java 中,线程状态(Thread State)是由 Thread.State 枚举定义的,总共有六种: 状态含义典型场景示例NEW新建状态,线程对象刚创建,还未调用 start() 方…...

05--Altium Designer(AD)的详细安装

一、软件的下载 Altium Designer官网下载 1、临近五一的假期,想着搞个项目,且这个项目与PCB有关系,所以就下这个软件来玩玩。下面保姆级教大家安装。 2、选择适合自己的版本下载(我安装的是24的) 3、软件安装 1.下…...

2:QT联合HALCON编程—图像显示放大缩小

1.声明事件 #include <HalconCpp.h> using namespace HalconCpp;#include <QCloseEvent>//滚轮事件 2.在.h文件中声明和定义公共全局变量&#xff0c;以及图像缩放的函数 void wheelEvent(QWheelEvent *event);//定义函数HTuple wcRow0, wcRow1, wcCol0, wcCol1,m…...

Java 队列与阻塞队列全面解析:从 Queue 到 TransferQueue 的实现与应用

文章目录 Queue队列QueueDeque 阻塞队列BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueueDelayQueue BlockingDequeLinkedBlockingDeque TransferQueueLinkedTransferQueue Queue Queue&#xff08;队列&#xff09;是一种特殊的线性…...

服务器虚拟化:技术解析与实践指南

在信息技术飞速发展的今天,企业对服务器资源的需求日益增长,传统物理服务器存在资源利用率低、部署周期长、管理成本高等问题。服务器虚拟化技术应运而生,它通过将物理服务器的计算、存储、网络等资源进行抽象和整合,划分成多个相互隔离的虚拟服务器,从而提高资源利用率、…...

【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch抓不住的蜜蜂 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C++资料 scratch抓不住的蜜蜂 第十五届青少年蓝桥…...

线程池(二):深入剖析synchronized关键字的底层原理

线程池&#xff08;二&#xff09;&#xff1a;深入剖析synchronized关键字的底层原理 线程池&#xff08;二&#xff09;&#xff1a;深入剖析synchronized关键字的底层原理一、基本使用1.1 修饰实例方法1.2 修饰静态方法1.3 修饰代码块 二、Monitor2.1 Monitor的概念2.2 Moni…...

【线段树】P8539 「Wdoi-2」来自地上的支援|普及+

P8539 「Wdoi-2」来自地上的支援 题目背景 波光粼粼的山顶湖与庄严神圣的神社之下&#xff0c;是一座复合型活火山。 沿幻想风穴而下&#xff0c;便能到达火山之下&#xff0c;废弃已久的地狱原址。 在旧地狱中&#xff0c;有一座大都市。那里是旧地狱还是地狱的时候在那工作…...

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项&#xff08;Record Route&#xff0c;RR&#xff09; 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…...

Leetcode:1. 两数之和

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示…...

【Java学习笔记】冒泡排序

冒泡排序 思想&#xff1a;经过一轮遍历比较&#xff0c;把最大的放在数组的末尾 int[] a {3, 2, 1}; for( int i 0; i < a.length-1; i){for( int j 0; j < a.length-1-i; j){if(a[j] > a[j1]){int temp a[j];a[j] a[j1];a[j1] temp;}} } for( int i 0; i &…...

【数字图像处理】立体视觉基础(2)

相机标定 【1】相机标定的概念 相机参数&#xff1a;相机成像的几何模型的参数 相机标定&#xff1a;求解参数的过程 【2】相机标定的作用 &#xff08;1&#xff09;求出相机的内、外参数&#xff0c;以及畸变参数 &#xff08;2&#xff09;校正镜头畸变影响&#xff0c;…...

NtripShare 2025第一季度主要技术进展

GNSS方面 1、开源GNSS接收机配置软件基础版本。 2、商业版本GNSS接收机配置软件&#xff0c;增加PPP、文件保存、前端解算&#xff08;静态、RTK-Static&#xff09;&#xff0c;前端坐标转换。 3、GNSS接收机配置软件全面适配米尔T133i硬件方案。 视觉检测方面 1、做出第…...

头歌实训之存储过程、函数与触发器

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

【华为】防火墙双击热备-之-主备模式-单外网线路-分享

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…...

c++ package_task

int print_sum(int a, int b) {std::cout << a << " " << b << " " << (a b) << std::endl;return a b; }int main() {// 创建绑定后的可调用对象auto print_sum_5 std::bind(print_sum, 5, 6);// 包装为 packag…...

基于计算机视觉的行为检测:从原理到工业实践

一、行为检测的定义与核心价值 行为检测(Action Recognition)是计算机视觉领域的关键任务,旨在通过分析视频序列理解人类动作的时空特征。其核心价值体现在时序建模和多尺度分析能力上——系统需要捕捉动作的起始、发展和结束全过程,同时适应不同持续时间(0.1秒至数分钟)…...

川翔云电脑32G大显存集群机器上线!

川翔云电脑今日重磅推出32G 大显存机型&#xff0c;为游戏玩家、设计师、AI 开发者等提供极致云端算力体验&#xff01; 一、两大核心配置&#xff0c;突破性能天花板 ✅ 32G 超大显存机型 行业领先&#xff1a;搭载 NVIDIA 专业显卡&#xff0c;单卡可分配 32G 独立显存&am…...

加里·基尔代尔:CP/M之父与个人计算时代的先驱

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 加里基尔代尔&#xff1a;CP/M之父与个人计算时代的先驱 一、早年生活与教育背景 1.…...

静态多态和动态多态的区别

C多态机制深度解析 多态是面向对象编程的核心特性&#xff0c;允许通过统一接口执行不同实现。在C中&#xff0c;多态表现为基类指针或引用调用虚函数时&#xff0c;根据实际对象类型执行对应派生类的函数逻辑。 基础实现示例 定义基类与派生类&#xff0c;演示动态绑定…...

MQL5教程 06 EA开发实战

文章目录 一、调用多指标多周期EA示例二、获取ZigZag顶点值三、逆势加仓EA 一、调用多指标多周期EA示例 shuju.mqh: class shuju{public:shuju(){} ~shuju(){}void MA(double &ma[],int count,string symbol, // 交易品种名称 ENUM_TIMEFRA…...