当前位置: 首页 > news >正文

AWS EKS IP 耗尽:原因、解决方案和最佳实践

想象一下,您的 AWS EKS 集群在生产环境中运行顺畅,所有 CI/CD 管道运行正常,服务优雅地扩展,一切都像自动驾驶模式一样。——直到有一天,新的 Pod 无法启动。


您深入研究 kubectl get pods 命令,发现一堆 Pod 卡在了 Pending 状态。

日志说明了一切:

Failed to assign an IP address: ENI IP address limit reached.

这时,您才意识到——问题并非计算能力,而是网络层面的瓶颈。您的集群中可分配的 IP 地址已用完。

起初,一切似乎都很正常。但随着工作负载的扩展,Pod 突然卡在了 Pending 状态。罪魁祸首?IP 地址耗尽。

网络是 AWS 上 Kubernetes 的支柱,如果规划不当,可能会导致严重的扩展问题。

本指南探讨了 AWS EKS 中 IP 地址耗尽的原因、如何及早发现 IP 地址耗尽,以及您应该遵循哪些最佳实践来防止这种情况发生。

Amazon Virtual Private Cloud (VPC) CNI

Amazon EKS 正式支持 Amazon Virtual Private Cloud (VPC) CNI 插件,以实现 Kubernetes Pod 网络。VPC CNI 提供与 AWS VPC 的原生集成,并以底层模式运行。在底层模式下,Pod 和主机位于同一网络层,并共享网络命名空间。从集群和 VPC 的角度来看,Pod 的 IP 地址是一致的。


AWS EKS 使用 AWS VPC CNI(容器网络接口)为每个 Pod 分配一个 IP 地址。虽然这提供了与 AWS 的原生网络集成,但这也意味着:

  • 每个 Pod 都会使用子网 CIDR 块中的一个 IP 地址。
  • AWS 为每个子网预留 5 个 IP 地址,从而缩小了可用范围。
  • 小型 CIDR 块很快就会被填满,最终导致 IP 地址耗尽。

随着集群规模的扩大,可用的 IP 池会缩小,从而阻止新的 Pod 运行。


AWS VPC CNI 及其作用


AWS VPC CNI 插件使用主 VPC CIDR 块管理 Pod 到 IP 的分配。其工作原理如下:

  • 每个 Kubernetes 节点都会获得一个弹性网络接口 (ENI)。
  • ENI 会获得多个辅助 IP 地址,分配给正在运行的 Pod。
  • 可用 IP 地址数量取决于节点实例类型。

例如,m5.large 实例每个 ENI 支持 10 个 Pod,这意味着如果运行更多 Pod,则需要另一个 ENI,从而消耗更多 IP 地址。

为什么会发生 IP 地址耗尽?

  • 子网大小限制
  • AWS 为每个子网预留 5 个 IP 地址。
  • 小型子网(例如 /25)的地址耗尽速度更快。
  • 扩展问题
  • Pod 数量越多,所需的 IP 地址就越多。
  • 如果没有适当的规划,集群的增长速度会超出其可用 IP 地址。
  • CIDR 块分配不正确。
  • 对于大型集群,使用 /25 CIDR 是不够的。
  • 对于大规模部署,建议使用 /20 或 /21 CIDR。

集群 IP 地址耗尽的迹象

  • Pod 卡在待处理状态。
  • aws-node 日志显示 IP 地址耗尽错误。
  • CloudWatch 日志指示子网 IP 地址已耗尽。


运行以下命令检查可用 IP:

kubectl get pods -A -o wide | grep Pending


或者使用 AWS CLI 监控子网使用情况:

aws ec2 describe-subnets --filters "Name=vpc-id,Values=<your-vpc-id>" --query 'Subnets[*].[SubnetId,AvailableIpAddressCount]'


防止 IP 地址耗尽的最佳实践


1. 使用更大的 CIDR 块

  • 以 /20 或 /21 开头,而不是 /25 或 /24。
  • 这将为您的集群提供数千个 IP 地址。
  • 示例设置:
aws ec2 create-vpc --cidr-block 10.0.0.0/20


2. 使用基于 Nitro 的实例

  • Nitro 实例支持前缀委托,从而减少 IP 地址开销。
  • 示例:c6g、m6g 和 r6g 实例允许基于前缀的 IP 分配。

3. 利用辅助 CIDR 块

  • 向您的 VPC 添加额外的 CIDR 块。
  • 这可以防止单个子网耗尽所有可用 IP 地址。
aws ec2sociate-vpc-cidr-block --vpc-id <your-vpc-id> --cidr-block 10.1.0.0/16


4. 启用前缀委托
前缀委托允许 ENI 分配较小的子网前缀,而不是完整的 IP 地址。这显著减少了 IP 地址浪费。

启用方法:

kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true


5. 使用 AWS PrivateLink 服务

  • 避免在不必要的情况下分配公有 IP 地址。
  • AWS PrivateLink 在内部路由流量,从而节省 IP 地址。

在 AWS EKS 中监控 IP 使用情况


使用 CloudWatch 和 aws-node 日志跟踪可用 IP:

kubectl logs -n kube-system aws-node | grep "IP exhaustion"


使用 Amazon CloudWatch 设置警报:

aws cloudwatch put-metric-alarm --alarm-name IP-Exhaustion-Alert \
--metric-name AvailabilityIPCount --namespace AWS/VPC \
--threshold 10 --comparison-operator LessThanThreshold \
--evaluation-periods 1 --alarm-actions arn:aws:sns:region:account-id:topic-name


调试 IP 耗尽问题


1. 识别卡住的 Pod

kubectl get pods --all-namespaces -o wide | grep Pending

2. 检查 IP 可用性

aws ec2 describe-subnets --query 'Subnets[*].[SubnetId,AvailableIpAddressCount]'


3. 重启 aws-node DaemonSet

kubectl rollout restart daemonset aws-node -n kube-system

案例研究:在不断增长的 EKS 部署中预防 IP 耗尽


一家 SaaS 初创公司面临扩展问题,因为其 EKS 集群规模超出了 /25 子网的限制。Pod 出现故障,部署停滞。解决方案:

  • 迁移到 /20 CIDR 块以实现长期可扩展性。
  • 切换到 Nitro 实例以支持前缀委托。
  • 使用 AWS PrivateLink 减少公网 IP 分配。

在几周内,他们消除了 IP 耗尽问题,并实现了无缝扩展。

结论

在AWS EKS集群中,IP地址耗尽是一个常见的网络瓶颈问题,尤其是在集群规模扩大时。由于AWS VPC CNI插件为每个Pod分配一个IP地址,且每个子网预留5个IP地址,小型CIDR块(如/25)会迅速耗尽IP地址,导致Pod无法启动。为避免这一问题,建议使用更大的CIDR块(如/20或/21),采用基于Nitro的实例以支持前缀委托,并利用辅助CIDR块扩展IP池。此外,启用前缀委托和使用AWS PrivateLink服务也能有效减少IP地址浪费。通过监控IP使用情况(如CloudWatch和aws-node日志)并实施这些最佳实践,可以确保EKS集群在网络层面具备良好的扩展性,避免因IP耗尽导致的部署停滞。通过实施这些最佳实践,您可以确保您的 Kubernetes 工作负载平稳扩展,而不会遇到网络障碍。

相关文章:

  • 【AWS入门】AWS身份验证和访问管理(IAM)
  • 【Windows系统】向量数据库Milvus安装教程
  • Win10 安装单机版ES(elasticsearch),整合IK分词器和安装Kibana
  • 鸿蒙PC操作系统:从Linux到自研微内核的蜕变
  • 手机内存不够,哪些文件可以删?
  • 小红书的视频怎么保存没有水印(方法分享)
  • linux——mysql故障排查与生产环境优化
  • Python打卡DAY30
  • MySQL函数触发:函数处理与触发器自动化应用
  • Node 服务监控及通过钉钉推送告警提醒
  • 实战教程:影刀RPA采集闲鱼商品并分享钉钉
  • Linux内核深入学习(4)——内核常见的数据结构2——红黑树
  • 深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
  • 常见排序算法整理(Java实现)
  • 开发 前端搭建npm v11.4.0 is known not to run on Node.js v14.18.1.
  • 星际争霸小程序:用Java实现策略模式的星际大战
  • 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
  • NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)
  • OpenCV CUDA 模块中的矩阵算术运算-----在频域(复数频谱)中执行逐元素乘法并缩放的函数mulAndScaleSpectrums()
  • 51单片机点亮一个LED介绍
  • 香港新股市场繁荣:恒瑞医药等4公司同时招股,宁德时代今日港交所上市
  • 周慧芳任上海交通大学医学院附属上海儿童医学中心党委书记
  • 国家统计局:4月全国城镇调查失业率为5.1%,比上月下降0.1个百分点
  • 坐标大零号湾科创策源区,上海瑞金医院闵行院区正式启动建设
  • 读懂城市|成都高新区:打造“人尽其才”的“理想之城”
  • “复旦源”一源六馆焕新启幕,设立文化发展基金首期1亿元