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

K8S Pod调度方法实例

以下是一篇面向企业用户、兼具通俗易懂和实战深度的 Kubernetes Pod 调度方法详解博文大纲与正文示例。全文采用“图文(代码块)并茂 + 问答穿插 + 类比”方式,模拟了真实终端操作及输出,便于读者快速上手。


一、引言

为什么要关注 Pod 调度?
想象一个繁忙的餐厅,顾客(Pod)需要被安排到合适的餐桌(Node)上:位置、人数、菜品需求各不相同,服务员(Scheduler)要综合考虑才能让每位顾客都满意。K8S Pod 调度也同理,调度策略对企业集群的资源利用率、性能和高可用性至关重要。

本文将带你从「默认调度器工作原理」入手,逐步深入「8 大调度策略」的原理、YAML 资源清单及真实案例演示,并分享在生产环境中优化调度、智能调度的心得与趋势。


二、默认调度器:工作原理与流程

  1. 调度器(kube-scheduler)简介

    • 内置组件,负责将待调度 Pod 与合适 Node 匹配。

    • 以插件化架构(Scheduling Framework)运行,包含多个 Filter(过滤)与 Score(打分)插件。

  2. 调度流程简述

    1. Watch & Queue:监控 API Server 中待调度 Pod,加入队列。

    2. Filter 过滤:排除资源不足或不满足拓扑规则的 Node(如 NodeAffinityTaints/Tolerations)。

    3. Score 打分:对剩余 Node 根据亲和性、负载均衡等插件逐一打分。

    4. Select 选择:选出得分最高的 Node,生成 Binding 请求。

    5. Bind 绑定:调用 API Server,将 Pod 绑定到该 Node。

问答

  • Q:为何 Filter 和 Score 要分开?
    A:Filter 保证「可行性」,Score 优化「最佳性」,两者协同提升调度效率与质量。


三、企业级模拟集群场景

我们以一个中型电商企业生产环境为例,搭建了 5 个节点,分别标注标签、资源和污点属性,部署三类应用 Pod(Web 前端、后端服务、数据库),通过不同调度策略将它们合理分配。

1. 节点清单

# nodes.yaml
---
apiVersion: v1
kind: Node
metadata:name: node-frontend-1labels:role: frontendzone: zone-a
spec:taints:- key: dedicatedvalue: frontendeffect: NoSchedule---
apiVersion: v1
kind: Node
metadata:name: node-backend-1labels:role: backendzone: zone-a
spec: {}---
apiVersion: v1
kind: Node
metadata:name: node-backend-2labels:role: backendzone: zone-b
spec:taints:- key: maintenancevalue: plannedeffect: NoExecute---
apiVersion: v1
kind: Node
metadata:name: node-db-1labels:role: databasezone: zone-b
spec:taints:- key: dedicatedvalue: dbeffect: NoSchedule---
apiVersion: v1
kind: Node
metadata:name: node-gpu-1labels:role: computezone: zone-c# 无 taint,可部署任意

模拟命令

kubectl apply -f nodes.yaml
kubectl get nodes --show-labels --show-taints

四、8 大调度策略详解

下面依次介绍每种策略的概念、YAML 清单、应用场景及终端演示。

1. 指定节点名称(NodeName)

  • 概念:最直接的「硬绑定」,Pod spec 指定 nodeName: xxx,无需通过调度器过滤打分。

  • YAML 示例

    apiVersion: v1
    kind: Pod
    metadata:name: pod-nodeName-demo
    spec:nodeName: node-backend-1containers:- name: appimage: nginx
    
  • 应用场景:测试、调试或非常确定要用特定节点时。

  • 演示

    kubectl apply -f pod-nodeName-demo.yaml
    kubectl describe pod pod-nodeName-demo | grep Node:
    # 输出:Node: node-backend-1
    

2. nodeSelector

  • 概念:基于标签的简单过滤器,调度器只考虑匹配的节点。

  • YAML 示例

    apiVersion: v1
    kind: Pod
    metadata:name: pod-nodeSelector-demo
    spec:nodeSelector:role: frontendcontainers:- name: webimage: nginx
    
  • 应用场景:标签体系清晰、需求简单时首选。

  • 演示

    kubectl apply -f pod-nodeSelector-demo.yaml
    kubectl get pods -o wide | grep pod-nodeSelector-demo
    # 可见调度到 node-frontend-1
    

3. cordon / uncordon

  • 概念:手动将节点标记为不可调度(cordon),或恢复可调度(uncordon)。

  • 命令

    kubectl cordon node-backend-2
    # node-backend-2 SchedulingDisabled
    kubectl uncordon node-backend-2
    
  • 应用场景:节点维护、升级前的排空动作。

  • 演示

    kubectl cordon node-backend-2
    kubectl describe node node-backend-2 | grep Scheduling
    

4. drain

  • 概念:结合 cordon + Evict,安全地将节点上的 Pod 驱逐的同时不接受调度并迁移。

  • 命令

    kubectl drain node-backend-2 \--ignore-daemonsets \--delete-emptydir-data
    
  • 应用场景:滚动更新、节点退役,确保无状态和有状态应用平滑迁移。

  • 演示

    kubectl drain node-backend-2
    # 驱逐 Pod 并显示被驱逐的列表
    

5. 污点(Taints)

  • 概念:在节点上打标签,默认驱逐不耐受的 Pod,包括三种 effect:NoSchedule、PreferNoSchedule、NoExecute。

	1 污点的概述
污点通常情况下是作用在worker节点上,其可以影响Pod的调度。污点的语法格式如下:key[=value]:effect相关字段说明:key:字母或数字开头,可以包含字母、数字、连字符(-)、点(.)和下划线(_),最多253个字符。也可以以DNS子域前缀和单个"/"开头value:该值是可选的。如果给定,它必须以字母或数字开头,可以包含字母、数字、连字符、点和下划线,最多63个字符。effect:[ɪˈfekt]effect必须是NoSchedule、PreferNoSchedule或NoExecute。# NoSchedule: [noʊ,ˈskedʒuːl]该节点不再接收新的Pod调度,但不会驱赶已经调度到该节点的Pod。# PreferNoSchedule: [prɪˈfɜːr,noʊ,ˈskedʒuː] 尽量不调度,该节点可以接受调度,但是前提是所有的节点都不能调度了之后,才会调度到此规则节点上面。# NoExecute:[ˈnoʊ,eksɪkjuːt] 该节点不再接收新的Pod调度,与此同时,会立刻驱逐已经调度到该节点的Pod。
  • 命令示例

    给节点打上污点kubectl taint nodes node-gpu-1 dedicated=gpu:NoSchedulekubectl taint node node-gpu-1 dedicated=gpu:NoSchedule-# 加上一个-号就可以了
    node/worker232 untainted
  • 应用场景:GPU 节点、专用节点隔离。

  • 演示

    kubectl describe node node-gpu-1 | grep Taints
    

6. 容忍(Tolerations)

  • 概念:Pod 声明能容忍哪些 taint,才能被调度到带该 taint 的节点。

  • YAML 示例

    apiVersion: v1
    kind: Pod
    metadata:name: pod-toleration-demo
    spec:tolerations:- key: dedicatedoperator: Equalvalue: gpueffect: NoSchedulecontainers:- name: computeimage: nvidia/cuda
    
  • 场景:GPU 计算、专用节点任务。

  • 演示

    kubectl apply -f pod-toleration-demo.yaml
    kubectl get pods -o wide | grep pod-toleration-demo
    # 可见调度到 node-gpu-1
    

7. Pod 亲和 / 反亲和(Affinity / Anti-affinity)

  • 概念

    • PodAffinity:倾向将 Pod 调度至与其他 Pod 同一节点或同一拓扑域。

    • PodAntiAffinity:避免与指定 Pod 同节点或同域。

  • YAML 示例(反亲和)

    apiVersion: v1
    kind: Pod
    metadata:name: pod-anti-affinity-demo
    spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- backendtopologyKey: "kubernetes.io/hostname"containers:- name: apiimage: mycompany/api:v1
    
  • 场景:避免单点故障、分散负载。

  • 演示

    kubectl apply -f pod-anti-affinity-demo.yaml
    kubectl get pods -o wide
    # 确保新 Pod 未调度到已有 backend Pod 的节点
    

8. 节点亲和(Node Affinity)

  • 概念:更灵活的 nodeSelector,支持多种运算符和软/硬约束(required / preferred)。

  • YAML 示例(硬约束 + 软约束)

    apiVersion: v1
    kind: Pod
    metadata:name: pod-node-affinity-demo
    spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: zoneoperator: Invalues:- zone-apreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: roleoperator: Invalues:- backendcontainers:- name: svcimage: mycompany/service:v2
    
  • 场景:多可用区部署、软性倾向。

  • 演示

    kubectl apply -f pod-node-affinity-demo.yaml
    kubectl get pods -o wide
    # 优先在 zone-a 的 backend 节点上
    

五、实际经验分享

在项目中我们已经常应用 taints & tolerations 来隔离生产和测试 Pod,并通过 nodeAffinity 优先调度高效节点。通过此系列技术策略,我们集群资源利用率提升了 40%。


六、推广思考:新型调度技术

  • 智能调度:实施基于 ML/统计的算法,根据历史模型预测 Pod 性能需求

  • 多集群调度:Karmada/跨集群调度管理

预测推断会成为 K8S 调度模块发展的主旋。


结论

K8S Pod 调度方法无非是性能和维护的重要手段,合理选择和组合调度策略,能够帮助我们更好地运行应用和维护集群。

相关文章:

K8S Pod调度方法实例

以下是一篇面向企业用户、兼具通俗易懂和实战深度的 Kubernetes Pod 调度方法详解博文大纲与正文示例。全文采用“图文(代码块)并茂 问答穿插 类比”方式,模拟了真实终端操作及输出,便于读者快速上手。 一、引言 为什么要关注 P…...

【mindspore系列】- 算子源码分析

本文会介绍mindspore的算子源码结构、执行过程以及如何编写一个自定义的mindspore算子。 源码介绍 首先,我们先从https://gitee.com/mindspore/mindspore/ 官网中clone源代码下来。 clone好代码后,可以看到源码的文件夹结构如下(只列出比较重要的文件夹): docsmindspore…...

学习日记-day17-5.27

完成目标: 知识点: 1.日期相关类_Calendar日历类 常用方法:int get(int field) ->返回给定日历字段的值void set(int field, int value) :将给定的日历字段设置为指定的值void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或…...

一种比较精简的协议

链接地址为:ctLink: 一个比较精简的支持C/C的嵌入式通信的中间协议。 本文采用的协议格式如下 *帧头 uint8_t 起始字节:0XAF\ *协议版本 uint8_t 使用的协议版本号:当前为0X01\ *负载长度 uint8_t 数据段内容长…...

网络常识:网线和光纤的区别

网络常识:网线和光纤的区别 一. 介绍二. 网线2.1 什么是网线?2.2 网线的主要类别2.3 网线的优势2.4 网线的劣势 三. 光纤3.1 什么是光纤?3.2 光纤的主要类别3.3 光纤的优势3.4 光纤的劣势 四. 网线 vs 光纤:谁更适合你&#xff1f…...

OpenCV CUDA模块图像过滤------创建一个 Scharr 滤波器函数createScharrFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 Scharr 滤波器(基于 CUDA 加速),用于图像的一阶导数计算。它常用于边缘检测任务中&#…...

html css js网页制作成品——HTML+CSS+js醇香咖啡屋网页设计(5页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

[特殊字符] 构建高内聚低耦合的接口架构:从数据校验到后置通知的分层实践

在现代企业系统开发中,接口结构设计的质量直接影响系统的稳定性、扩展性与可维护性。随着业务复杂度上升,单一层次的接口实现往往难以应对功能膨胀、事务一致性、后置扩展等需求。因此,我们提出一种面向复杂业务场景的接口分层模型&#xff0…...

brep2seq 源码笔记2

数学公式是什么def forward(self, noise_1, noise_2, real_z_pNone): if(real_z_p): z_p_ self.downsample(real_z_p) input_2 z_p_ noise_2 z_f self.gen_z_f(input_2) output real_z_p z_f else: …...

UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体

直接用actor.sethideningame是不行的 要先找到根组件,这样就有覆盖子物体的选项了...

人工智能AI之机器学习基石系列 第 2 篇:数据为王——机器学习的燃料与预处理

专栏系列:《人工智能AI之机器学习基石》② 高质量的数据是驱动机器学习模型的强大燃料 🚀 引言:无米之炊与数据的重要性 在上一篇文章《什么是机器学习?——开启智能之门》中,我们一起揭开了机器学习的神秘面纱&…...

代码随想录算法训练营 Day58 图论Ⅷ 拓扑排序 Dijkstra

图论 题目 117. 软件构建 拓扑排序:给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。 当然拓扑排序也要检测这个有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。所以拓扑排序也是图论中判断有向…...

实现单例模式的6种方法(Python)

目录 一. 基于模块的实现(简单,易用) 二. 重新创建时报错(不好用) 三. 只靠方法获取实例(不好用) 四. 类装饰器 五. 重写__new__方法 六. 元类 七. 总结 单例模式(Singleton Pattern)是一种设计模式,其核心目标是确保一个类…...

基于 STM32 的智慧农业温室控制系统设计与实现

摘要 本文提出一种基于 STM32 微控制器的智慧农业温室控制系统设计方案,通过集成多类型环境传感器、执行机构及无线通信模块,实现对温室内温湿度、光照、土壤湿度等参数的实时监测与自动调控。文中详细阐述硬件选型、电路连接及软件实现流程,并附关键代码示例,为智慧农业领…...

深度学习优化器相关问题

问题汇总 各类优化器SGDMomentumNesterovAdagardAdadeltaRMSpropAdam优化器 为什么Adam不一定最优而SGD最优的深度网络中loss除以10和学习率除以10等价吗L1,L2正则化是如何让模型变得稀疏的,正则化的原理L1不可导的时候该怎么办梯度消失和梯度爆炸什么原因&#xff…...

【免费】【无需登录/关注】度分秒转换在线工具

UVE Toolbox 功能概述 这是一个用于地理坐标转换的在线工具,支持两种转换模式: 十进制度 → 度分秒 度分秒 → 十进制度 使用方法 十进制度转度分秒 在"经度"输入框中输入十进制度格式的经度值(例如:121.46694&am…...

常见的垃圾回收算法原理及其模拟实现

1.标记 - 清除(Mark - Sweep)算法: 这是一种基础的垃圾回收算法。首先标记所有可达的对象,然后清除未被标记的对象。 缺点是会产生内存碎片。 原理: 如下图分配一段内存,假设已经存储上数据了 标记所有…...

fpga-编程线性序列机和状态机

一、线性序列机和有限状态机和(状态机-编程思想)的原理 序列机是什么:用计数器对时钟个数计数,根据相应时钟周期下的单个周期时间和计数个数可以确定某个时刻的时间,确定时间后再需要时间点转换电平! 采用…...

力扣面试150题--完全二叉树的节点个数

Day 51 题目描述 思路 根据完全二叉树的规律,完全二叉树的高度可以直接通过不断地访问左子树就可以获取,判断左右子树的高度: 1. 如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中) 2. 如…...

Qt 多线程环境下的全局变量管理与密码安全

在现代软件开发中,全局变量的管理和敏感信息的保护是两个重要的课题。特别是在多线程环境中,不正确的全局变量使用可能导致数据竞争和不一致的问题,而密码等敏感信息的明文存储更是会带来严重的安全隐患。本文将介绍如何在 Qt 框架下实现一个…...

内网映射有什么作用,如何实现内网的网络地址映射到公网连接?

在网络环境中,内网映射是一项重要的技术,它允许用户通过外部网络访问位于内部网络中的设备或服务。如自己电脑上的程序提供他人使用,或在家远程管理公司办公OA等涉及不同网络间的通信和数据交互。nat123作为一款老牌的内网映射工具&#xff0…...

BLIP3-o:一系列完全开源的统一多模态模型——架构、训练与数据集

摘要 在近期关于多模态模型的研究中,将图像理解与生成统一起来受到了越来越多的关注。尽管图像理解的设计选择已经得到了广泛研究,但对于具有图像生成功能的统一框架而言,其最优模型架构和训练方案仍有待进一步探索。鉴于自回归和扩散模型在…...

DNS解析流程入门篇

一、DNS 解析流程 1.1 浏览器输入域名 当在浏览器中输入 www.baidu.com 时,操作系统会按照以下步骤进行 DNS 解析: 检查本地 hosts 文件 :操作系统先检查本地的 /etc/hosts 文件,查看是否存在域名与 IP 地址的对应关系。如果找到…...

spring4第2课-ioc控制反转-依赖注入,是为了解决耦合问题

继续学习ioc控制反转&#xff0c; IOC&#xff08;Inversion of Control&#xff09;控制反转&#xff0c;也叫依赖注入&#xff0c; 目的是解决程序的耦合问题&#xff0c;轻量级spring的核心。 1.定义bean.xml <?xml version"1.0" encoding"UTF-8"…...

大模型系列22-MCP

大模型系列22-MCP 玩转 MCP 协议&#xff1a;用 Cline DeepSeek 接入天气服务什么是 MCP&#xff1f;环境准备&#xff1a;VScode Cline DeepSeek**配置 DeepSeek 模型&#xff1a;****配置 MCP 工具****uvx是什么&#xff1f;****安装 uv&#xff08;会自动有 uvx 命令&…...

【监控】Prometheus+Grafana 构建可视化监控

在云原生和微服务架构盛行的今天&#xff0c;监控系统已成为保障业务稳定性的核心基础设施。作为监控领域的标杆工具&#xff0c;Prometheus和Grafana凭借其高效的数据采集、灵活的可视化能力&#xff0c;成为运维和开发团队的“标配”。 一、Prometheus Prometheus诞生于2012…...

vscode里几种程序调试配置

标题调试python嵌入的c代码,例如 import torch from torch.utils.cpp_extension import loadtest_load load(nametest_load, sources[test.cpp],extra_cflags[-O0, -g],#extra_cflags[-O1],verboseTrue, ) a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6]) result te…...

RAGFlow源码安装操作过程

RAGFlow是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎&#xff0c;可作为Dify的外部知识库使用[1]。本文主要介绍RAGFlow前端和后端等源码安装操作过程。 一.后端安装 特别注意&#xff1a;python ">3.12,<3…...

Unity使用XCharts动态配置数据——折线图(LineChart)

XCharts官网地址&#xff1a;https://xcharts-team.github.io/ 本地上传资源&#xff1a;https://download.csdn.net/download/m0_64375864/90919669 效果图&#xff1a; 动态配置数据&#xff1a; public class Test3 : MonoBehaviour {public LineChart lineChart;public …...

【HITCSAPP 哈工大计算机系统期末大作业】 程序人生-Hello’s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机与电子通信类 学   号 2023112915 班   级 23L0505 学 生 杨昕彦 指 导 教 师 刘宏伟 计算机科学…...