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

20250720-6-Kubernetes 调度-nodeName字段,DaemonS_笔记

一、污点与容忍

1. 给节点添加污点

1)命令格式

  • 基本语法:kubectl taint node [node] key=value:[effect]
  • 示例:kubectl taint node k8s-node1 gpu=yes:NoSchedule
  • 操作说明:与打标签命令类似,将"label"替换为"taint"即可
2)value键值配置



  • 键值规范:污点以键值对形式配置,如gpu=nvidia
  • 实际应用:通常用于标记特殊节点,如GPU节点可标记为gpu=nvidia
3)effect动作



  • NoSchedule:Pod一定不会被调度到该节点(最常用)
  • PreferNoSchedule:尽量不调度,非必须配置容忍
  • NoExecute:不仅不调度,还会驱逐节点上已有Pod
4)污点效果



  • 强制隔离:当节点设置NoSchedule后,未配置容忍的Pod绝对不会被调度到该节点
  • master节点:K8s默认给master节点打上node-role.kubernetes.io/master:NoSchedule污点
5)资源不够的情况



  • 资源不足表现:即使集群资源不足,未配置容忍的Pod也不会被调度到有污点的节点
  • 实际现象:Pod会保持Pending状态,如示例中的pod2和pod5
6)配置污点容忍



  • 配置位置:在Pod的spec中添加tolerations字段
  • 关键字段:
    • key:需要匹配的污点键名
    • operator:匹配操作符(Equal/Exists)
    • value:需要匹配的污点值
    • effect:需要匹配的污点效果
7)查看污点
  • 查看命令:kubectl describe node [node] | grep Taint
  • 输出示例:
8)创建尝试分配
  • 实验现象:当所有节点都有污点且Pod未配置容忍时,Pod会保持Pending状态
  • 错误提示:0/3 nodes available: 1 node(s) had taint {...}, that the pod didn't tolerate
9)配置污点容忍并分配
  • 正确配置:必须确保tolerations中的key、value、effect与节点污点完全匹配
  • 验证方法:通过kubectl get pods -o wide查看Pod最终调度到的节点
2. 污点容忍
  • operator类型:
    • Equal:要求value严格匹配(最常用)
    • Exists:只需key存在即可,不检查value
  • 特殊值处理:
    • 空key+Exists:匹配所有污点
    • 空effect:匹配所有effect效果
3. 相关知识点
  • 删除污点:kubectl taint node [node] key:[effect]-
  • 实用技巧:可通过K8s官方文档搜索"tolerations"获取配置示例模板
  • 常见错误:value拼写错误会导致容忍失效(如将"nvidia"误写为"nvdia")
二、pod的配置问题
  • nodeSelector使用:通过disktype: "ssd"标签选择特定节点,但不会100%保证调度到目标节点
  • 污点容忍特性:配置容忍后仅表示可以调度到带污点的节点,并非强制调度
  • 调度可能性:当存在普通节点时,Pod仍可能调度到其他非目标节点
三、大师节点配置容忍性泡的示例
1. 污点与污点容忍的概念
  • Taints作用:避免Pod调度到特定Node,保障master节点安全性和专注性
  • Tolerations作用:允许Pod调度到持有Taints的Node,但不是强制调度
  • 应用场景:
    • 专用节点分组管理
    • 特殊硬件节点(SSD/GPU)
    • 基于Taint的驱逐
2. 污点容忍的配置方法
  • 基本配置:
  • effect取值:
    • NoSchedule:不调度
    • NoExecute:不执行
    • PreferNoSchedule:尽量不调度
3. 污点容忍的省略情况
  • value省略:可以只保留key不指定value,如master节点的node-role.kubernetes.io/master
  • key省略:通过operator: Exists可容忍所有带指定effect的污点
  • 范围影响:省略value/key会扩大容忍范围,适配更多环境
4. 静态泡与污点容忍的关系
  • 静态Pod特性:不受调度器管理,由kubelet直接管理
  • master节点运行:k8s组件采用静态Pod方式启动,不受污点限制
  • 两种例外情况:
    • 静态Pod(如etcd/kube-apiserver)
    • 配置了污点容忍的Pod(如calico)
5. 配置污点容忍的示例

  • 全节点部署需求:为保证集群通信,calico需要在所有节点运行
  • 通用容忍配置:
  • 设计目的:适配不同k8s环境,确保网络组件必运行
6. 污点容忍的范围与实际应用
  • 范围控制:
    • 指定key+value:精确匹配特定污点
    • 仅指定effect:容忍所有带该effect的污点
    • 使用Exists操作符:不校验key/value,仅看effect
  • 实际建议:生产环境应明确指定key/value,避免过度容忍
四、部署配置容忍泡的示例
  • 验证方法:创建5副本Deployment测试全节点调度
  • 配置要点:
  • 预期结果:Pod可调度到所有带NoSchedule污点的节点
  • 与静态Pod区别:非静态Pod必须显式配置容忍才能在污点节点运行
五、查看分布情况
1. Pod调度情况
  • Pending状态分析:多个Pod处于Pending状态,原因是节点存在污点{gpu:nvidia2}和{gpu:nvidia},而Pod未配置相应容忍
  • 节点污点检查:通过kubectl describe node可查看节点污点信息,显示master节点有NoSchedule污点
  • 运行状态示例:
    • nginx-6799fc88d8-zqcrh:1/1 Running
    • pod2:0/1 Pending 74m
    • web-54c699bb5c-*系列:多个处于ContainerCreating状态
2. Pod扩容尝试
  • 扩容策略:从5个副本扩容到10个副本进行测试
  • 调度效果:部分Pod仍无法调度,显示"1 node(s) had taint {gpu:nvidia2}"等错误
  • 关键现象:5个副本时未分配成功,扩容后部分Pod开始运行在node1和node2节点
3. 污点容忍配置
  • 基础容忍配置:
  • 特殊容忍配置:
    • CriticalAddonsOnly:关键组件专用容忍
    • NoExecute:用于驱逐场景的容忍
  • 配置原则:
    • 不指定key时容忍所有NoSchedule污点
    • 需要精确匹配时应指定key/value对
4. Pod分布验证
  • 成功调度案例:
    • web-54c699bb5c-9w81z:运行在k8s-node1(10.244.36.71)
    • web-54c699bb5c-htdgn:运行在k8s-node1(10.244.36.73)
  • 节点分布规律:Pod均匀分布在node1和node2节点,master节点未参与调度
5. 污点去除操作
  • 去除命令:kubectl taint node <node-name> <taint-key>-
  • 关键操作:去除master节点的NoSchedule污点后,Pod可调度到master节点
  • 验证方法:通过kubectl describe node | grep Taint确认污点已去除
6. 污点与容忍总结
  • 精确匹配配置:
  • 实践经验:
    • 明确指定key/value的配置更可靠
    • calico等系统组件使用Exists操作符容忍所有污点
    • 生产环境建议为关键组件配置专用容忍
  • 常见问题:
    • 效果(effect)必须匹配:NoSchedule/NoExecute
    • master节点默认有NoSchedule污点
    • 多个污点需要分别配置容忍
六、配置容忍并查看分布情况
1. Pod容忍配置
  • 配置方法:在Pod的spec中通过tolerations字段配置容忍,允许Pod被调度到带有特定污点的节点上
  • 关键参数:
    • key:污点的键名
    • operator:比较运算符(Equal/Exists)
    • value:污点的值(当operator为Equal时需指定)
    • effect:污点效果(NoSchedule/PreferNoSchedule/NoExecute)
2. 节点直接指定
  • nodeName使用:通过spec.nodeName字段可直接指定Pod运行的节点,绕过调度器
  • 应用场景:适用于需要精确控制Pod运行位置的场景
  • 注意事项:直接指定节点会失去调度器的自动容错和负载均衡能力
七、k配置问题
1. 配置必要性分析
  • 配置争议:在容忍配置中,key参数是否必须存在存在不同理解
  • 实践经验:
    • 通常建议明确指定key值(如"gpu")
    • 但实际使用中发现并非绝对必要
  • 待研究点:需要进一步研究key参数在不同场景下的深层含义和最佳实践
八、nodeName
1. nodeName意义

  • 强制调度机制:通过nodeName字段可直接指定Pod运行的目标节点,完全绕过kube-scheduler调度器
  • 特殊应用场景:主要用于测试环境,当需要精确控制Pod部署位置时使用
  • 与调度器关系:不参与调度器的节点筛选流程,直接跳过所有调度策略(如节点亲和性、污点容忍等)
2. 应用案例
  • 配置方法:
  • 实际效果验证:
    • 案例中创建pod7并指定到k8s-node1后,Pod立即进入Running状态(00:44:37验证)
    • 对比普通Pending状态的Pod(如pod2/pod5),证明nodeName确实绕过调度器限制
  • 使用注意事项:
    • 生产环境慎用:可能导致Pod无法调度(当目标节点不可用时)
    • 测试环境优势:比nodeSelector更快速直接,无需预先配置节点标签
    • 典型测试场景:验证特定节点上的硬件/软件兼容性时使用
  • 与常规调度区别:
    • 常规调度:经过节点筛选(nodeSelector/nodeAffinity)→ 打分 → 绑定流程
    • nodeName调度:直接绑定指定节点,相当于"走后门"机制(00:45:17讲解)
九、DaemonSet
1. DaemonSet功能
  • 节点全覆盖:确保在集群每个节点(包括新加入节点)上都运行一个Pod副本
  • 自动扩展:新节点加入集群时会自动创建Pod,无需人工干预
  • 运维特性:适用于需要以守护进程方式在每个节点运行的场景
2. DaemonSet应用场景
  • 网络插件:如Calico网络组件,需要在所有节点部署网络代理
  • 监控Agent:采集节点级监控指标(如CPU/内存使用率)
  • 日志Agent:收集节点上所有Pod的日志(如Filebeat)
  • 运维工具:主要用于基础设施层而非业务应用层
3. DaemonSet示例
  • 与Deployment区别:
    • 不需要设置replicas副本数
    • 不支持strategy更新策略字段
    • 资源类型需改为DaemonSet
  • 污点处理:
    • 默认不调度到有污点的节点
    • 可通过tolerations配置容忍特定污点
    • 实验时建议先删除节点污点:kubectl taint node <node-name> <taint-key>-
4. 部署日志采集程序
  • YAML关键配置:
  • 部署验证:
    • 使用kubectl get pods -o wide查看Pod分布
    • 通过kubectl describe ds <name>检查调度状态
    • 节点增加时会自动创建新Pod(约30秒内完成)
十、调度失败原因分析
  • 查看方法:
    • 查看调度结果:kubectl get pod <NAME> -o wide
    • 查看失败原因:kubectl describe pod <NAME>
  • 常见原因:
    • 资源不足:节点CPU/内存无法满足pod的request配置
    • 污点问题:节点配置了污点但pod没有相应容忍
    • 标签不匹配:节点没有pod要求的标签
    • 磁盘不足:虽然少见但也会导致调度失败(需注意错误信息)
十一、DaemonSet控制器
1. DaemonSet控制器概述
  • 工作特点:自动在符合条件的节点上创建pod
  • 验证案例:删除节点污点后,DaemonSet会自动拉起pod
2. DaemonSet创建问题
  • 命令行限制:不支持kubectl create直接创建
  • 替代方案:通常使用YAML文件进行部署
3. DaemonSet不常用原因
  • 使用场景:主要用于节点级守护进程,不是常规工作负载
4. node selector与污点区别
  • 功能差异:
    • node selector:节点必须具有指定标签
    • 污点:节点排斥非特定pod
  • 优先级关系:两者功能不同,不存在优先级比较
  • 调度disable:使节点完全不调度新pod,不同于污点的选择性排斥
5. toleration与taint匹配
  • 特殊配置:
    • 当toleration的key为空且operator为"Exists"时
    • 表示能容忍任意taint(除非指定了effect限制)
6. dry-run选项区别
  • client模式:仅在客户端验证配置
  • server模式:提交到API server进行验证
  • 应用场景:测试资源配置时使用不同验证级别
十二、答疑
1. 权重的作用与理解
  • 调度加分机制:权重相当于调度系统中的加分值,类似于比赛评委的特殊加分权限
  • 实际应用场景:以中国好声音为例,特定评委可通过加分提高选手获胜概率
  • 技术实现原理:在Kubernetes调度器打分环节会计算该值,影响节点分配优先级
  • 学习建议:初学者只需理解其加分功能,深入理解需研究整个调度打分流程
2. 关于fact分配到master的疑问
  • 现象描述:测试发现pod无法分配到master节点,与预期行为不符
  • 排查过程:讲师重现测试环境,创建10个pod均未分配到master
  • 可能原因:环境配置存在隐藏影响因素,需进一步验证
  • 临时结论:初步排除理解错误,转向环境因素排查
3. 验证测试环境是否影响分配
  • 配置验证:确认使用了正确的effect和operator配置组合
  • 测试建议:建议学员尝试相同配置验证分配行为
  • 最新发现:经过反复测试后确认配置理论上应生效
  • 环境变量:强调环境差异可能导致不同表现,需实际验证
4. 数字与优先级的关系
  • 数值规律:数字越大表示优先级越高,对应调度分数越高
  • 评分类比:类似评委打分(1-100分范围),高分增加胜出概率
  • 权重机制:高权重值会显著提升节点被选中的可能性
  • 使用建议:合理设置权重值范围,避免极端数值影响调度平衡
5. 练习与验证
  • 练习内容:
    • 验证master节点分配问题
    • 测试不同权重值对调度的影响
    • 尝试各种tolerations配置组合
  • 验证方法:通过kubectl create命令部署测试用例
  • 注意事项:记录完整测试过程,注意环境差异因素
  • 交流机制:鼓励学员在群内分享验证结果和异常情况
十三、知识小结

知识点

核心内容

关键配置/参数

典型应用场景

污点(Taint)

节点排斥机制,阻止Pod默认调度

kubectl taint nodes <node-name> key=value:NoSchedule

Master节点保护、专用节点隔离

污点容忍(Toleration)

允许Pod调度到带污点的节点

tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule"

系统组件部署(如Calico)、特殊硬件利用

NodeSelector

基础节点选择器

nodeSelector: disktype: ssd

简单环境区分

NodeAffinity

高级节点亲和性规则

preferredDuringSchedulingIgnoredDuringExecution/requiredDuringSchedulingIgnoredDuringExecution

复杂调度策略

DaemonSet

每个节点运行一个Pod的控制器

无replicas字段,自动识别集群节点数

网络插件、监控代理、日志收集器

调度失败分析

常见原因排查

1. 资源不足

2. 污点未容忍

3. 标签不匹配

集群运维排错

Master节点调度

默认带node-role.kubernetes.io/master:NoSchedule污点

需配置容忍或静态Pod方式运行

Kubernetes控制平面组件部署

NodeName直配

绕过调度器直接指定节点

spec.nodeName: node1

测试环境专用

http://www.lryc.cn/news/594185.html

相关文章:

  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • spring-cloud使用
  • 【数据结构】揭秘二叉树与堆--用C语言实现堆
  • 数据结构-线性表顺序表示
  • PrimeTime:高级片上变化(AOCV)
  • 小红书 MCP 服务器
  • Vue 3中reactive、ref、watchEffect和watch的底层原理及核心区别解析
  • SQL189 牛客直播各科目同时在线人数
  • SQL 调优第一步:EXPLAIN 关键字全解析
  • [Java恶补day44] 整理模板·考点七【二叉树】
  • Docker Desktop 入门教程(Windows macOS)
  • HTTP 进化史:从 1.0 到 3.0
  • The FastMCP Client
  • 你的created_time字段,用DATETIME还是TIMESTAMP?
  • Python自动化测试项目实战
  • Python 模块与包导入 基础讲解
  • Haproxy算法精简化理解及企业级高功能实战
  • 如何在看板中体现任务依赖关系
  • Windows CMD(命令提示符)中最常用的命令汇总和实战示例
  • 让黑窗口变彩色:C++控制台颜色修改指南
  • 30天打牢数模基础-SVM讲解
  • Linux操作系统从入门到实战(十一)回车换行问题与用户缓冲区问题
  • 内网后渗透攻击过程(实验环境)--3、横向攻击
  • dify创建OCR工作流
  • java抗疫物质管理系统设计和实现
  • 多人在线场景下Three.js同步机制设计:延迟补偿、状态插值的工程实践
  • 07_图像容器Mat_详解
  • 元学习算法的数学本质:从MAML到Reptile的理论统一与深度分析
  • maven构建Could not transfer artifact失败原因
  • 红宝书单词学习笔记 list 51-75