You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:35:27