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,否则可能导致传输中断。
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 约束非关键容器的资源上限,防止突发流量挤占传输通道。
3.4 调度器视角的资源决策流程
Kubernetes 调度器(kube-scheduler)在调度 Pod 时,会依次执行以下资源相关步骤:
- 节点过滤(Predicates):检查节点剩余可分配资源是否满足 Pod 的 Requests 总和。
- 节点打分(Priorities):根据资源利用率、QoS 等级等指标对候选节点排序。
- 资源预留:调度成功后,节点上的资源预留量增加,直到 Pod 实际运行。
- QoS 驱逐:节点资源紧张时,kubelet 按 QoS 等级从低到高驱逐 Pod。
关键指标:调度效率与资源碎片化程度直接相关。建议使用
cluster-autoscaler 配合 PodDisruptionBudget,在窗口数据传输期间保持节点资源水位在 60%-80% 之间,避免因资源不足导致传输 Pod 被驱逐。