k8s中pod的调度策略之pod的亲和性调度与反亲和性调度 一文搞懂 k8s中创建的pod如何调度?

news2025/2/28 6:50:02

接上文写的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核心配置参数
  1. requiredDuringSchedulingIgnoredDuringExecution

    • 硬性要求:必须满足的条件,否则 Pod 无法调度。Pod必须与目标pod部署在同一个拓扑域,否则无法调度
  2. preferredDuringSchedulingIgnoredDuringExecution

    • 软性偏好:调度器会优先尝试将Pod与目标pod部署在同一个拓扑域,但不强制。
  3. topologyKey:定义Pod分布的颗粒度,节点机器的标签的key和value都相等的机器,就是同一个拓扑域。

    • 拓扑域:定义调度的作用范围(如 zonerackhostname)。常见取值范围:
    • kubernetes.io/hostname:同一物理节点。
    • failure-domain.beta.kubernetes.io/zone:同一云服务区域(AWS 的 AZ、GCP 的 Zone)。
    • failure-domain.beta.kubernetes.io/region:同一云服务地区(如 us-east)。
    • 自定义标签:如 rack(机架)、cluster(集群)。
  4. 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-1
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: redis
    image: redis
    imagePullPolicy: IfNotPresent
    ports:
     - containerPort: 6379
---
apiVersion: v1 #在创建一个pod,使用pod的亲和性调度
kind: Pod
metadata:
  name: pod-2
  labels:
    app: db
    tier: db
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    ports:
     - containerPort: 3306
    env:
     - name: MYSQL_ROOT_PASSWORD
       value: Mysql@123!
  affinity:
    podAffinity: #pod的亲和性
      requiredDuringSchedulingIgnoredDuringExecution: #硬亲和
      - labelSelector: #pod的标签选择器
          matchExpressions: #匹配pod标签的表达式
          - key: app #带有app这个key
            operator: "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核心配置参数
  1. requiredDuringSchedulingIgnoredDuringExecution
    • 硬性要求:Pod 必须不调度到存在目标 Pod 的拓扑域,否则无法运行。
  2. preferredDuringSchedulingIgnoredDuringExecution
    • 软性偏好尽量避免调度到存在目标 Pod 的拓扑域,但不强制。
  3. topologyKey
    • 拓扑域:定义反亲和性作用范围(如 kubernetes.io/hostname 表示同一节点)。
  4. 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-1
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: redis
    image: redis
    imagePullPolicy: IfNotPresent
    ports:
     - containerPort: 6379
---
apiVersion: v1 #在创建一个pod使用反亲和性调度
kind: Pod
metadata:
  name: pod-2
  labels:
    app: db
    tier: db
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    ports:
     - containerPort: 3306
    env:
     - name: MYSQL_ROOT_PASSWORD
       value: Mysql@123!
  affinity:
    podAntiAffinity: #pod的反亲和性调度
      requiredDuringSchedulingIgnoredDuringExecution: #硬反亲和要求
      - labelSelector:
          matchExpressions:
          - key: app
            operator: "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: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app          # 匹配标签键
                operator: In      # 操作符
                values: [web]     # 标签值
            topologyKey: kubernetes.io/hostname  # 拓扑域为节点级别
      containers:
      - name: web
        image: 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: 2
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      affinity:
        podAntiAffinity:
         preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm: #pod反亲和匹配条件
             labelSelector:  #pod的标签选择器
               matchLabels: #匹配pod的标签
                 app: web-app
             topologyKey: zone #拓扑域,区域级别
            weight: 2
      containers:
      - name: web
        image: 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=beijingzone=shanghai)。
  • 若无法满足(如只有单区域),仍会调度,但可能集中。

常见问题与解决

问题 1:Pod 处于 Pending 状态
  • 原因:硬性反亲和性规则无法满足(如节点不足)。
  • 解决
    • 增加集群节点数量。
    • 放宽反亲和性规则(如改用软性偏好)。
问题 2:软性反亲和性未生效
  • 原因:权重过低或其他偏好条件优先级更高。
  • 解决:调整 weight 值或减少冲突的偏好规则。

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

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

相关文章

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发

DeepSeek开源周第四天&#xff0c;直接痛快「1日3连发」&#xff0c;且全都围绕一个主题&#xff1a; 优化并行策略。 DualPipe&#xff1a;一种创新的双向流水线并行算法&#xff0c;能够完全重叠前向和后向计算-通信阶段&#xff0c;并减少“流水线气泡”。它通过对称的微批…

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录

题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据&#xff0c;也是计算职工工资的原始依据&#xff0c;为了正确地计算职工工资和监督工资基金使用情况&#xff0c;公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况&#xff0c;则认为打卡异常…

Java实战:使用HttpClient实现图片下载与本地保存

在当今数字化时代&#xff0c;网络资源的获取与处理已成为软件开发中的常见需求。其中&#xff0c;图片作为网络上最常见的资源之一&#xff0c;其下载与保存功能在许多应用场景中都显得尤为重要。无论是社交媒体平台、电商平台&#xff0c;还是个人项目&#xff0c;能够高效地…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket&#xff1f; ?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&#xff1a;Pycharm调试时出现&#xff1a;AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因&#xff1a;可能是由于matplotlib后端设置不正确或与运行环境不兼容引…

【PromptCoder】使用 package.json 生成 cursorrules

【PromptCoder】使用 package.json 生成 cursorrules 在当今快节奏的开发世界中&#xff0c;效率和准确性至关重要。开发者们不断寻找能够优化工作流程、帮助他们更快编写高质量代码的工具。Cursor 作为一款 AI 驱动的代码编辑器&#xff0c;正在彻底改变我们的编程方式。但如…

给博客添加基于百度地图的足迹页面

使用百度地图 api 做的足迹页面一段时间了&#xff0c;经过一番改造&#xff0c;目前已基本能够满足自己需求。 一、添加百度地图 添加百度地图基本思路就是6点&#xff1a; 申请百度AK适当位置添加百度地图容器引入百度地图 api创建地图实例设置地图中心点初始化地图 这里…

【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中&#xff0c;BuildConfig是一个非常有用的功能&#xff0c;它允许我们在构建过程中定义常量&#xff0c;并在运行时使用它们。But&#xff01;&#xff01;当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候&#xff0c;有一些细微的差…

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层&#xff1a;用户需手动复制模型输出的JSON数据到脑图软件&#xff0c;且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架&#xff08;其轻量级架构与简洁的UI设计已满足基础需求&#xff09;&#xff0c;我决定…

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…

SpringBoot集成easy-captcha图片验证码框架

SpringBoot集成easy-captcha图片验证码框架 此项目已经很久未维护&#xff0c;如有更好的选择&#xff0c;建议使用更好的选择!!! 一、引言 验证码&#xff08;CAPTCHA&#xff09;是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而&#xff0c;从零开发验证码…

货车一键启动无钥匙进入手机远程启动的正确使用方法

一、移动管家货车无钥匙进入系统的使用方法 基本原理&#xff1a;无钥匙进入系统通常采用RFID无线射频技术和车辆身份识别码识别系统。车钥匙需要随身携带&#xff0c;当车钥匙靠近货车时&#xff0c;它会自动与货车的解码器匹配。开门操作&#xff1a;当靠近货车后&#xff0…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器&#xff08;Analyzer&#xff09;1. 倒排索引&#xff1a;搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比&#xff1a; 1.2 倒排索引核心结…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连&#xff0c;发挥着不可替代的重要作用。人工智能技术的迅猛发展&#xff0c;为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息&#xff0c;助力人类更精准地把握自然规律&am…

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…

Metal学习笔记八:纹理

到目前为止&#xff0c;您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理&#xff0c;您将在本章中学习如何作。更具体地说&#xff0c;您将了解&#xff1a; • UV 坐标&#xff1a;如何展开网格&#xff0c;以便可以对其应用纹理。 • 纹…