✪ ~本文是小编的第 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 核 CPUmemory: 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




