Kubernetes 资源治理

Requests、Limits、ResourceQuota、LimitRange、Namespace 隔离和资源不足排查。

Kubernetes 资源治理

资源治理用于控制应用资源占用、保障集群稳定性,并让调度器做出更可靠的节点选择。核心对象包括 requests、limits、ResourceQuota 和 LimitRange。

Kubernetes 资源治理关系图

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