AWS EKS T3.Small节点IP限制致Pod Pending问题解决方案咨询
无法仅通过kubectl修改Kubernetes原生配置直接突破t3.small实例的Pod数量上限。
你遇到的Pod数量限制不是Kubernetes层面的软约束,是EKS默认VPC CNI插件与EC2实例规格绑定的硬限制:t3.small实例最多支持挂载2块弹性网卡(ENI),单块ENI最多分配6个私有IP,扣除节点自身、CNI预留的IP后,默认模式下仅能为业务Pod提供10个左右可分配IP,实际可调度业务Pod数约7个,和你观测到的现象一致。直接修改kubelet的max-pods参数、节点可分配Pod字段只会让调度器调度超量Pod到节点,最终还是会因为无IP可分配报failed to assign an IP address to container错误,无法解决问题。
方案1:开启VPC CNI前缀委派(成本最优,无需更换实例规格)
这是官方支持的无额外成本的优化方案,原理是让CNI为ENI分配/28 IPv4前缀段(每个前缀包含16个可用IP)替代原来的单IP分配模式,t3.small实例开启后单节点可支持的业务Pod数最高可达110个,完全满足低资源消耗小Pod的部署需求。
操作步骤:
- 编辑kube-system命名空间下的VPC CNI配置ConfigMap
kubectl edit configmap aws-node -n kube-system
- 在data配置段添加以下两个参数
ENABLE_PREFIX_DELEGATION: "true" WARM_PREFIX_TARGET: "1"
- 保存退出后,滚动重启CNI守护进程让配置生效
kubectl rollout restart daemonset aws-node -n kube-system
- 同步修改节点kubelet的
--max-pods启动参数为110:托管节点组可直接在节点组配置页自定义最大Pod数;自管理节点组需要修改节点启动脚本中的kubelet启动参数,新节点启动后会自动生效,存量节点可通过滚动替换完成配置更新。
方案2:调整CNI IP预留策略,榨取默认模式下的IP配额
如果暂时不打算开启前缀委派,可以通过降低CNI的空闲IP预留数,小幅提升单节点可运行Pod数量:
- 同样编辑aws-node ConfigMap,添加以下参数
WARM_IP_TARGET: "1" MINIMUM_IP_TARGET: "11"
- 重启aws-node DaemonSet让配置生效。
该配置下t3.small默认模式最多可运行11个业务Pod,相比默认值提升4个,但无法突破实例ENI的总IP硬上限。
方案3:修复集群自动扩缩容触发逻辑
你观测到的IP耗尽后不触发自动扩缩容的问题,根因是默认集群自动扩缩器(CA)仅根据CPU、内存资源缺口判断是否需要扩容,无法感知IP/ENI资源耗尽的场景。修复方式为:
- 为集群自动扩缩器添加
--expendable-pods-priority-cutoff启动参数 - 为低优先级业务Pod绑定对应优先级类
配置完成后,当Pod因为IP不足处于Pending状态时,自动扩缩器会正确识别资源缺口触发节点扩容。
注意:所有不调整CNI能力、仅修改K8s调度层面参数的操作,都无法解决IP不足的本质问题,只会导致更多Pod启动失败。
内容的提问来源于stack exchange,提问作者Arnold Zahrneinder

