资源限制 #

一、资源限制概述 #

Kubernetes通过资源限制机制管理计算资源,确保应用获得必要资源并防止资源滥用。

1.1 资源类型 #

text
资源类型
    │
    ├── CPU
    │   ├── 单位:m (millicore)
    │   └── 1000m = 1 CPU
    │
    └── 内存
        ├── 单位:Ki, Mi, Gi
        └── 二进制单位

1.2 资源配置 #

配置 说明
requests 最小资源保证
limits 最大资源限制

二、Requests和Limits #

2.1 基本配置 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi

2.2 Requests说明 #

text
Requests作用
    │
    ├── 调度依据
    │   └── 节点必须有足够可用资源
    │
    ├── 资源预留
    │   └── 为容器预留资源
    │
    └── 最小保证
        └── 容器至少获得的资源

2.3 Limits说明 #

text
Limits作用
    │
    ├── 资源上限
    │   └── 容器最多使用的资源
    │
    ├── CPU限制
    │   └── 通过CFS quota限制
    │
    └── 内存限制
        └── 超过限制会被OOMKilled

2.4 多容器Pod #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: multi-container
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
  - name: sidecar
    image: busybox
    resources:
      requests:
        cpu: 50m
        memory: 64Mi
      limits:
        cpu: 100m
        memory: 128Mi

三、QoS等级 #

3.1 QoS分类 #

等级 条件 优先级
Guaranteed requests = limits 最高
Burstable requests < limits 中等
BestEffort 无requests/limits 最低

3.2 Guaranteed #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: guaranteed-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: 200m
        memory: 256Mi
      limits:
        cpu: 200m
        memory: 256Mi

3.3 Burstable #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: burstable-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi

3.4 BestEffort #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: besteffort-pod
spec:
  containers:
  - name: app
    image: nginx

3.5 QoS影响 #

text
资源压力时行为
    │
    ├── 内存不足
    │   ├── BestEffort优先驱逐
    │   ├── Burstable次之
    │   └── Guaranteed最后
    │
    └── CPU压力
        ├── 按requests比例分配
        └── 超过limits会被限制

四、LimitRange #

4.1 创建LimitRange #

yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
  namespace: default
spec:
  limits:
  - type: Container
    default:
      cpu: 200m
      memory: 256Mi
    defaultRequest:
      cpu: 100m
      memory: 128Mi
    min:
      cpu: 50m
      memory: 64Mi
    max:
      cpu: 1
      memory: 1Gi
    maxLimitRequestRatio:
      cpu: 2
      memory: 2

4.2 LimitRange类型 #

类型 说明
Container 容器级别限制
Pod Pod级别限制
PersistentVolumeClaim PVC限制

4.3 查看LimitRange #

bash
# 查看LimitRange
kubectl get limitrange

# 查看详情
kubectl describe limitrange resource-limits

五、ResourceQuota #

5.1 创建ResourceQuota #

yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: development
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "10"
    services: "5"
    secrets: "10"
    configmaps: "10"
    persistentvolumeclaims: "5"

5.2 ResourceQuota作用域 #

yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: scoped-quota
spec:
  hard:
    pods: "4"
  scopes:
  - Terminating
作用域 说明
Terminating 有activeDeadlineSeconds的Pod
NotTerminating 无activeDeadlineSeconds的Pod
BestEffort 无资源请求的Pod
NotBestEffort 有资源请求的Pod

5.3 查看ResourceQuota #

bash
# 查看ResourceQuota
kubectl get resourcequota

# 查看详情
kubectl describe resourcequota compute-quota

六、资源监控 #

6.1 查看资源使用 #

bash
# 查看节点资源
kubectl top nodes

# 查看Pod资源
kubectl top pods

# 查看指定命名空间
kubectl top pods -n kube-system

# 查看容器资源
kubectl top pod <pod-name> --containers

6.2 查看资源配置 #

bash
# 查看Pod资源配置
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources}'

# 查看节点可分配资源
kubectl describe node <node-name> | grep -A 5 "Allocated resources"

七、实际应用示例 #

7.1 生产级资源配置 #

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.25
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi

7.2 数据库资源配置 #

yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 1
  template:
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1
            memory: 1Gi

八、最佳实践 #

8.1 资源配置建议 #

text
资源配置原则
    │
    ├── 设置requests和limits
    │   └── 避免BestEffort
    │
    ├── 合理设置比例
    │   └── limits/requests ≤ 2
    │
    ├── 基于监控调整
    │   └── 根据实际使用调整
    │
    └── 不同环境不同配置
        ├── 开发:较低资源
        └── 生产:充足资源

8.2 资源规划 #

环境 CPU Requests CPU Limits Memory Requests Memory Limits
开发 50m 100m 64Mi 128Mi
测试 100m 200m 128Mi 256Mi
生产 200m 500m 256Mi 512Mi

九、故障排查 #

9.1 常见问题 #

bash
# 查看Pod状态
kubectl describe pod <pod-name>

# 查看资源使用
kubectl top pod <pod-name>

# 查看OOM事件
kubectl get events --field-selector reason=OOMKilled

# 查看节点资源
kubectl describe node <node-name>

9.2 问题诊断 #

问题 原因 解决方案
OOMKilled 内存超限 增加内存limits
CPU限流 CPU超限 增加CPU limits
调度失败 资源不足 增加节点或减少requests

十、总结 #

10.1 核心要点 #

概念 说明
Requests 最小资源保证
Limits 最大资源限制
QoS 服务质量等级
LimitRange 命名空间资源限制
ResourceQuota 命名空间资源配额

10.2 下一步 #

掌握了资源限制后,让我们学习 自动扩缩容,了解Kubernetes自动伸缩机制。

最后更新:2026-03-28