Kubernetes中Pod无法获取独占CPU核心问题排查求助
问题描述
我在Kubernetes集群的myNode节点上为kubelet配置了static CPU Manager策略,启动参数为--cpu-manager-policy=static和--reserved-cpus=1(确保kubelet独占1核),参考官方文档配置。
查看kubelet的CPU管理器状态文件:
cat /var/lib/kubelet/cpu_manager_state {"policyName":"static","defaultCpuSet":"0-3","checksum":611748604}
状态显示正常。随后启动了如下Pod:
apiVersion: v1 kind: Pod metadata: name: wl labels: app: wl spec: containers: - name: wl image: docker.io/polinux/stress:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c"] args: ["echo 'workload' && stress --cpu 4"] resources: requests: cpu: 1 limits: cpu: 1 nodeName: myNode
Pod成功调度到myNode节点。通过ps命令查看进程:
ps aux | grep stress root 2966141 0.2 0.0 780 4 ? Ss 10:54 0:00 stress --cpu 4 root 2966154 27.1 0.0 780 36 ? R 10:54 0:02 stress --cpu 4 root 2966155 26.7 0.0 780 36 ? R 10:54 0:02 stress --cpu 4 root 2966156 28.6 0.0 780 36 ? R 10:54 0:02 stress --cpu 4 root 2966157 27.3 0.0 780 36 ? R 10:54 0:02 stress --cpu 4
再查看进程运行的CPU:
ps -o pid,psr,comm -p 2966154 2966155 2966156 2966157 PID PSR COMMAND 2966154 0 stress 2966155 1 stress 2966156 2 stress 2966157 3 stress
可见4个stress线程分别运行在不同CPU上。我原本预期Pod会启动失败,因为它仅被允许使用1核,而stress --cpu 4需要4个线程。默认策略下此行为正常,但我已配置static策略,请问问题出在哪里?
问题分析与解答
- Static CPU Manager策略的核心作用:该策略仅负责为满足条件的容器(CPU请求和限制为整数核且值≥1)分配独占的物理CPU核心,避免容器间的CPU争抢,但它不会限制容器创建线程的数量。
- CPU限制的实现方式:Kubernetes的CPU限制是通过Linux CFS(完全公平调度器)配额实现的,即通过
cpu.cfs_quota_us和cpu.cfs_period_us参数限制容器的总CPU时间占比。即使容器创建4个线程,这些线程的总CPU使用率会被限制在1核的额度内(比如每个线程只能获得约25%的CPU时间),但线程本身可以被调度到不同核心上运行(如果没有绑定独占核心的话)。 - Pod启动失败的触发条件:Static策略不会因为容器创建的线程数超过CPU限制而拒绝Pod启动。只有当节点没有足够的可分配独占CPU核心时,才会导致Pod调度失败(例如请求2核,但节点剩余可分配的独占核心不足2个)。
- 当前配置的异常点:从
cpu_manager_state的defaultCpuSet":"0-3"来看,节点总共有4个核心,但你配置了--reserved-cpus=1,理论上预留的核心应该被排除在defaultCpuSet之外。这说明kubelet参数修改后可能未重启,或者预留核心的配置未生效,导致容器线程仍能在所有核心上调度。即使预留核心生效,容器创建多线程的行为也不会被阻止,只是线程会被限制在分配的1个独占核心上运行。
内容的提问来源于stack exchange,提问作者Wolfson
相关产品推荐
相关产品推荐

