2. K8s资源管理基础:Pod资源请求与限制、QoS类别、节点资源分配单元的概念

在Kubernetes集群中,资源管理是保障应用稳定性与成本效率的基石。本章将深入剖析Pod的资源请求(Requests)与限制(Limits)、服务质量(QoS)类别以及节点资源分配单元(Resource Quota / LimitRange)三大核心概念,为后续的节点碎片整理与FinOps标签治理奠定理论基础。

2.1 Pod资源请求与限制

每个Pod中的容器都可以声明两类资源参数:Requests(请求)和Limits(限制)。Requests用于调度决策,Limits用于运行时压制。

参数 含义 调度影响 运行时行为
requests.cpu 容器保证可用的CPU最小值 节点必须满足所有Pod requests总和 ≤ 节点可分配资源 CPU按requests权重分配时间片,超限时被节流(Throttle)
requests.memory 容器保证可用的内存最小值 节点必须满足所有Pod requests总和 ≤ 节点可分配资源 内存不足时触发OOM Killer,优先杀死超限Pod
limits.cpu 容器可使用的CPU上限 不影响调度(仅用于运行时压制) CFS配额限制,超过则节流
limits.memory 容器可使用的内存上限 不影响调度(仅用于运行时压制) 超过则触发OOM Kill
关键原则:Requests ≤ Limits。若只设置Limits未设置Requests,则Requests默认等于Limits。生产环境建议显式设置两者,避免资源争抢与调度偏差。
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"

2.2 QoS类别:服务质量分级

Kubernetes根据Pod中所有容器的Requests与Limits配置,自动将Pod归入三种QoS类别。当节点资源紧张时,QoS类别决定了Pod被驱逐的优先级。

QoS类别 判定条件 驱逐优先级 典型场景
Guaranteed 每个容器Requests == Limits(CPU和内存均相等) 最低(最后被驱逐) 数据库、关键中间件
Burstable 至少一个容器Requests < Limits,且所有容器都设置了Requests 中等 Web服务、微服务
BestEffort 所有容器均未设置Requests和Limits 最高(最先被驱逐) 批处理、测试任务
FinOps视角:Guaranteed Pod资源利用率稳定,适合预留容量规划;BestEffort Pod适合利用闲置资源,但不可靠。合理混合QoS类别可提升整体节点资源利用率,降低碎片率。
Kubernetes QoS 类别与驱逐优先级 Guaranteed Requests == Limits 驱逐优先级:最低 Burstable Requests < Limits 驱逐优先级:中等 BestEffort 无 Requests/Limits 驱逐优先级:最高 节点资源紧张时,驱逐顺序: BestEffort → Burstable → Guaranteed QoS类别由Pod的Requests/Limits配置自动决定,不可手动指定

2.3 节点资源分配单元

Kubernetes通过ResourceQuota和LimitRange两个资源分配单元,实现命名空间级别的资源治理与Pod级别的默认约束。

2.3.1 ResourceQuota(资源配额)

ResourceQuota作用于命名空间,限制该命名空间内所有Pod的资源总和上限,防止单个团队或应用过度占用集群资源。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    pods: "50"

2.3.2 LimitRange(默认限制范围)

LimitRange为命名空间内的Pod设置默认的Requests/Limits值,以及最小/最大约束,确保未显式设置资源的Pod也能获得合理的默认值。

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-a
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container
常见陷阱:ResourceQuota与LimitRange配合使用时,若LimitRange设置的默认值导致Pod资源总和超过Quota上限,Pod将无法调度。建议先规划Quota总量,再设置合理的LimitRange默认值。
节点资源分配单元架构 Kubernetes 集群 命名空间 (Namespace) ResourceQuota 资源总和上限 LimitRange 默认值 / 最小 / 最大 Pod 集合 受 Quota 约束 Pod 集合 受 LimitRange 约束 ResourceQuota 控制总量,LimitRange 控制单 Pod 默认值,两者协同实现精细化资源治理

2.4 资源管理最佳实践

  • 始终设置Requests:避免BestEffort Pod意外抢占关键资源,导致节点不稳定。
  • Limits不宜过高:过高的Limits会导致节点资源碎片化,降低调度效率。
  • Guaranteed Pod用于关键业务:确保数据库、消息队列等有状态服务获得稳定资源。
  • ResourceQuota与LimitRange成对配置:防止命名空间资源失控,同时为未配置资源的Pod提供安全默认值。
  • 定期审计QoS分布:通过监控工具分析集群中Guaranteed/Burstable/BestEffort Pod的比例,优化资源利用率。