跳到正文
复制成功
请遵守本站许可
报告
章节_文章 // 现场报告

文章编号: RL-POD资源管理

2026.10.20

Pod 资源管理

Chavy
Chavy
#Kubernetes#Pod#资源管理#QoS
档案

摘要:理解 CPU 与内存的 requests、limits 和 QoS 等级,结合 OOMKilled、驱逐、LimitRange 与 ResourceQuota 管理 Pod 和命名空间资源。

1. 节点资源分配模型#

flowchart TB
    N0["Node:8 核 CPU / 16 GiB 内存<br/>实际可分配资源还需扣除系统预留和其他开销"]
    N1["Pod A<br/>CPU:500m<br/>内存:512Mi"]
    N2["Pod B<br/>CPU:1<br/>内存:1Gi"]
    N3["Pod C<br/>CPU:2<br/>内存:2Gi"]
    N4["其他 Pod<br/>共享剩余资源"]
    N0 --> N1
    N0 --> N2
    N0 --> N3
    N0 --> N4

示意图:Pod 的资源声明是调度与运行时资源控制的重要依据,但不是简单的静态分区。

2. Kubernetes 资源管理基础#

1. Kubernetes 管理哪些资源?#

Kubernetes 容器资源管理主要涉及:

资源含义是否可以压缩
CPU计算资源可以限制使用
Memory内存资源通常不能通过限额机制压缩
Ephemeral Storage临时存储可以限制和统计
HugePages大页内存按配置分配
Extended Resources扩展资源,如 GPU通常按整数分配

其中,CKA 最重要的是:

  • CPU
  • Memory
  • Requests
  • Limits
  • QoS

2. CPU 资源单位#

Kubernetes 中 CPU 使用核(Core)作为基础单位。

例如:

PRTCL // YAML
resources:
requests:
cpu: "1"

表示请求 1 个 CPU 核。

常见单位:

配置含义
11 CPU 核
22 CPU 核
500m0.5 CPU 核
250m0.25 CPU 核
100m0.1 CPU 核
50m0.05 CPU 核

其中:

PRTCL // TEXT
1 CPU = 1000m

例如:

PRTCL // YAML
cpu: "500m"

等于:

PRTCL // TEXT
0.5 CPU

注意:

m 表示 milliCPU,不是 MB,也不是毫秒。

3. Memory 资源单位#

内存通常使用字节单位。

Kubernetes 支持十进制单位和二进制单位。

单位含义
K1000 字节
M1000² 字节
G1000³ 字节
Ki1024 字节
Mi1024² 字节
Gi1024³ 字节

常见配置:

PRTCL // YAML
memory: "128Mi"
memory: "256Mi"
memory: "512Mi"
memory: "1Gi"
memory: "2Gi"

注意:

PRTCL // TEXT
1Gi = 1024Mi
1G = 1000M

生产环境通常建议使用 Mi、Gi 等二进制单位,避免单位混淆。

3. Requests:资源请求#

1. 什么是 Requests?#

Requests 表示容器运行时所请求的资源量。

例如:

PRTCL // YAML
resources:
requests:
cpu: "500m"
memory: "512Mi"

表示:

  • 请求 0.5 个 CPU 核。
  • 请求 512Mi 内存。

Scheduler 会根据 Pod 的资源请求量判断节点是否有足够的可分配资源。

例如:

PRTCL // TEXT
Node-1
CPU Allocatable:8 核
已分配 Requests:7.5 核
剩余可分配:0.5 核

现在创建一个 Pod:

PRTCL // YAML
requests:
cpu: "1"

那么:

PRTCL // TEXT
Node-1:不满足

因为只剩下 0.5 核可分配,而 Pod 请求 1 核。

即使节点实际 CPU 使用率只有 20%,也不代表这个 Pod 一定能够调度到该节点。

这是非常重要的知识。

Scheduler 主要根据 Requests 和节点可分配资源进行调度判断,而不是简单根据当前 CPU 实时使用率判断。

2. Requests 的作用#

主要有三个:

  1. 决定 Pod 调度时的资源需求。
  2. 影响节点资源分配与超卖情况。
  3. 参与 QoS 等级判断和部分资源争用处理。

3. Requests 示例#

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: nginx-resource
spec:
containers:
- name: nginx
image: nginx:1.27
resources:
requests:
cpu: "500m"
memory: "512Mi"

4. Limits:资源限制#

1. 什么是 Limits?#

Limits 表示容器运行时允许使用的资源上限。

例如:

PRTCL // YAML
resources:
limits:
cpu: "1"
memory: "1Gi"

表示:

  • CPU 使用上限为 1 核。
  • 内存使用上限为 1Gi。

Requests 与 Limits 的区别:

对比RequestsLimits
作用资源请求资源上限
主要影响调度容器运行时资源约束
CPU参与调度和权重配置通过 CPU CFS 配额进行限制
Memory参与调度和资源管理超限可能触发 OOM Kill

2. CPU Limits#

假设:

PRTCL // YAML
resources:
requests:
cpu: "500m"
limits:
cpu: "1"

含义:

PRTCL // TEXT
CPU 请求:0.5 核
CPU 上限:1 核

当容器需要大量 CPU 时:

  • 在资源充足且没有触及限制时,可以使用更多 CPU。
  • 达到 CPU 限制后,会受到 CPU Throttling(CPU 限流)。

注意:

CPU 是可压缩资源。

达到 CPU Limit 通常不会直接导致容器被杀死。

3. Memory Limits#

例如:

PRTCL // YAML
resources:
requests:
memory: "512Mi"
limits:
memory: "1Gi"

含义:

PRTCL // TEXT
内存请求:512Mi
内存上限:1Gi

如果容器实际使用内存超过限制:

flowchart TB
    N0["Memory Usage &gt; Memory Limit"]
    N1["触发 OOM 处理"]
    N2["可能被 OOM Kill"]
    N0 --> N1
    N1 --> N2

通常容器会出现:

PRTCL // TEXT
Reason: OOMKilled
Exit Code: 137

注意:

内存限制不是像 CPU 那样可以持续限流。内存属于不可压缩资源,超限时可能被内核 OOM 机制终止进程。

5. Requests 与 Limits 综合理解#

假设创建一个 Pod:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx:1.27
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"

资源关系:

CPU 资源 500m Requests:调度请求 0.5 核

Limits:最多 1 核

Memory 资源 512Mi Requests:调度请求 512Mi

Limits:最多 1Gi(1024Mi)

这里需要记住:

Requests 不代表容器只能使用这么多资源。

例如:

PRTCL // TEXT
CPU Requests = 500m
CPU Limits = 1000m

在没有触及 CPU Limit 且节点有可用 CPU 的情况下,容器可以使用超过 500m 的 CPU。

同样:

PRTCL // TEXT
Memory Requests = 512Mi
Memory Limits = 1Gi

容器可以在运行时使用超过 512Mi 的内存,但不能保证它一定能获得这部分内存;超过 1Gi 则可能触发 OOM Kill。

6. CPU Throttling:CPU 限流机制#

这是 Kubernetes 资源管理中非常重要的底层知识。

1. 什么是 CPU Throttling?#

CPU Throttling 指 CPU 限流。

当容器使用 CPU 达到配置的 Limit 后,Linux 内核会通过 CFS(Completely Fair Scheduler)配额机制限制容器继续使用 CPU。

例如:

PRTCL // YAML
resources:
requests:
cpu: "500m"
limits:
cpu: "1"

表示:

  • CPU Requests:0.5 核。
  • CPU Limits:1 核。

假设应用突然需要 2 核 CPU:

flowchart TB
    N0["应用需要:2 核<br/>CPU Limit:1 核"]
    N1["内核限制 CPU 使用"]
    N2["容器受到 CPU Throttling"]
    N0 --> N1
    N1 --> N2

容器不会因为 CPU 超过 Limit 就直接退出,而是需要等待后续 CPU 配额周期。

2. CPU 限流底层原理#

Linux 使用 CFS 带宽控制机制对容器 CPU 使用进行限制。

在启用 CFS 配额的情况下,常见参数包括:

参数含义
cpu.cfs_quota_usCPU 配额时间
cpu.cfs_period_usCPU 配额周期
cpu.sharesCPU 相对权重

在 cgroup v2 中,对应的主要参数为:

PRTCL // TEXT
cpu.max
cpu.weight

例如:

PRTCL // TEXT
cpu.max = 100000 100000

表示:

  • 周期:100000 微秒。
  • 配额:100000 微秒。

相当于一个 CPU 核的使用额度。

如果:

PRTCL // TEXT
cpu.max = 50000 100000

则表示:

每 100000 微秒周期,最多可以使用 50000 微秒 CPU 时间。

即 0.5 个 CPU 核的配额。

3. 如何排查 CPU 限流?#

首先查看 Pod 资源配置:

PRTCL // BASH
Terminal window
kubectl describe pod nginx

如果集群安装了 Metrics Server:

PRTCL // BASH
Terminal window
kubectl top pods

查看节点:

PRTCL // BASH
Terminal window
kubectl top nodes

注意:

kubectl top 显示的是资源使用量,不直接显示 CPU Throttling 次数。

生产环境通常结合 Prometheus 和 cAdvisor 监控:

PRTCL // TEXT
rate(container_cpu_cfs_throttled_periods_total[5m])
/
rate(container_cpu_cfs_periods_total[5m])

这个指标可以用于观察容器 CPU 限流周期的比例。

如果该比例长期很高,同时应用延迟明显增加,就需要检查 CPU Limit 是否设置过低。

配额限制的是控制周期内累计消耗的 CPU 时间,不意味着程序只能使用某个固定 CPU 核心的前半段时间。

7. OOMKilled:内存溢出机制#

与 CPU 不同,内存属于不可压缩资源。

这是 Kubernetes 资源管理中最重要的知识点之一。

1. 什么是 OOMKilled?#

OOM 是 Out Of Memory 的缩写。

当容器使用内存超过限制,Linux 内核可能触发 OOM Killer,终止相关进程以释放内存。

例如:

PRTCL // YAML
resources:
requests:
memory: "256Mi"
limits:
memory: "512Mi"

假设应用不断申请内存:

PRTCL // TEXT
100Mi
200Mi
300Mi
400Mi
500Mi
550Mi

当内存使用超过 512Mi 时,可能触发 OOM Kill。

Pod 状态可能显示:

PRTCL // TEXT
NAME READY STATUS
nginx 0/1 OOMKilled

2. OOMKilled 与 Exit Code 137#

排查:

PRTCL // BASH
Terminal window
kubectl describe pod nginx

可能看到:

PRTCL // TEXT
Last State: Terminated
Reason: OOMKilled
Exit Code: 137

其中:

字段含义
OOMKilled因内存不足被终止
Exit Code 137通常表示进程收到 SIGKILL
Last State上一次容器终止状态

注意:

137 通常对应 128 + 9,表示进程被 SIGKILL 终止,但并不是所有 137 都一定是 OOM。

需要结合 Reason、事件和节点日志判断。

3. 如何排查 OOMKilled?#

第一步:

PRTCL // BASH
Terminal window
kubectl get pods

第二步:

PRTCL // BASH
Terminal window
kubectl describe pod <pod-name>

第三步:

PRTCL // BASH
Terminal window
kubectl logs <pod-name> --previous

第四步:

PRTCL // BASH
Terminal window
kubectl top pod <pod-name>

如果是容器反复重启:

PRTCL // BASH
Terminal window
kubectl get pod <pod-name> -o yaml

重点检查:

PRTCL // YAML
resources:
requests:
memory: 256Mi
limits:
memory: 512Mi

4. 如何解决 OOMKilled?#

常见解决方式:

  1. 合理提高 Memory Limits。
  2. 检查应用是否存在内存泄漏。
  3. 优化缓存和内存使用。
  4. 减少单个 Pod 承载的业务量。
  5. 必要时增加 Pod 副本。
  6. 检查 JVM、Go 等运行时自身的内存配置。

特别注意:

增加 Memory Limits 不代表一定能解决问题。

如果应用本身存在内存泄漏,只会延后 OOM 发生的时间。

8. QoS:服务质量等级#

现在学习 Kubernetes 的一个核心机制:

QoS Class(Quality of Service Class)。

QoS 用于区分不同 Pod 的资源保障等级,并影响节点资源压力下的驱逐行为。

Kubernetes 主要有三个 QoS 等级:

  1. Guaranteed
  2. Burstable
  3. BestEffort

1. Guaranteed:最高保障等级#

满足以下条件:

  • Pod 中每个容器都设置 CPU Requests 和 Limits。
  • Pod 中每个容器都设置 Memory Requests 和 Limits。
  • 每个容器的 CPU Requests 等于 CPU Limits。
  • 每个容器的 Memory Requests 等于 Memory Limits。

例如:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
containers:
- name: app
image: nginx:1.27
resources:
requests:
cpu: "1"
memory: "512Mi"
limits:
cpu: "1"
memory: "512Mi"

这里:

PRTCL // TEXT
CPU Requests = CPU Limits
Memory Requests = Memory Limits

因此:

Guaranteed

2. Burstable:弹性资源等级#

只要 Pod 不满足 Guaranteed,并且至少一个容器设置了 CPU 或 Memory 的 Requests 或 Limits,就属于 Burstable。

例如:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: burstable-pod
spec:
containers:
- name: app
image: nginx:1.27
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "1"
memory: "512Mi"

这里:

PRTCL // TEXT
CPU Requests:500m
CPU Limits:1
PRTCL // TEXT
Memory Requests:256Mi
Memory Limits:512Mi

Requests 和 Limits 不相等。

因此:

Burstable

3. BestEffort:最低保障等级#

如果 Pod 中所有容器都没有设置 CPU 和 Memory 的 Requests、Limits,则属于 BestEffort。

例如:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: besteffort-pod
spec:
containers:
- name: app
image: nginx:1.27

没有设置 CPU 和 Memory 资源配置。

因此:

BestEffort

4. 三种 QoS 对比#

QoS资源配置优先级
Guaranteed所有容器 CPU、Memory 的 Requests=Limits最高
Burstable有部分资源请求或限制,但不满足 Guaranteed中间
BestEffort没有 CPU、Memory Requests 和 Limits最低

注意:QoS 不是调度优先级,也不是 CPU 使用优先级的简单排序。它主要参与资源压力下的驱逐决策。

Guaranteed 不意味着绝对不会被 OOM 终止,也不意味着拥有独占 CPU;它是 Kubernetes QoS 分类的一部分。

9. QoS 与节点驱逐机制#

这是 CKA 非常重要的考点。

假设:

Node-1 的内存总量为 8Gi。

现在有三个 Pod:

PodQoS内存 Requests实际使用
Pod-AGuaranteed1Gi1.5Gi
Pod-BBurstable1Gi2Gi
Pod-CBestEffort无1Gi

此时节点内存不足。

Kubelet 需要进行节点压力驱逐(Node-pressure Eviction)。

一般来说,驱逐优先级会考虑:

  1. Pod 是否超过 Requests。
  2. Pod 的 Priority。
  3. Pod 相对于 Requests 的资源使用情况。

QoS 类别也会影响整体驱逐顺序。

1. 驱逐的大致顺序#

在其他条件相同的情况下,可以这样理解:

flowchart TB
    N0["BestEffort"]
    N1["Burstable(超出 Requests 的 Pod)"]
    N2["Guaranteed"]
    N0 --> N1
    N1 --> N2

但要注意:

不能简单认为所有 BestEffort 一定先于所有 Burstable,也不能认为 Guaranteed 绝对不会被驱逐。

实际驱逐还会受到 Pod Priority、资源超出 Requests 的程度等因素影响。

2. 节点内存压力#

例如:

PRTCL // TEXT
Node-1
总内存:8Gi
实际使用:7.8Gi

继续运行新任务可能导致节点不稳定。

Kubelet 会根据节点资源压力和驱逐阈值进行处理。

查看:

PRTCL // BASH
Terminal window
kubectl describe node worker-1

关注:

PRTCL // TEXT
Conditions:
MemoryPressure

如果:

PRTCL // TEXT
MemoryPressure=True

说明节点存在内存压力。

节点还可能被添加:

PRTCL // TEXT
node.kubernetes.io/memory-pressure

污点,从而影响新 Pod 的调度。

3. Eviction 与 OOMKilled 的区别#

这是一个非常容易混淆的知识点。

对比EvictionOOMKilled
执行主体KubeletLinux 内核 OOM Killer
触发原因节点资源压力进程或容器内存超限等 OOM 情况
作用范围Pod进程 / 容器
结果Pod 被驱逐进程被终止
常见状态EvictedOOMKilled

简单理解:

  • Eviction:Kubernetes 主动驱逐 Pod。
  • OOMKilled:Linux 内核终止进程。

10. Requests 与 Limits 对调度的影响#

假设:

Node-1:

PRTCL // TEXT
CPU Allocatable:8 核
Memory Allocatable:16Gi
已分配 CPU Requests:7 核
已分配 Memory Requests:14Gi

现在创建一个 Pod:

PRTCL // YAML
resources:
requests:
cpu: "2"
memory: "4Gi"

会发生什么?

计算:

PRTCL // TEXT
CPU 剩余可分配:8 - 7 = 1 核
Memory 剩余可分配:16 - 14 = 2Gi

Pod 需要:

PRTCL // TEXT
CPU:2 核
Memory:4Gi

因此 Node-1 无法满足要求。

即使实际 CPU 使用率只有 10%,Memory 使用率只有 30%,也不代表能够调度成功。

1. Requests 与节点资源计算#

Scheduler 主要检查:

[ 可分配资源-已分配 Requests ]

是否满足新 Pod 的资源请求。

例如:

资源Allocatable已分配 Requests剩余
CPU8 核7 核1 核
Memory16Gi14Gi2Gi

Pod 需要:

资源Requests
CPU2 核
Memory4Gi

结果:

无法调度

2. 查看节点资源分配#

查看节点资源:

PRTCL // BASH
Terminal window
kubectl describe node worker-1

找到:

PRTCL // TEXT
Capacity:
cpu: 8
memory: 16Gi
Allocatable:
cpu: 7800m
memory: 15Gi
Allocated resources:
Resource Requests
cpu 7000m
memory 14Gi

这里需要区分:

  • Capacity:节点总资源。
  • Allocatable:Kubernetes 可分配资源。
  • Allocated resources:已经分配给 Pod 的资源请求和限制汇总。

为什么 Allocatable 比 Capacity 小?

因为节点需要预留资源给:

  • 操作系统。
  • kubelet。
  • 容器运行时。
  • Kubernetes 系统组件。
  • 节点级守护进程。

3. Pod 没有设置 Requests 会怎样?#

例如:

PRTCL // YAML
containers:
- name: nginx
image: nginx

默认情况下:

如果没有设置 Requests,Scheduler 通常按照 0 资源请求处理该容器的 CPU 和内存。

但是需要注意一个重要规则:

如果只设置了 Limit,没有设置 Request,而且没有其他机制覆盖,那么 Kubernetes 通常会将对应资源的 Limit 自动复制为 Request。

例如:

PRTCL // YAML
resources:
limits:
cpu: "1"
memory: "512Mi"

通常会得到:

PRTCL // YAML
resources:
requests:
cpu: "1"
memory: "512Mi"
limits:
cpu: "1"
memory: "512Mi"

因此该容器在这种情况下满足 Guaranteed 资源配置条件(前提是 Pod 中其他容器也满足)。

这也是 CKA 容易考查的细节。

11. LimitRange:命名空间资源默认限制#

现在考虑一个生产问题:

假设一个 Namespace 中有 100 个开发人员,每个人都可以创建 Pod。

如果有人创建 Pod 时完全不配置 Requests 和 Limits,会有什么问题?

  • Pod 资源请求不可预测。
  • 容器可能过度占用节点资源。
  • 难以进行资源规划。
  • 资源分配不规范。

Kubernetes 提供了 LimitRange。

1. 什么是 LimitRange?#

LimitRange 用于限制一个 Namespace 内的单个 Pod 或 Container 的资源配置。

它可以设置:

  1. 默认 Requests。
  2. 默认 Limits。
  3. 最小资源请求。
  4. 最大资源限制。
  5. Requests 与 Limits 的比例约束。

注意:

LimitRange 管理的是单个 Pod 或 Container 的资源范围,不是整个 Namespace 的总资源配额。

2. 设置默认资源#

创建:

PRTCL // YAML
apiVersion: v1
kind: LimitRange
metadata:
name: resource-limits
namespace: default
spec:
limits:
- type: Container
default:
cpu: "1"
memory: "512Mi"
defaultRequest:
cpu: "500m"
memory: "256Mi"

解释:

参数含义
type限制对象类型
default默认 Limits
defaultRequest默认 Requests

当用户创建没有资源配置的容器时,LimitRange 可以自动补充默认资源。

例如创建:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.27

检查:

PRTCL // BASH
Terminal window
kubectl get pod nginx -o yaml

可能看到:

PRTCL // YAML
resources:
requests:
cpu: 500m
memory: 256Mi
limits:
cpu: "1"
memory: 512Mi

3. 设置最大与最小资源#

例如:

PRTCL // YAML
apiVersion: v1
kind: LimitRange
metadata:
name: container-range
spec:
limits:
- type: Container
min:
cpu: "100m"
memory: "128Mi"
max:
cpu: "2"
memory: "2Gi"

含义:

PRTCL // TEXT
CPU 最小:100m
CPU 最大:2 核
内存最小:128Mi
内存最大:2Gi

如果创建的容器超过最大限制,就可能被 API Server 拒绝。

4. 设置 Requests 与 Limits 比例#

还可以设置:

PRTCL // YAML
maxLimitRequestRatio:
cpu: "4"
memory: "2"

例如:

PRTCL // TEXT
CPU Limits / CPU Requests ≤ 4
Memory Limits / Memory Requests ≤ 2

这样可以防止用户申请很小的 Requests,却设置特别大的 Limits。

5. 查看 LimitRange#

PRTCL // BASH
Terminal window
kubectl get limitrange

查看详细配置:

PRTCL // BASH
Terminal window
kubectl describe limitrange resource-limits

12. ResourceQuota:命名空间资源配额#

LimitRange 解决的是单个 Pod 或 Container 的资源限制。

但还有一个问题:

假设某个 Namespace 中有 100 个 Pod,每个 Pod 都配置了:

PRTCL // YAML
requests:
cpu: "1"
memory: "1Gi"

那么整个 Namespace 可能申请:

PRTCL // TEXT
CPU:100 核
Memory:100Gi

如果集群资源不足,就可能影响其他业务。

因此 Kubernetes 提供了 ResourceQuota。

1. 什么是 ResourceQuota?#

ResourceQuota 用于限制 Namespace 范围内的资源总量。

它可以限制:

  • CPU Requests 总量。
  • CPU Limits 总量。
  • Memory Requests 总量。
  • Memory Limits 总量。
  • Pod 数量。
  • PVC 数量。
  • Service 数量。
  • Secret 数量等。

2. CPU 和 Memory 配额#

创建:

PRTCL // YAML
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: default
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "20"

解释:

参数限制
requests.cpuCPU Requests 总量最多 10 核
requests.memoryMemory Requests 总量最多 20Gi
limits.cpuCPU Limits 总量最多 20 核
limits.memoryMemory Limits 总量最多 40Gi
podsPod 数量最多 20 个

3. ResourceQuota 工作原理#

假设:

PRTCL // TEXT
Namespace:development
CPU Requests 配额:10 核
已经使用:9 核

现在创建一个 Pod:

PRTCL // YAML
resources:
requests:
cpu: "2"

那么:

PRTCL // TEXT
9 + 2 = 11 核

超过了 10 核的配额。

Kubernetes 会拒绝创建这个 Pod。

可能看到:

PRTCL // TEXT
Error from server (Forbidden):
exceeded quota

注意:

ResourceQuota 是 API 资源准入阶段的配额检查,不是 Scheduler 的节点选择检查。

4. 查看 ResourceQuota#

PRTCL // BASH
Terminal window
kubectl get resourcequota

查看详细信息:

PRTCL // BASH
Terminal window
kubectl describe resourcequota compute-quota

可能看到:

PRTCL // TEXT
Resource Used Hard
-------- ---- ----
requests.cpu 9 10
requests.memory 18Gi 20Gi
limits.cpu 15 20
limits.memory 30Gi 40Gi
pods 15 20

5. LimitRange 与 ResourceQuota 对比#

对比LimitRangeResourceQuota
作用范围单个 Pod/Container 等整个 Namespace
默认资源配置支持不支持
最小资源限制支持不支持
最大资源限制支持支持总量限制
限制 Pod 数量不负责整体数量限制支持
CPU 总量配额不负责支持
Memory 总量配额不负责支持

记忆:

  • LimitRange:限制单个对象。
  • ResourceQuota:限制整个 Namespace。

13. Ephemeral Storage:临时存储资源管理#

前面学习的 CPU 和 Memory 是最常见的资源类型。

但 Kubernetes 还有一种很重要的资源:

Ephemeral Storage(临时存储)。

例如:

容器运行时产生:

  • 日志文件。
  • 临时文件。
  • 容器可写层数据。
  • EmptyDir 临时卷数据。

这些内容可能占用节点本地磁盘空间。

如果不进行限制,某个容器可能占用大量节点磁盘,导致节点出现 DiskPressure。

1. 配置临时存储 Requests 和 Limits#

例如:

PRTCL // YAML
apiVersion: v1
kind: Pod
metadata:
name: storage-demo
spec:
containers:
- name: app
image: busybox:1.36
command:
- sh
- -c
- "sleep 3600"
resources:
requests:
ephemeral-storage: "1Gi"
limits:
ephemeral-storage: "2Gi"

含义:

PRTCL // TEXT
临时存储请求:1Gi
临时存储上限:2Gi

2. 临时存储使用场景#

类型作用
容器可写层保存容器运行期间产生的数据
容器日志保存容器标准输出日志等
EmptyDirPod 生命周期内的临时数据
临时文件程序处理过程中的中间文件

注意:

Ephemeral Storage 不适合保存需要长期保留的数据。

Pod 删除后,关联的 EmptyDir 数据也会被删除。

如果业务需要持久化数据,应该使用 PV/PVC 等持久化存储机制。

3. 查看节点磁盘压力#

PRTCL // BASH
Terminal window
kubectl describe node worker-1

关注:

PRTCL // TEXT
DiskPressure

如果出现:

PRTCL // TEXT
DiskPressure=True

说明节点存在磁盘资源压力。

进一步检查:

PRTCL // BASH
Terminal window
df -h

查看磁盘使用情况:

PRTCL // BASH
Terminal window
du -sh /var/lib/containerd

具体路径取决于容器运行时配置。

14. 本节必须掌握的命令#

操作命令
查看 Pod 资源使用kubectl top pods
查看节点资源使用kubectl top nodes
查看 Pod 资源配置kubectl describe pod nginx
查看节点资源分配kubectl describe node worker-1
查看 LimitRangekubectl get limitrange -A
查看 ResourceQuotakubectl get resourcequota -A
查看配额详情kubectl describe quota
查看 Pod QoSkubectl get pod nginx -o jsonpath='{.status.qosClass}'
查看容器上次退出原因kubectl describe pod nginx
查看容器上次运行日志kubectl logs nginx --previous

注意:kubectl top 需要 Metrics Server 正常运行。

15. 本节知识体系总结#

Kubernetes 资源管理体系

Pod Resource Management 容器资源管理

Requests 资源请求,参与调度

Limits 运行时资源上限

QoS 资源保障等级

Eviction 节点资源压力驱逐

LimitRange 单个对象资源约束

ResourceQuota Namespace 总量配额

核心概念对照

概念关键作用
CPU Requests调度资源需求
CPU LimitsCPU 限流
Memory Requests调度内存需求
Memory Limits内存上限
Guaranteed最高 QoS 等级
Burstable弹性 QoS 等级
BestEffort最低 QoS 等级
OOMKilled内存 OOM 终止
EvictionKubelet 驱逐 Pod
LimitRange单对象资源限制
ResourceQuotaNamespace 总量限制
归档于 2026.10.20
// 档案结束
Classified
章节_06
协议编号: CC-BY-NC-SA-4.0

Pod 资源管理

作者:Chavy发布日期:2026.10.20

基于 CC BY-NC-SA 4.0

© 2026 Chavy
Powered by Astro