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

Kubernetes单节点110 Pod隐藏限制排查求助

单节点运行超过110个Pod的排查思路

我之前在原生Kubernetes、OpenShift和AWS EKS环境里都碰到过类似的Pod Pending问题——明明节点CPU、内存、磁盘都充足,也调大了pod_limit,但到110个左右新Pod就卡壳,日志里只有分配节点成功的信息,完全没其他报错。结合我的排查经验,给你几个方向逐一验证:

1. 容器运行时的容器总数限制

这是最容易被忽略的点:Kubernetes的maxPods只是kubelet层面的限制,容器运行时本身可能有最大容器数量的限制。比如containerd默认的max_container_count是100(不同版本略有差异),如果每个Pod至少包含1个容器,当容器总数接近这个值时,新Pod就会卡在Pending状态,且不会有明确报错。

你可以快速查看containerd的配置:

crictl info | grep max_container_count

如果数值确实接近110,修改containerd的config.toml(通常在/etc/containerd/config.toml),找到[plugins."io.containerd.grpc.v1.cri"]下的max_container_count,调大到合适值(比如200),然后重启服务:

systemctl restart containerd

2. 节点网络相关限制

端口资源耗尽

每个Pod的容器会占用主机端口资源(比如kube-proxy的iptables转发、CNI插件的端口分配),当可用端口耗尽时,新Pod无法完成网络配置,就会一直Pending。

  • 查看当前已使用的端口数:
ss -tulpn | wc -l
  • 检查节点的本地端口范围:
sysctl net.ipv4.ip_local_port_range

默认范围是32768 60999,大概28000个可用端口,理论上足够,但如果有其他服务占用大量端口,就可能出现不足。

iptables/连接跟踪限制

Pod数量过多时,iptables规则数会急剧增加,内核的连接跟踪表(nf_conntrack)也可能被占满,导致网络配置失败。

  • 查看当前iptables规则数量:
iptables-save | wc -l
  • 检查连接跟踪最大值:
sysctl net.netfilter.nf_conntrack_max

如果值太小,临时调大并永久生效:

sysctl -w net.netfilter.nf_conntrack_max=131072
echo "net.netfilter.nf_conntrack_max=131072" >> /etc/sysctl.conf

3. AWS EKS专属排查点

如果是EKS环境,重点关注AWS VPC CNI插件的配置:

  • 检查是否启用前缀委托(Prefix Delegation):这是EKS运行大量Pod的必要配置,否则每个弹性网卡只能分配有限的辅助IP,很快就会耗尽。查看aws-node DaemonSet的环境变量:
kubectl describe daemonset aws-node -n kube-system | grep ENABLE_PREFIX_DELEGATION

如果值不是true,需要修改CNI配置启用该功能。

  • 检查节点弹性网卡数量是否达上限:不同EC2实例类型支持的最大ENI数不同,比如m5.xlarge最多支持4个ENI,每个ENI通过前缀委托可分配/28的CIDR(16个IP),总共有64个IP。如果实例类型ENI上限太低,也会限制Pod数量。

4. 内核进程数限制

每个容器本质是一个进程,节点内核有最大进程数限制(kernel.pid_max),如果进程总数接近这个值,新容器无法创建,Pod就会Pending。

  • 查看当前内核进程数限制:
sysctl kernel.pid_max

默认值是32768,一般足够,但如果节点运行大量其他进程,或每个Pod包含多个容器,可能会接近上限。临时调大并永久生效:

sysctl -w kernel.pid_max=65536
echo "kernel.pid_max=65536" >> /etc/sysctl.conf

5. kubelet的隐性资源预留

虽然你说资源充足,但还是建议检查kubelet的kubeReserved和systemReserved配置——如果这部分预留过高,实际可分配给Pod的资源可能比你看到的少。通过kubectl describe node <node-name>查看Allocatable部分的CPU、内存数值,确认剩余资源是否真的充足。


我当时碰到的情况就是containerd的max_container_count默认是100,调大到200后就能运行150+个Pod了。另外要注意:max_container_count是容器总数,不是Pod数,如果你的Pod平均有2个容器,110个Pod就是220个容器,很容易触发限制。

内容的提问来源于stack exchange,提问作者Stanislav Ogarkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:22