3. 资源管理与调度:资源请求与限制、QoS 等级、资源配额管理

在 Kubernetes 集群中,资源管理与调度是保障应用稳定性与集群利用率的核心机制。本章围绕三个关键维度展开:资源请求与限制(Requests & Limits)、服务质量等级(QoS Classes)以及资源配额管理(ResourceQuota & LimitRange)。理解这三者的协同关系,是进行调度优化与窗口数据传输控制的基础。

3.1 资源请求与限制

每个 Pod 中的容器都可以声明两类资源参数:

  • Requests(请求):容器启动时保证获得的最小资源量,调度器依据此值选择满足条件的节点。
  • Limits(限制):容器运行时允许使用的资源上限,防止单个容器过度占用宿主机资源。

Kubernetes 主要管理两种可压缩资源(CPU)和一种不可压缩资源(内存):

资源类型 Requests 作用 Limits 作用 超限行为
CPU 调度保证,CFS 配额分配 CPU 使用上限(CFS 周期限制) 节流(Throttle),不会杀死容器
Memory 调度保证,节点内存预留 内存使用硬限制 触发 OOM Killer,容器被重启
最佳实践:生产环境中建议始终设置 Requests 与 Limits。对于 CPU,可将 Requests 与 Limits 设为相同值(Guaranteed 模式);对于内存,建议 Limits 略高于 Requests 以应对突发流量,但需监控 OOM 风险。
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "1000m"

3.2 服务质量等级(QoS Classes)

Kubernetes 根据 Pod 中所有容器的 Requests 与 Limits 配置,自动为每个 Pod 分配一个 QoS 等级。该等级决定了节点资源紧张时 Pod 被驱逐的优先级。

QoS 等级 判定条件 驱逐优先级 典型场景
Guaranteed 所有容器 Requests == Limits(CPU 和内存) 最低(最不易被驱逐) 关键业务、数据库、有状态服务
Burstable 至少一个容器 Requests < Limits,且未满足 Guaranteed 中等 Web 服务、微服务、批处理任务
BestEffort 所有容器均未设置 Requests 和 Limits 最高(最先被驱逐) 低优先级任务、测试、CI 构建
注意:BestEffort Pod 在节点内存压力下会被优先驱逐,且不保证任何资源。在 GitOps 窗口数据传输场景中,应避免将关键数据同步组件设置为 BestEffort,否则可能导致传输中断。
QoS 等级与驱逐优先级关系 Guaranteed Requests == Limits 驱逐优先级:最低 Burstable Requests < Limits 驱逐优先级:中等 BestEffort 未设置 Requests/Limits 驱逐优先级:最高 驱逐优先级递增 → 节点资源压力下的驱逐顺序 1. 优先驱逐 BestEffort Pod 2. 其次驱逐 Burstable Pod(按内存使用率排序) 3. 最后驱逐 Guaranteed Pod(仅当节点内存完全耗尽)

3.3 资源配额管理

资源配额(ResourceQuota)与限制范围(LimitRange)是 Kubernetes 提供的多租户资源管控手段,确保命名空间级别的资源公平使用。

3.3.1 ResourceQuota

ResourceQuota 为命名空间设置聚合资源上限,包括 CPU、内存、存储卷数量、PVC 数量、Service 数量等。当命名空间内所有 Pod 的资源总和超过配额时,新的 Pod 创建将被拒绝。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    persistentvolumeclaims: "10"
    pods: "50"

3.3.2 LimitRange

LimitRange 在命名空间级别设置默认的 Requests/Limits 值以及最小/最大约束,确保未显式设置资源声明的 Pod 不会意外获得无限资源。

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
  namespace: team-a
spec:
  limits:
  - max:
      memory: "1Gi"
    min:
      memory: "128Mi"
    default:
      memory: "512Mi"
    defaultRequest:
      memory: "256Mi"
    type: Container
GitOps 窗口数据传输建议:在数据同步窗口期间,建议为关键传输 Pod 设置 Guaranteed QoS,并配合 ResourceQuota 预留足够的带宽资源。同时使用 LimitRange 约束非关键容器的资源上限,防止突发流量挤占传输通道。
资源配额管理架构 Kubernetes 集群 Namespace: team-a ResourceQuota CPU: 4 / Mem: 8Gi / Pods: 50 LimitRange 默认 Requests/Limits + 最小/最大约束 Pod A Guaranteed Pod B Burstable Pod C BestEffort Namespace: team-b ResourceQuota CPU: 8 / Mem: 16Gi / Pods: 100 LimitRange 默认 Requests/Limits + 最小/最大约束 Pod X Guaranteed Pod Y Burstable Pod Z BestEffort 每个 Namespace 独立配置 ResourceQuota 和 LimitRange,实现多租户资源隔离与公平调度

3.4 调度器视角的资源决策流程

Kubernetes 调度器(kube-scheduler)在调度 Pod 时,会依次执行以下资源相关步骤:

  1. 节点过滤(Predicates):检查节点剩余可分配资源是否满足 Pod 的 Requests 总和。
  2. 节点打分(Priorities):根据资源利用率、QoS 等级等指标对候选节点排序。
  3. 资源预留:调度成功后,节点上的资源预留量增加,直到 Pod 实际运行。
  4. QoS 驱逐:节点资源紧张时,kubelet 按 QoS 等级从低到高驱逐 Pod。
关键指标:调度效率与资源碎片化程度直接相关。建议使用 cluster-autoscaler 配合 PodDisruptionBudget,在窗口数据传输期间保持节点资源水位在 60%-80% 之间,避免因资源不足导致传输 Pod 被驱逐。