启用前缀模式的Nitro实例出现Insufficient vpc.amazonaws.com/pod-eni错误
{"level":"debug","ts":"2024-11-13T09:35:43.766Z","caller":"ipamd/ipamd.go:1283","msg":"ENI eni-xxx cannot be deleted because it is primary"}
{"level":"debug","ts":"2024-11-13T09:35:43.766Z","caller":"ipamd/ipamd.go:1283","msg":"ENI eni-yyy cannot be deleted because it is a trunk ENI"}
我的预期是只要硬件资源充足,节点应该能支持最多98个Pod,请问哪里配置遗漏了? --- # 解决方案 ## 核心问题 虽然已经启用了前缀模式,但节点仍然以`vpc.amazonaws.com/pod-eni`(Pod专用ENI数量)作为调度约束,而非前缀分配的IP数量。这说明前缀模式未完全生效,IPAM仍在使用传统的ENI分配逻辑,且当前节点的Pod ENI配额已耗尽。 ## 必要配置补充 启用前缀模式后,仅设置`ENABLE_PREFIX_DELEGATION=true`是不够的,还需添加以下关键参数: - **`WARM_PREFIX_TARGET`**:预分配的IPv4前缀数量(每个前缀包含16个可用IP),根据r6g.medium实例的`max prefix 3`限制,建议设为2或3 - **`MINIMUM_IP_TARGET`**:可选,设置节点保留的最小IP数,避免频繁触发前缀分配操作 ## 修复步骤 1. 更新aws-node DaemonSet的环境变量: ```bash kubectl set env daemonset/aws-node -n kube-system WARM_PREFIX_TARGET=2 kubectl set env daemonset/aws-node -n kube-system MINIMUM_IP_TARGET=32
- 回收节点以让配置完全生效(重启aws-node Pod也可,但节点回收能确保VPC资源控制器重新初始化Trunk ENI):
kubectl drain <你的节点名称> --ignore-daemonsets kubectl uncordon <你的节点名称>
额外排查点
如果执行上述步骤后问题仍存在,检查以下内容:
- 查看节点的资源分配情况,确认
vpc.amazonaws.com/pod-eni的已用数量:
若已用数量接近4,说明节点上存在未清理的旧Pod ENI,可手动登录AWS控制台删除非主ENI、非Trunk ENI的网卡,再重启aws-node Pod。kubectl describe node <你的节点名称> | grep -A 5 "Allocated resources" - 验证ipamd日志中的前缀分配逻辑:
正常情况下应看到kubectl logs -n kube-system <aws-node Pod名称> -c ipamd | grep "prefix"Assigned prefix等相关日志,说明前缀分配已启动。
注意事项
节点显示的pods:98是kubelet基于实例CPU/内存计算的理论最大值,但实际可运行的Pod数受限于VPC CNI能分配的IP数量。根据日志中的max ips 48,r6g.medium实例在前缀模式下最多支持48个Pod(3个前缀×16IP),这是AWS实例的网络资源硬限制,无法突破。
内容的提问来源于stack exchange,提问作者uylmz
相关产品推荐
相关产品推荐

