Kubernetes 资源治理
Requests、Limits、ResourceQuota、LimitRange、Namespace 隔离和资源不足排查。
Kubernetes 资源治理
资源治理用于控制应用资源占用、保障集群稳定性,并让调度器做出更可靠的节点选择。核心对象包括 requests、limits、ResourceQuota 和 LimitRange。
Requests 与 Limits
# 容器资源配置。
resources:
# requests 用于调度时预留资源。
requests:
# 申请 0.2 核 CPU。
cpu: 200m
# 申请 256Mi 内存。
memory: 256Mi
# limits 用于限制容器运行时最大资源。
limits:
# 最多使用 1 核 CPU。
cpu: "1"
# 最多使用 512Mi 内存,超过可能 OOMKilled。
memory: 512Mi
| 字段 | 作用 |
|---|---|
requests.cpu | 调度时预留 CPU,影响 Pod 能否被调度 |
requests.memory | 调度时预留内存,影响 Pod 能否被调度 |
limits.cpu | 运行期 CPU 上限,可能触发限流 |
limits.memory | 运行期内存上限,超过后可能 OOMKilled |
CPU 单位:
1000m = 1 core
500m = 0.5 core
内存单位:
Mi = mebibytes
Gi = gibibytes
QoS 等级
| QoS | 条件 | 说明 |
|---|---|---|
| Guaranteed | 每个容器 CPU 和内存 request 等于 limit | 资源保障最高 |
| Burstable | 至少一个容器设置 request 或 limit | 常见业务默认选择 |
| BestEffort | 未设置任何 request / limit | 资源紧张时最容易被驱逐 |
查看 QoS:
kubectl get pod <pod-name> -n default -o jsonpath='{.status.qosClass}'
ResourceQuota
ResourceQuota 限制命名空间资源总量。
# API 版本。ResourceQuota 是核心资源,使用 v1。
apiVersion: v1
# 资源类型。这里表示创建 ResourceQuota。
kind: ResourceQuota
metadata:
# ResourceQuota 名称。
name: team-a-quota
# 生效的命名空间。
namespace: team-a
spec:
# hard 定义命名空间内资源使用上限。
hard:
# 所有 Pod 的 CPU requests 总和不能超过 20 核。
requests.cpu: "20"
# 所有 Pod 的内存 requests 总和不能超过 40Gi。
requests.memory: 40Gi
# 所有 Pod 的 CPU limits 总和不能超过 40 核。
limits.cpu: "40"
# 所有 Pod 的内存 limits 总和不能超过 80Gi。
limits.memory: 80Gi
# 命名空间内最多允许 100 个 Pod。
pods: "100"
# 命名空间内最多允许 20 个 Service。
services: "20"
查看:
kubectl get resourcequota -n team-a
kubectl describe resourcequota team-a-quota -n team-a
LimitRange
LimitRange 为命名空间设置默认 requests / limits,并限制单个容器范围。
# API 版本。LimitRange 是核心资源,使用 v1。
apiVersion: v1
# 资源类型。这里表示创建 LimitRange。
kind: LimitRange
metadata:
# LimitRange 名称。
name: default-limits
# 生效的命名空间。
namespace: team-a
spec:
# 限制规则列表。
limits:
# Container 表示规则作用于单个容器。
- type: Container
# 未显式配置 requests 时自动填充的默认 requests。
defaultRequest:
# 默认申请 0.1 核 CPU。
cpu: 100m
# 默认申请 128Mi 内存。
memory: 128Mi
# 未显式配置 limits 时自动填充的默认 limits。
default:
# 默认 CPU 上限 1 核。
cpu: "1"
# 默认内存上限 512Mi。
memory: 512Mi
# 单个容器允许设置的最大值。
max:
cpu: "2"
memory: 2Gi
# 单个容器允许设置的最小值。
min:
cpu: 50m
memory: 64Mi
Namespace 隔离
多团队集群建议每个团队或环境使用独立 Namespace:
kubectl create namespace team-a
kubectl label namespace team-a owner=team-a env=prod
建议每个 Namespace 至少配置:
- ResourceQuota。
- LimitRange。
- RBAC RoleBinding。
- NetworkPolicy。
- 监控和告警标签。
资源不足排查
Pod Pending:
kubectl describe pod <pod-name> -n default
kubectl get events -n default --sort-by='.lastTimestamp'
kubectl top nodes
kubectl describe node <node-name>
常见事件:
Insufficient cpu
Insufficient memory
Too many pods
处理方式:
- 降低不合理 requests。
- 扩容节点。
- 清理异常或闲置工作负载。
- 拆分大 Pod。
- 检查节点污点、亲和性和拓扑约束。
OOMKilled 排查
kubectl describe pod <pod-name> -n default
kubectl logs <pod-name> -n default --previous
kubectl top pod <pod-name> -n default --containers
处理建议:
- 确认应用是否内存泄漏。
- 调整运行时参数,例如 JVM heap。
- 提高 memory limit。
- 拆分任务或降低并发。
- 为关键服务设置合理 request,避免资源争抢。
建议基线
| 类型 | 建议 |
|---|---|
| Web API | 设置 CPU / Memory requests,memory limit 不要过低 |
| Worker | 按并发和任务大小设置内存,避免大任务 OOM |
| Java 应用 | JVM 最大堆要小于容器 memory limit |
| BestEffort Pod | 只允许测试或临时调试使用 |
| 生产 Namespace | 必须配置 ResourceQuota 和 LimitRange |