k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?
接上文写的Node亲和性调度https://blog.csdn.net/soso678/article/details/144777397
Pod 间的亲和性和反亲和性(Affinity/AntiAffinity)调度
Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点,而不是基于节点上的标签。
2.1.Pod 亲和性核心概念
Pod 亲和性用于定义 Pod 之间的调度规则,确保某些 Pod 靠近运行(亲和性)或远离运行(反亲和性)。典型场景包括:
- 亲和性:将同一服务的多个 Pod 调度到同一区域(减少网络延迟)。
- 反亲和性:避免同一服务的 Pod 集中在同一节点(提高容灾能力)。
2.1.1核心配置参数
-
requiredDuringSchedulingIgnoredDuringExecution- 硬性要求:必须满足的条件,否则 Pod 无法调度。Pod必须与目标pod部署在同一个拓扑域,否则无法调度
-
preferredDuringSchedulingIgnoredDuringExecution- 软性偏好:调度器会优先尝试将Pod与目标pod部署在同一个拓扑域,但不强制。
-
topologyKey:定义Pod分布的颗粒度,节点机器的标签的key和value都相等的机器,就是同一个拓扑域。- 拓扑域:定义调度的作用范围(如
zone、rack、hostname)。常见取值范围: kubernetes.io/hostname:同一物理节点。failure-domain.beta.kubernetes.io/zone:同一云服务区域(AWS 的 AZ、GCP 的 Zone)。failure-domain.beta.kubernetes.io/region:同一云服务地区(如us-east)。- 自定义标签:如
rack(机架)、cluster(集群)。
- 拓扑域:定义调度的作用范围(如
-
labelSelector- 标签选择器:匹配目标 Pod 的标签。
- 示例:选择带有
app=myapp标签的 Pod。
2.2.pod的亲和性
Pod亲和性场景,k8s集群的节点分布在不同的区域或者不同的机房,当服务A和服务B要求部署在同一个区域或者同一机房的时候,我们就需要亲和性调度了
[root@master nodeaffinity]# cd ..
[root@master Affinity]# mkdir podaffinity
[root@master Affinity]# cd podaffinity/
[root@master podaffinity]# cat pod-required-affinity.yaml
apiVersion: v1 #先创建一个pod,随机调度
kind: Pod
metadata:name: pod-1labels:app: myapptier: frontend
spec:containers:- name: redisimage: redisimagePullPolicy: IfNotPresentports:- containerPort: 6379
---
apiVersion: v1 #在创建一个pod,使用pod的亲和性调度
kind: Pod
metadata:name: pod-2labels:app: dbtier: db
spec:containers:- name: mysqlimage: mysql:5.7imagePullPolicy: IfNotPresentports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: Mysql@123!affinity:podAffinity: #pod的亲和性requiredDuringSchedulingIgnoredDuringExecution: #硬亲和- labelSelector: #pod的标签选择器matchExpressions: #匹配pod标签的表达式- key: app #带有app这个keyoperator: "In" #包含values: - "myapp" #key的值topologyKey: kubernetes.io/hostname #拓扑域,同一个节点[root@master podaffinity]# kubectl apply -f pod-required-affinity.yaml
pod/pod-1 created
pod/pod-2 created#通过查看发现两个pod运行在同一个节点
[root@master podaffinity]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 1/1 Running 0 19m 10.244.1.107 node-2 <none> <none>
pod-2 1/1 Running 0 2s 10.244.1.109 node-2 <none> <none>
这个例子为将新创建的pod调度到与运行带有app=myapp这个标签的pod同一个节点。
3.pod的反亲和性
3.1Pod 反亲和性核心概念
Pod 反亲和性用于确保某些 Pod 不会共存于同一拓扑域(如同一节点、同一区域)。典型场景包括:
- 避免单点故障:同一服务的多个 Pod 分散到不同节点或区域。
- 资源均衡:防止资源密集型 Pod 集中在同一节点。
- 安全隔离:敏感服务 Pod 避免与其他服务共存。
3.2核心配置参数
requiredDuringSchedulingIgnoredDuringExecution- 硬性要求:Pod 必须不调度到存在目标 Pod 的拓扑域,否则无法运行。
preferredDuringSchedulingIgnoredDuringExecution- 软性偏好:尽量避免调度到存在目标 Pod 的拓扑域,但不强制。
topologyKey- 拓扑域:定义反亲和性作用范围(如
kubernetes.io/hostname表示同一节点)。
- 拓扑域:定义反亲和性作用范围(如
labelSelector- 标签选择器:匹配需要避开的 Pod 标签。
3.3案例
3.3.1.Pod反亲和性场景,当应用服务A和数据库服务B要求尽量不要在同一台节点上的时候。
[root@master podaffinity]# kubectl delete -f pod-required-affinity.yaml
pod "pod-1" deleted
pod "pod-2" deleted[root@master podaffinity]# cat pod-required-affinity.yaml
apiVersion: v1 #先创建一个pod,随机调度
kind: Pod
metadata:name: pod-1labels:app: myapptier: frontend
spec:containers:- name: redisimage: redisimagePullPolicy: IfNotPresentports:- containerPort: 6379
---
apiVersion: v1 #在创建一个pod使用反亲和性调度
kind: Pod
metadata:name: pod-2labels:app: dbtier: db
spec:containers:- name: mysqlimage: mysql:5.7imagePullPolicy: IfNotPresentports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: Mysql@123!affinity:podAntiAffinity: #pod的反亲和性调度requiredDuringSchedulingIgnoredDuringExecution: #硬反亲和要求- labelSelector:matchExpressions:- key: appoperator: "In"values: - "myapp"topologyKey: kubernetes.io/hostname #拓扑域,节点级别
[root@master podaffinity]# kubectl apply -f pod-required-affinity.yaml
pod/pod-1 created
pod/pod-2 created
[root@master podaffinity]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-1 1/1 Running 0 9m21s 10.244.1.110 node-2 <none> <none>
pod-2 1/1 Running 0 9m21s 10.244.2.63 node-1 <none> <none>
#发现两个pod的分开在不同的node节点上的
这个例子表示创建的pod-2不能调度到运行带有app=myapp这个标签的pod同一个节点上。
3.3.2.硬性反亲和性(同一节点不运行相同服务的 Pod)
[root@master podaffinity]# cat pod-antaffinity-test.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: web-server
spec:replicas: 2selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: app # 匹配标签键operator: In # 操作符values: [web] # 标签值topologyKey: kubernetes.io/hostname # 拓扑域为节点级别containers:- name: webimage: nginx[root@master podaffinity]# kubectl apply -f pod-antaffinity-test.yml
deployment.apps/web-server created
[root@master podaffinity]# kubectl get pod -o wide -l app=web
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-server-7cbc8598bc-jkvnv 1/1 Running 0 2m58s 10.244.1.112 node-2 <none> <none>
web-server-7cbc8598bc-jm2mq 1/1 Running 0 2m58s 10.244.2.69 node-1 <none> <none>
调度逻辑:
- 每个
app=web的 Pod 必须运行在不同节点(topologyKey: kubernetes.io/hostname)。 - 如果集群节点数少于副本数(如 2 个节点部署 3 个 Pod),多余的 Pod 将处于
Pending状态。
场景 1:高可用数据库集群
- 目标:确保每个数据库实例(如 MySQL)运行在不同节点。
- 配置:硬性反亲和性 +
topologyKey: kubernetes.io/hostname
场景 2:敏感服务隔离
- 目标:避免监控服务与核心业务服务共存于同一节点。
- 配置:硬性反亲和性匹配监控 Pod 标签 +
topologyKey: kubernetes.io/hostname
3.3.3.软性反亲和性(优先分散到不同区域)
场景 :多区域负载均衡
- 目标:优先将服务的 Pod 分散到不同区域。
- 配置:软性反亲和性 +
topologyKey: failure-domain.beta.kubernetes.io/zone。
[root@master ~]# kubectl label node node-1 zone=shanghai
node/node-1 labeled
[root@master ~]# kubectl label node node-2 zone=beijing
node/node-2 labeled
[root@master podaffinity]# cat pod-antaffinity-pre.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: web-server-1
spec:replicas: 2selector:matchLabels:app: web-apptemplate:metadata:labels:app: web-appspec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- podAffinityTerm: #pod反亲和匹配条件labelSelector: #pod的标签选择器matchLabels: #匹配pod的标签app: web-apptopologyKey: zone #拓扑域,区域级别weight: 2containers:- name: webimage: nginx[root@master podaffinity]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-server-1-79776bf47-gnhxq 1/1 Running 0 24s 10.244.2.83 node-1 <none> <none>
web-server-1-79776bf47-n62jp 1/1 Running 0 24s 10.244.1.129 node-2 <none> <none>
调度逻辑:
- 优先将
app=web-app的 Pod 分散到不同区域(如zone=beijing和zone=shanghai)。 - 若无法满足(如只有单区域),仍会调度,但可能集中。
常见问题与解决
问题 1:Pod 处于 Pending 状态
- 原因:硬性反亲和性规则无法满足(如节点不足)。
- 解决:
- 增加集群节点数量。
- 放宽反亲和性规则(如改用软性偏好)。
问题 2:软性反亲和性未生效
- 原因:权重过低或其他偏好条件优先级更高。
- 解决:调整
weight值或减少冲突的偏好规则。
相关文章:
k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?
接上文写的Node亲和性调度https://blog.csdn.net/soso678/article/details/144777397 Pod 间的亲和性和反亲和性(Affinity/AntiAffinity)调度 Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点࿰…...
JSON Schema 入门指南:如何定义和验证 JSON 数据结构
文章目录 一、引言二、什么是 JSON Schema?三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例:定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…...
借DeepSeek的风思考:未来可通过AI+视觉识别技术,实现足球比赛中的教练决策指挥系统,以此提高中国足球冲出亚洲夺取世界杯冠军
国家如此强大,必须需要提升国足冲向世界,一雪前耻的了。现在我脑洞大开,提出以下思路寄望国家重视。具体思考如下: 通过AI视觉识别技术实现足球比赛中的教练决策指挥系统,有潜力提升中国足球的竞争力。但要实现这一目标…...
DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发
DeepSeek开源周第四天,直接痛快「1日3连发」,且全都围绕一个主题: 优化并行策略。 DualPipe:一种创新的双向流水线并行算法,能够完全重叠前向和后向计算-通信阶段,并减少“流水线气泡”。它通过对称的微批…...
【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现
项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...
蓝桥杯2024年第十五届省赛真题-传送阵
#include<stdio.h> #include<stdbool.h> #define MAX 100000 int circle[MAX];//记录每个环大小 int parent[MAX];//记录每个传送阵所属的环 int m[MAX]; bool visited[MAX]; int circleIndex0;//当前环的编号 //迭代实现换的查找void findcircle(int start){int c…...
数据存储:一文掌握存储数据到mysql的详细使用
文章目录 一、环境准备1.1 安装MySQL数据库1.2 安装Python MySQL驱动 二、连接到MySQL数据库三、执行基本的CRUD操作3.1 创建(Create):插入数据3.2 读取(Read):查询数据3.3 更新(Update…...
【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录
题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况,则认为打卡异常…...
Java实战:使用HttpClient实现图片下载与本地保存
在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求。其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都显得尤为重要。无论是社交媒体平台、电商平台,还是个人项目,能够高效地…...
【实战】使用PCA可视化神经网络提取后的特征空间【附源码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
DeepSeek05-大模型WebUI
一、说明: 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案,涵盖开源工具、第三方客户端及特定场景适配方案: Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点:Open WebUI 是一个开…...
第14天:C++异常处理实战指南 - 构建安全的文件解析系统
第14天:C异常处理实战指南 - 构建安全的文件解析系统 一、今日学习目标 🎯 掌握C异常处理的核心语法与流程🛡️ 理解RAII在资源管理中的关键作用📦 创建自定义文件解析异常体系🚀 实现安全的文件解析器原型 二、C异常…...
JavaScript遍历方式总结
目录 一、数组遍历方法 1.1for循环 1.2for...of循环 1.3forEach 1.4map方法 1.5filter方法 1.6reduce方法 1.7some方法 1.8every方法 二、对象遍历方法 2.1for...in方法 2.2values、keys方法 2.3entries方法 一、数组遍历方法 1.1for循环 最普通的循环…...
Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…...
Spring Boot整合WebSocket
目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket? ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…...
Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)
Pycharm使用matplotlib出现的问题 问题1:Pycharm调试时出现:AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因:可能是由于matplotlib后端设置不正确或与运行环境不兼容引…...
《宇树科技:解锁机器人技术的未来密码》:此文为AI自动生成
走进宇树科技 在科技飞速发展的今天,机器人领域正以前所未有的速度蓬勃发展,成为全球瞩目的焦点。在这个充满创新与挑战的领域中,宇树科技宛如一颗璀璨的明星,闪耀着独特的光芒。它不仅在国内机器人行业占据着重要地位,更是在国际舞台上崭露头角,成为了中国机器人技术的…...
Spark map与mapPartitions算子源码级深度解析
Spark map与mapPartitions算子源码级深度解析 一、核心源码结构差异 1. map算子实现逻辑 def map[U: ClassTag](f: T => U): RDD[U] = withScope {val cleanF = sc.clean(f)new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF)) }实现特征: …...
在 Vue 3 中,如何缓存和复用动态组件
在 Vue 3 中,如何缓存和复用动态组件,这有助于提高应用的性能,避免组件重复创建和销毁带来的开销。下面详细介绍其使用方法和相关配置。 1. 使用 <KeepAlive> 组件缓存动态组件 基本使用 <KeepAlive> 是 Vue 3 内置的一个组件…...
【PromptCoder】使用 package.json 生成 cursorrules
【PromptCoder】使用 package.json 生成 cursorrules 在当今快节奏的开发世界中,效率和准确性至关重要。开发者们不断寻找能够优化工作流程、帮助他们更快编写高质量代码的工具。Cursor 作为一款 AI 驱动的代码编辑器,正在彻底改变我们的编程方式。但如…...
给博客添加基于百度地图的足迹页面
使用百度地图 api 做的足迹页面一段时间了,经过一番改造,目前已基本能够满足自己需求。 一、添加百度地图 添加百度地图基本思路就是6点: 申请百度AK适当位置添加百度地图容器引入百度地图 api创建地图实例设置地图中心点初始化地图 这里…...
【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField
在Android开发当中,BuildConfig是一个非常有用的功能,它允许我们在构建过程中定义常量,并在运行时使用它们。But!!当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候,有一些细微的差…...
南京来可电子CAN总线数据记录仪在汽车售后服务站的应用
南京来可电子CAN总线数据记录仪在汽车售后服务站的应用 南京来可电子(LaiCore)作为国内领先的车载数据采集设备供应商,其CAN总线数据记录仪凭借高精度、多协议兼容性及智能化功能,在汽车售后服务站中发挥重要作用。以下是其核心应…...
FreeSql + .Net6 多库连接实现
1、安装Nuget包 AutoMapper 2、program.cs里添加如下配置: services.AddSingleton(r >{var str configuration.GetConnectionString("MES");return new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, str).Build<MESFlag>();});s…...
4个小时开发DeepSeek+baiduNaotu一键生成思维导图
一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层:用户需手动复制模型输出的JSON数据到脑图软件,且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架(其轻量级架构与简洁的UI设计已满足基础需求),我决定…...
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...
构建动态URL查询字符串以导出报警统计数据
如何构建动态URL查询字符串以导出报警统计数据 在开发Web应用程序时,经常需要根据用户的选择或输入来动态构建URL查询字符串,以便从服务器检索或导出数据。在本文中,我们将展示如何使用JavaScript来构建一个动态URL查询字符串,用…...
SpringBoot集成easy-captcha图片验证码框架
SpringBoot集成easy-captcha图片验证码框架 此项目已经很久未维护,如有更好的选择,建议使用更好的选择!!! 一、引言 验证码(CAPTCHA)是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而,从零开发验证码…...
Apache Flink:实时数据流处理的终极武器
Apache Flink:实时数据流处理的终极武器 在当今这个数据驱动的世界,实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐,从物联网监控到网络安全,毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...
货车一键启动无钥匙进入手机远程启动的正确使用方法
一、移动管家货车无钥匙进入系统的使用方法 基本原理:无钥匙进入系统通常采用RFID无线射频技术和车辆身份识别码识别系统。车钥匙需要随身携带,当车钥匙靠近货车时,它会自动与货车的解码器匹配。开门操作:当靠近货车后࿰…...
