Kubernetes 调度亲和性与资源配额

举报
bit澜 发表于 2026/10/09 18:02:28 2026/10/09
【摘要】 一、Pod 亲和性(podAffinity) 1. 基本概念亲和性(Affinity)决定「跟谁」:新 Pod 想和哪些 Pod 待在一起。示例配置(硬性 Pod 亲和性):spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: ...

一、Pod 亲和性(podAffinity)

1. 基本概念

亲和性(Affinity)决定「跟谁」:新 Pod 想和哪些 Pod 待在一起。

示例配置(硬性 Pod 亲和性):

spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - myapp
        topologyKey: kubernetes.io/hostname

效果:新 Pod 必须调度到已有 app=myapp Pod 的同一节点上。

2. 关键字段含义

字段 含义
requiredDuringSchedulingIgnoredDuringExecution 硬性约束,不满足则 Pod 一直 Pending
preferredDuringSchedulingIgnoredDuringExecution 软性约束,不满足只降低得分、不阻塞
labelSelector 匹配目标 Pod 的标签
topologyKey 拓扑域,限定"多近算在一起"

3. 亲和性与拓扑域的区别

  • 亲和性:决定"跟谁"(哪组 Pod)
  • 拓扑域:决定"多近算在一起"(节点 / 可用区 / 区域)
    • kubernetes.io/hostname → 按节点(同一台机器)
    • topology.kubernetes.io/zone → 按可用区
    • topology.kubernetes.io/region → 按区域

4. 多个节点都满足条件时部署到哪?

调度器按资源余量等指标打分,分数高的优先;分数相同则随机。

二、Pod 拓扑分布约束(podTopologySpread)

1. 作用

让副本在拓扑域间均匀分布,避免都挤在一个节点/可用区。

spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: myapp

2. maxSkew 含义

  • 允许的最大数量差距
  • 校验的是「放置后」的 skew(新 Pod 放进去之后计算)
  • 硬约束(DoNotSchedule)不满足 → Pending
  • 软约束(ScheduleAnyway)不满足 → 仅降低得分

3. 高可用建议

多可用区场景推荐:

topologyKey: topology.kubernetes.io/zone
maxSkew: 1

三、ResourceQuota 资源配额

1. hard 字段含义

硬性上限(Hard Limit),即命名空间资源总预算:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: default
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "10"
  • 所有 Pod 资源总和达到阈值后,apiserver 直接拒绝新 Pod 创建请求
  • 无中间态,不会"排队"或"警告"

2. ResourceQuota 是否有软限制?

官方仅支持 hard,无软配额。但集群层面有其他机制:

机制 作用
kubelet eviction-soft 达到阈值给宽限期后才驱逐
LimitRange 单 Pod 资源约束
Prometheus 告警 提前预警(如 80% 告警)

实现"到 80% 告警、100% 才拒绝"需自建 Prometheus 告警规则,ResourceQuota 本身做不到。

四、一句话速记

  • 亲和性 = 跟谁;拓扑域 = 多近算一起
  • 硬约束不满足 = Pending;软约束不满足 = 降分
  • maxSkew 校验的是"放置后"的差距
  • ResourceQuota 只有 hard,软限制要靠 eviction/告警
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。