在Kubernetes集群中运行容器时,资源限制是保证系统稳定性的第一道防线。去年我们生产环境就发生过一起典型事故:某个Java应用Pod因内存泄漏不断吞噬节点内存,最终导致整台Node崩溃,连带影响了20多个业务Pod。这种"雪崩效应"正是缺乏资源限制导致的。
资源限制主要解决三大问题:
内存配置看似简单,但存在多个易错点:
yaml复制resources:
limits:
memory: "1Gi" # 硬限制,超过即OOM Kill
requests:
memory: "512Mi" # 调度保证值
关键细节:
-XX:MaxRAMPercentage匹配limit经验:内存limit建议设置为request的1.5-2倍,给JVM留出GC空间
CPU相比内存有两个重要差异:
yaml复制resources:
limits:
cpu: "2" # 2核=2000m
requests:
cpu: "500m" # 0.5核
实测案例:当设置limit=1000m时,容器每100ms周期内最多使用100ms CPU时间。
通过Burstable QoS实现资源弹性:
yaml复制resources:
limits:
cpu: "2"
memory: "2Gi"
requests:
cpu: "500m"
memory: "512Mi"
此时:
对于GPU等特殊设备:
yaml复制resources:
limits:
nvidia.com/gpu: 1
关键步骤:
当容器被OOM Killer终止时:
bash复制journalctl -u kubelet | grep -i oom
dmesg查看内核日志通过kubectl describe pod查看:
code复制Containers:
myapp:
State: Running
Last State: Terminated
Reason: OOMKilled
典型限流特征:
推荐监控组合:
关键指标看板:
对于Java应用最佳实践:
-XX:MaxRAMPercentage=75%limit >= request * 1.5对于CPU密集型应用:
通过LimitRange设置全局默认值:
yaml复制apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
spec:
limits:
- default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "100m"
memory: "128Mi"
type: Container
这能有效防止以下问题: