Kubernetes v1.6.7 CPU资源限制不生效问题咨询
嘿,针对你在Kubernetes v1.6.7集群里遇到的Pod无视CPU限制的问题,我结合这个老版本的特性整理了几个关键检查点,应该能帮你定位原因:
1. 检查kubelet的--enforce-node-allocatable参数
在v1.6这个早期版本里,kubelet默认可能没完全启用Pod资源限制的强制约束。你得确保kubelet启动参数里包含:
--enforce-node-allocatable=pods
这个参数是让kubelet硬限制Pod资源使用的关键,如果没设置,Pod就可能随心所欲占用CPU。
你可以用下面的命令查看当前kubelet的启动参数:
ps aux | grep kubelet
要是没看到这个参数,就去修改kubelet的配置文件(一般在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf这类路径),加上这个参数后重启kubelet:
systemctl daemon-reload systemctl restart kubelet
2. 确认节点cgroup CPU子系统正常挂载
Debian 8.7的3.16内核默认支持cgroup,但得确认CPU子系统已经正确挂载:
mount | grep cpu
正常情况下你会看到类似cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu)的输出。要是没挂载,得手动挂载或者检查系统的cgroup配置。
3. 检查Pod的QoS类别
如果你的Deployment只设了CPU limits却没设requests,Pod会被归为BestEffort QoS类别——这种情况下Kubernetes根本不会强制限制CPU使用!你得确保Pod模板里同时配置requests.cpu和limits.cpu,比如:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: example-deployment spec: replicas: 1 template: metadata: labels: app: example spec: containers: - name: example-container image: nginx resources: requests: cpu: "100m" limits: cpu: "200m"
当requests和limits相等时,Pod会进入Guaranteed QoS类别,Kubernetes会严格执行CPU限制;就算requests小于limits,Burstable类别也会限制CPU的最大使用量。
4. 检查kubelet的--cpu-cfs-quota参数
v1.6里kubelet默认应该启用了CPU CFS配额(这是实现CPU限制的核心机制),但你还是得确认下启动参数里是不是--cpu-cfs-quota=true(默认是true,但万一被手动改成false就失效了)。同样用ps aux | grep kubelet查看,要是设成false,改回来重启kubelet就行。
额外提一句
Kubernetes v1.6.7确实太老了,早就不在官方支持范围内了,后续版本对资源管理做了超多优化和改进。如果条件允许,建议你升级到新的稳定版本,不仅能解决这类问题,安全性也能提升不少。
内容的提问来源于stack exchange,提问作者matth3o

