暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何查看k8s Pod的CPU&内存限制—从Pod Spec到宿主机cgroup

551

✪ ~本文是小编的第 164篇文章,目标是累计输出 1000 篇优质内容,也始终提醒自己:保持学习、保持记录、保持分享,希望以下内容能给你带来一点帮助~

在 Kubernetes 中,我们通常会为容器设置 resources.requests
 和 resources.limits
,我们怎么确认容器的内存和 CPU限制和我们预设的一致呢。本文带你从 Pod Spec 到宿主机,确认容器真实的资源限制。

Pod Spec 中资源设置的含义

假设我们在Pod的spec中为容器设置了:

resources:
 requests:
   cpu: 2
   memory: 8Gi
 limits:
   cpu: 2
   memory: 8Gi

它的含义以及背后的机制如下:

requests

  • 表示 容器启动时至少需要的资源
  • Kubernetes 调度器(scheduler)会根据 requests
     来决定把 Pod 放在哪个 Node 上。
  • 示例:
    • cpu: 2
       → 调度器会认为这个容器至少需要 2 个 CPU 核
    • memory: 8Gi
       → 调度器会认为这个容器至少需要 8Gi 内存

limits

  • 表示 容器运行时允许使用的最大资源
  • Kubelet + 容器运行时会严格限制容器不能超过这个值
  • 示例:
    • cpu: 2
       → 容器最多占用 2 核 CPU
    • memory: 8Gi
       → 容器最多占用 8Gi 内存,超出会被 OOMKilled

我们知道limits设置了容器允许时允许使用的最大资源,现在有一个已运行的Pod,我想确认它的实际限制,应该怎么做?我们可以从宿主机层面查看。


查看Node层cgroup

1.检查宿主机cgoup版本

stat -fc %T sys/fs/cgroup

  • 输出 cgroup2fs
     → cgroup v2
  • 输出 tmpfs
     或 cgroup
     → cgroup v1
❝

注意cgroup v2,路径和文件名与 cgroup v1 不同。

# cgroup v1(老版本):
/sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes`

# cgroup v2(新版本,containerd/cri-o常用):  
/sys/fs/cgroup/kubepods.slice/kubepods-besteffort-pod<UID>/crio-<container-id>.scope/memory.max

2.查找Pod的container ID

crictl ps | grep pxc-product-gphz-dn-2-log-0

  • crictl
     是一个与 CRI(Container Runtime Interface) 交互的命令行工具,用来管理容器(类似 docker
    ,但适用于 containerd、CRI-O 等 runtime)。
  • 输出示例: ![[Pasted image 20250920151900.png]]
  • 记录container ID: 1819c707cebe5

3.根据container ID查看容器的内存限制:

# 单位字节
cat sys/fs/cgroup/kubepods.slice/kubepods-besteffort-pod<UID>/docker-<container-id>.scope/memory.max

可以用命令搜索:

# 搜索 memory.max 文件
$find /sys/fs/cgroup -name memory.max | grep 1819c707cebe5
/sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podecbd5dd4_d587_4817_935f_5fe7e1776a61.slice/cri-containerd-1819c707cebe56c22be4fe0a20018580ba494f297a38cc93cdc0f30780c280e0.scope/memory.max

查看memory.max文件:

cat /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podecbd5dd4_d587_4817_935f_5fe7e1776a61.slice/cri-containerd-1819c707cebe56c22be4fe0a20018580ba494f297a38cc93cdc0f30780c280e0.scope/memory.max
8589934592

  • 单位是字节,8589934592即8G。

4.查看容器的CPU限制: 相应的我们也可以查看容器的cgroup CPU限制

$cat /sys/fs/cgroup/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podecbd5dd4_d587_4817_935f_5fe7e1776a61.slice/cri-containerd-1819c707cebe56c22be4fe0a20018580ba494f297a38cc93cdc0f30780c280e0.scope/cpu.max
200000 100000

解释:
第一个200000:CFS quota: 周期内允许的CPU微秒数
第二个100000:CFS period:周期长度(微秒)
核数= quota / period = 容器允许的 CPU 核数 → 200000 / 100000 = 2 核

❝

注:max 表示没有限制。

总结

  • k8s的limits生效依赖宿主机的cgroup。
  • 设置了Pod的resource.limits,我们可以从宿主机层面查看容器的资源限制。

推荐阅读:

通过Mutating Admission Webhook方式改变pod的容忍


点个“赞 or 在看” 你最好看!

喜欢,就关注我吧!

👇👇👇 谢谢各位老板啦!!

文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论