资源限制 #
一、资源限制概述 #
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