kubeschedule 首先过滤出可调度的节点,然后给这些节点打分,分值最高的获得调度权,最后如果分值相等随机选择一个。本节我们通过打标签、打污点的方式来干预pod的调度行为。
- nodeAffinity
- podAffinity
- podAntiAffinity
- nodename
- nodeSelector
- 污点和容忍度
- 备注
nodeAffinity
| kubectl label node 10.4.7.31 disktype=ssd |
| kubectl get nodes --show-labels |
| |
【位置】 pod.spec.affinity下
| affinity: |
| nodeAffinity: |
| |
| requiredDuringSchedulingIgnoredDuringExecution: |
| nodeSelectorTerms: |
| - matchExpressions: |
| - key: disktype |
| |
| operator: In |
| values: |
| - "ssd" |
| affinity: |
| nodeAffinity: |
| preferredDuringSchedulingIgnoredDuringExecution: |
| - weight: 1 |
| preference: |
| matchExpressions: |
| - key: cputype |
| operator: In |
| values: ["AMD"] |
podAffinity
【位置】 pod.spec.affinity下
| affinity: |
| podAffinity: |
| requiredDuringSchedulingIgnoredDuringExecution: |
| - labelSelector: |
| matchExpressions: |
| - key: app |
| operator: In |
| values: |
| - alpine |
| |
| topologyKey: "kubernetes.io/hostname" |
| affinity: |
| podAffinity: |
| preferredDuringSchedulingIgnoredDuringExecution: |
| - weight: 10 |
| podAffinityTerm: |
| labelSelector: |
| matchExpressions: |
| - key: app |
| operator: In |
| values: |
| - alpine |
| |
| topologyKey: "kubernetes.io/hostname" |
| |
podAntiAffinity
【位置】 pod.spec.affinity下
| affinity: |
| podAntiAffinity: |
| requiredDuringSchedulingIgnoredDuringExecution: |
| - labelSelector: |
| matchExpressions: |
| - key: app |
| operator: In |
| values: |
| - mysql |
| |
| topologyKey: "kubernetes.io/hostname |
| |
| affinity: |
| podAntiAffinity: |
| preferredDuringSchedulingIgnoredDuringExecution: |
| - weight: 10 |
| podAffinityTerm: |
| labelSelector: |
| matchExpressions: |
| - key: app |
| operator: In |
| values: |
| - alpine |
| |
| topologyKey: "kubernetes.io/hostname" |
| |
说明:
Pod 间亲和性与反亲和性需要大量计算的处理,这可能会显著减慢大规模集群中的调度。 我们不建议在超过数百个节点的集群中使用它们。
Pod 反亲和性需要对节点进行一致的标记,即集群中的每个节点必须具有适当的标签能够匹配 topologyKey
。如果某些或所有节点缺少指定的 topologyKey
标签,可能会导致意外行为。
nodeName
存在的弊端:
-
当指定的node名称不存在,pod 会处于pending 状态
-
指定的node 资源不足以运行该pod 时 pod 提示 OutOfcpu、OutOfmemory
| |
| nodeName: hdss7-22.host.com |
nodeSelector
污点和容忍度
要使用容忍度,需要先给node 添加污点
| |
| kubectl taint nodes hdss7-21.host.com key1=value1:NoSchedule |
| |
| kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule |
删除污点
| kubectl taint nodes hdss7-21.host.com key1=value1:NoSchedule- |
【位置】 pod.spec下
| tolerations: |
| - key: "key1" |
| operator: "Equal" |
| value: "value1" |
| effect: "NoSchedule" |
| tolerations: |
| - key: "key1" |
| operator: "Exists" |
| effect: "NoSchedule" |
| |
| tolerations: |
| - key: "" |
| operator: "Exists" |
| tolerations: |
| - key: "key1" |
| operator: "Equal" |
| value: "value1" |
| effect: "NoExecute" |
| tolerationSeconds: 3600 |
备注
| 如果你同时指定了 nodeSelector 和 nodeAffinity,两者必须都要满足, 才能将 Pod 调度到候选节点上。 |
| 如果你指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,则 如果其中一个 nodeSelectorTerms 满足的话,pod将可以调度到节点上 |
| 如果你指定了多个与 nodeSelectorTerms 关联的 matchExpressions,则 只有当所有 matchExpressions 满足的话,Pod 才会可以调度到节点上。 |
| preferredDuringSchedulingIgnoredDuringExecution 中的 weight 字段值的 范围是 1-100。 |
| 对于每个符合所有调度要求(资源请求、RequiredDuringScheduling 亲和性表达式等) 的节点,调度器将遍历该字段的元素来计算总和,并且如果节点匹配对应的 MatchExpressions,则添加“权重”到总和。 |
| 然后将这个评分与该节点的其他优先级函数的评分进行组合。 总分最高的节点是最优选的。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏