如何在Pod内部获取CPU核心数及CPU请求/限制(无需kubectl)
你可以通过两种方式获取Pod内的CPU核心相关信息:
获取容器可见的CPU核心数量:
直接读取/proc/cpuinfo文件统计核心数,执行以下命令:grep -c processor /proc/cpuinfo这个结果对应Pod能访问的CPU核心数——如果Kubernetes为Pod配置了CPU绑定(cpuset),返回的就是分配给Pod的核心数;未绑定的话,返回的是节点的总CPU核心数。
获取Kubernetes分配的CPU配额(核心数形式):
这部分属于CPU请求/限制的范畴,具体方法参考问题2的解答。
有两种可靠的方法可以在Pod内部直接获取CPU请求和限制,无需依赖kubectl:
方法1:使用Kubernetes Downward API注入信息
Downward API可以将Pod的资源请求/限制注入到容器的环境变量或文件中,这是官方推荐的方式。
方式A:注入为环境变量
在Pod的YAML定义中添加环境变量配置,将CPU请求和限制注入:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: nginx resources: requests: cpu: "0.5" limits: cpu: "1" env: - name: CPU_REQUEST valueFrom: resourceFieldRef: containerName: test-container resource: requests.cpu - name: CPU_LIMIT valueFrom: resourceFieldRef: containerName: test-container resource: limits.cpu
部署Pod后,在容器内直接读取环境变量即可:
echo $CPU_REQUEST # 输出 0.5 echo $CPU_LIMIT # 输出 1
方式B:挂载为文件
将资源信息挂载到容器内的文件中,适合需要以文件形式读取的场景:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: volumes: - name: resource-info downwardAPI: items: - path: cpu_request resourceFieldRef: containerName: test-container resource: requests.cpu - path: cpu_limit resourceFieldRef: containerName: test-container resource: limits.cpu containers: - name: test-container image: nginx resources: requests: cpu: "0.5" limits: cpu: "1" volumeMounts: - name: resource-info mountPath: /etc/resource-info
在容器内读取文件内容:
cat /etc/resource-info/cpu_request # 输出 0.5 cat /etc/resource-info/cpu_limit # 输出 1
方法2:读取Cgroup文件
如果无法修改Pod定义,可以通过读取Cgroup文件来计算CPU限制(注意Cgroup版本会影响文件路径):
Cgroup v1
CPU限制可以通过cpu.cfs_quota_us和cpu.cfs_period_us计算:
# 获取配额和周期值 QUOTA=$(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us) PERIOD=$(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us) # 计算CPU限制(核心数) echo "scale=2; $QUOTA / $PERIOD" | bc
如果QUOTA值为-1,表示没有设置CPU限制。
CPU请求对应cpu.shares,但该值是相对权重(默认1024),需要结合节点上其他Pod的shares总和才能计算实际请求,因此准确性较差,不推荐单独使用。
Cgroup v2
路径有所不同,CPU限制的计算方式类似:
QUOTA=$(cat /sys/fs/cgroup/cpu.max | awk '{print $1}') PERIOD=$(cat /sys/fs/cgroup/cpu.max | awk '{print $2}') echo "scale=2; $QUOTA / $PERIOD" | bc
若QUOTA为max,表示无CPU限制。
内容的提问来源于stack exchange,提问作者Artavazd Balayan

