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 复杂应用部署管理筑牢基础。下一篇我们将继续学习亲和性,希望对你有所帮助

五、未完待续

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

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

相关文章

NeRF:原理 + 实现 + 实践全流程配置+数据集测试【Ubuntu20.04 】【2025最新版】

一、引言 从三维建模、虚拟现实到电影级渲染,真实感建模一直是计算机视觉和图形学的核心目标。 在传统方法中,我们往往依赖: 多视角立体(MVS)点云重建 网格拟合显式建模(如多边形、体素、TSDF&#xff0…

ASP.NET MVC​ 入门指南三

16. 安全性 16.1 身份验证和授权 身份验证:确认用户的身份。ASP.NET MVC 支持多种身份验证方式,如表单身份验证、Windows 身份验证和 OAuth 等。 表单身份验证:用户通过输入用户名和密码登录,服务器验证后颁发一个身份验证票证&…

佳博票据和标签打印:Web网页端与打印机通信 | iOS

文章目录 引言I Web网页端与打印机通信webSDK(包含示例页)打印测试II iOS与佳博打印机通信引言 佳博工具下载ESC是票据打印指令,TSC是标签打印指令 工业打印机:佳博GP-H430F工业机标签条码打印机物流快递电子面单条码机碳带机 应用场景:打印商品价格标签、打印交易小票 I…

c语言初识

学c注意事项 我写了很多服务器的代码,我怕有些人看不懂所以就写了这篇入门篇。 学习c语言要多动手,多练习,其实语法就几个,你了解了就会写出自己想要的代码,你不要怕不会写不出程序,因为大部分代码都有人写好&#xf…

请求参数、路径参数、查询参数、Spring MVC/FeignClient请求相关注解梳理

目录 1 请求分类1.1 URL参数--查询参数1.2 URL参数--路径参数 2 请求相关注解2.1 RequestParam--查询参数2.2 PathVariable--路径参数2.3 RequestBody2.4 Param & RequestLine2.5 SpringMVC请求参数注解用在FeignClient里 使用SpringMVC处理http请求或使用FeignClient进行请…

智能指针之设计模式3

这次我们看一下智能指针是如何使用策略模式来释放资源的,同时又是如何扩展功能,管理更多的资源对象类型的。 3、策略模式 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的应用场景中,该行为有不同的实现…

华为盘古OS深度评测:构建AI自进化系统的实践密码

华为盘古OS通过分布式AI内核与自适应学习框架的深度耦合,重新定义操作系统级智能能力。实测显示其AI任务调度效率较传统系统提升17倍,本文从智能体编排、持续学习机制、端云协同架构三个维度,解析如何基于DevKit 3.0打造具备认知进化能力的下…

精益数据分析(28/126):解读商业模式拼图与关键指标

精益数据分析(28/126):解读商业模式拼图与关键指标 在创业和数据分析的探索旅程中,每一次深入研究都可能带来新的启发和突破。今天,我们依旧带着共同进步的初心,深入解读《精益数据分析》中关于商业模式的…

GitLab Runner配置并行执行多个任务

检查并修改方法: 打开 Runner 的配置文件(通常位于 /etc/gitlab-runner/config.toml 或 ~/.gitlab-runner/config.toml)。 确保 concurrent 值大于 1,例如: concurrent 4 # 允许最多 4 个任务同时运行重启 Runner…

开发首个Spring Boot应用

📋 前置条件 🎯 在开始之前,请打开终端并运行以下命令以确保已安装正确版本的 Java: $ java -version openjdk version "17.0.4.1" 2022-08-12 LTS OpenJDK Runtime Environment (build 17.0.4.11-LTS) OpenJDK 64-Bi…

【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划质量管理2、质量保证3、质量控制论文 2019年3月,我作为项目经理,参加了某市智慧旅游平台建设项目,负责项目的全面管理, 该项目以打造一流的国内外生态旅游城市为目标,旨在大数据云平台建设的基…

DAM-3B,英伟达推出的多模态大语言模型

DAM-3B是什么 DAM-3B(Describe Anything 3B)是英伟达推出的一款多模态大语言模型,专门用于为图像和视频中的特定区域生成详细描述。用户可以通过点、边界框、涂鸦或掩码等方式来标识目标区域,从而得到精准且符合上下文的文本描述…

如何判断你的PyTorch是GPU版还是CPU版?

如何判断你的PyTorch是GPU版还是CPU版? PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIA CUDA)上运行。对于深度学习开发者来说,正确识别PyTorch版本至关重要,因为GPU版本可以带来10-100倍的性能提升。本文将全面…

Gin框架

Gin 快速入门 go get -u github.com/gin-gonic/gin package main import gin "github.com/gin-gonic/gin"func main() {engine : gin.Default()engine.GET("/", func(c *gin.Context) {c.String(200, "Hello Gin")})engine.Run(":8888&q…

【Project】基于spark-App端口懂车帝数据采集与可视化

文章目录 hadoop完全分布式部署hdfs-site.xmlcore-site.xmlmarpred-site.xmlyarn-site.xml spark集群部署spark-env.sh mongodb分片模式部署config 服务器初始化config 副本集 shard 服务器初始化shard 副本集 mongos服务器添加shard设置chunk大小 启动分片为集合 user 创建索引…

brew 安装openjdk查看其版本

使用brew(如果你使用Homebrew安装) 如果你通过Homebrew安装了OpenJDK,可以使用以下命令来查看安装的版本,: brew list --versions openjdk8 这将会列出所有通过Homebrew安装的OpenJDK版本及其版本号。 3. 查看/usr/libexec/ja…

【Linux网络】构建与优化HTTP请求处理 - HttpRequest从理解到实现

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…

Day12(回溯法)——LeetCode51.N皇后39.组合总和

1 前言 今天刷了三道回溯法和一道每日推荐,三道回溯法也迷迷糊糊的,每日推荐把自己绕进去了,虽然是一道之前做过的题的变种。刷的脑子疼。。。今天挑两道回溯题写一下吧,其中有一道是之前做过的N皇后,今天在详细写一写…

初阶数据结构:二叉搜索树

目录 概念 性能 效率分析 二分缺陷 功能 插入 查找 删除 实现 应用 概念 二叉搜索树(又称:二叉排序树),是由一些具有特别性质的二叉树衍变而来。 只要一棵二叉树具备以下性质,即可称作二叉搜索树。 【1】若…

详解springcloud gateway工作原理、断言、filter、uri、id、全局跨域、globalfilter等以及关键源码实现

1.gateway概念 网关就是当前微服务项目的"统一入口"程序中的网关就是当前微服务项目对外界开放的统一入口所有外界的请求都需要先经过网关才能访问到我们的程序提供了统一入口之后,方便对所有请求进行统一的检查和管理 2. 网关的主要功能 将所有请求统一经过网关网…