K8s Pod管理与资源限制配置
准备工作:你需要知道的基础概念与环境
在动手配置之前,先理解两个核心术语。资源请求(requests)是Pod启动时保证获得的最低资源量,调度器会根据它选择合适的节点。资源限制(limits)是Pod允许使用的最大资源上限,超过限额的Pod可能被杀死或限流。
内存单位常用Mi(兆字节)或Gi(吉字节),CPU单位常用m(毫核,1000m=1核)。
你的环境需要满足:已部署Kubernetes集群,并且kubectl客户端已连接集群。
可以用kubectl cluster-info验证连接状态。
如果没有集群,建议使用Minikube或Kind搭建本地测试环境。
编写YAML:为Pod配置CPU与内存限制
创建一个名为nginx-limits.yaml的文件,内容如下。
这个示例定义了一个Nginx Pod,设置CPU请求为250m(即0.25核),内存请求为256Mi;
CPU限制为500m,内存限制为512Mi。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
这里的关键点:resources字段必须写在containers下。
requests和limits中的CPU和内存键值对不要写错单位。
CPU单位用m或整数(如1代表1核),内存用Mi、Gi或Ki。
保存文件后,执行kubectl apply -f nginx-limits.yaml创建Pod。
创建成功后,可以使用kubectl get pod nginx-pod查看状态,直到显示Running。
避坑指南:常见错误与注意事项
新手最常遇到的问题是Pod处于Pending状态,原因通常是节点资源不足无法满足requests。
可以用kubectl describe pod nginx-pod查看Events部分,看到“0/1 nodes are available: 1 Insufficient cpu”之类的提示。
解决方法:检查节点可用资源,或调低requests值。
另一个坑是OOMKilled(内存超出限制被杀死)。
如果Pod实际使用内存超过limits值,Pod会被终止并自动重启。
查看kubectl get pod显示Restart次数增多时,可以用kubectl logs nginx-pod --previous查看上次崩溃日志。
建议根据应用负载设置合理的limits,比requests高20%-50%即可。
注意:如果不设置requests,K8s会默认使用limits值作为requests,可能导致资源浪费或调度失败。
所以即使你只关心上限,也建议显式写出requests。
效果验证:查看Pod真实资源使用情况及验证限制
Pod运行后,用以下命令查看资源使用:
kubectl top pod nginx-pod
输出会显示CPU和内存的当前使用量。
对比你设定的requests和limits,确认Pod实际占用落在预期范围内。
为了测试内存限制是否生效,可以用一个压力工具。
例如替换容器镜像为progrium/stress,并在Pod中执行内存压力命令。
但生产环境不推荐。
更安全的方式是观察kubectl describe pod nginx-pod中的Events,如果内存超过limits会记录“OOMKilled”事件。
你也可以用kubectl edit pod nginx-pod临时调整资源数值,然后再次观察Pod行为。
注意:修改只对当前Pod生效,如果Pod被重建会恢复原配置。
常见问题解答
问:CPU限制设置后怎么感觉没效果?
答:CPU限制是通过CFS配额实现的,在单核高负载时才会明显。可以用kubectl exec进入Pod,执行cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us查看实际配额值(-1表示不限)。
问:内存限制设置得太低,Pod一直重启怎么办?
答:先调高limits,或者检查应用是否有内存泄漏。可以用kubectl logs查看日志,排除代码问题。
问:能不能动态调整正在运行的Pod资源?
答:K8s 1.19+支持InPlaceUpdate(alpha功能),但生产环境不推荐。通常建议删除并重新创建Pod,或者通过Deployment更新。
通过本文的完整步骤,你已经掌握了K8s Pod管理与资源限制配置的核心操作。
建议从简单的YAML开始,逐步调整实际生产中的资源数值,并配合监控工具(如Prometheus)长期观察。
遇到异常时,先回看避坑部分,再结合kubectl describe定位问题。