View a markdown version of this page

优化 IP 地址利用率 - Amazon EKS

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

优化 IP 地址利用率

得益于应用程序现代化,容器化环境的规模正在快速增长。这意味着正在部署越来越多的工作节点和 Pod。

亚马逊 VPC CNI 插件为每个容器分配一个 VPC 的 CIDR 中的 IP 地址。这种方法通过 VPC 流日志和其他监控解决方案等工具提供 Pod 地址的全面可见性。根据您的工作负载类型,这可能会导致 Pod 消耗大量的 IP 地址。

在设计 AWS 网络架构时,在 VPC 和节点级别优化 Amazon EKS IP 使用非常重要。这将帮助您缓解 IP 耗尽问题并增加每个节点的 pod 密度。

在本节中,我们将讨论可以帮助您实现这些目标的技术。

优化节点级 IP 消耗

前缀委派是亚马逊虚拟私有云(亚马逊 VPC)的一项功能,允许您为您的亚马逊弹性计算云(亚马逊 EC2)实例分配 IPv4 或 IPv6 前缀。它增加了每个网络接口 (ENI) 的 IP 地址,从而增加了每个节点的 Pod 密度并提高了您的计算效率。自定义网络还支持前缀委托。

有关详细信息,请参阅 Linux 节点的前缀委派和使用 Windows 节点进行前缀委派部分。

减轻 IP 耗尽的风险

为了防止您的集群消耗所有可用的 IP 地址,我们强烈建议您在调整 VPC 和子网时考虑到增长。

采用 IPv6 是从一开始就避免这些问题的好方法。但是,对于可扩展性需求超出初始规划且无法采用 IPv6 的组织,改进 VPC 设计是应对 IP 地址耗尽的建议对策。亚马逊 EKS 客户最常用的技术是向 VPC 添加不可路由的二级 CIDR,并配置 VPC CNI 以在为 Pod 分配 IP 地址时使用这些额外的 IP 空间。这通常被称为自定义网络

我们将介绍您可以使用 Amazon VPC CNI 的哪些变量来优化分配给节点的 IP 温水池。在本节结束时,我们将介绍其他一些架构模式,这些模式不是 Amazon EKS 固有的,但可以帮助缓解 IP 枯竭。

采用 IPv6 是避开 RFC1918 限制的最简单方法;我们强烈建议您在选择网络架构时考虑将 IPv6 作为首选。IPv6 提供了更大的总 IP 地址空间,集群管理员可以专注于迁移和扩展应用程序,无需花精力解决 IPv4 限制。

亚马逊 EKS 集群支持 IPv4 和 IPv6。默认情况下,EKS 集群使用 IPv4 地址空间。在创建集群时指定基于 IPv6 的地址空间将启用 IPv6 的使用。在 IPv6 EKS 集群中,容器和服务接收 IPv6 地址,同时保持传统 IPv4 终端节点连接在 IPv6 集群上运行的服务的能力,反之亦然。集群内所有的 pod 与 pod 的通信始终通过 IPv6 进行。在 VPC (/56) 中,IPv6 子网的 IPv6 CIDR 块大小固定为 /64。这提供了 2^64(大约 18 万亿个)IPv6 地址,允许您在 EKS 上扩展部署。

有关详细信息,请参阅 “运行 IPv6 EKS 集群” 部分;要获得实践经验,请参阅 “亲身体验 IPv6” 研讨会的 “在亚马逊 EKS 上理解 IPv6” 部分

IPv6 模式下的 EKS 集群

优化 IPv4 集群中的 IP 消耗

本部分专门针对运行传统应用程序、尚未 and/or 准备好迁移到 IPv6 的客户。虽然我们鼓励所有组织尽快迁移到 IPv6,但我们认识到,有些组织可能仍需要寻找其他方法来使用 IPv4 扩展其容器工作负载。出于这个原因,我们还将引导您了解架构模式,以优化亚马逊 EKS 集群的 IPv4 (RFC1918) 地址空间消耗。

成长计划

作为防止 IP 耗尽的第一道防线,我们强烈建议在考虑增长的情况下调整您的 IPv4 VPC 和子网规模,以防止您的集群消耗所有可用 IP 地址。如果子网没有足够的可用 IP 地址,您将无法创建新的 Pod 或节点。

在构建 VPC 和子网之前,建议从所需的工作负载规模向后工作。例如,当使用 eksctl(一种用于在 EKS 上创建和管理集群的简单 CLI 工具)构建集群时,默认情况下会创建 19个子网。/19 的网络掩码适用于大多数工作负载类型,允许分配 8000 多个地址。

重要

当您调整 VPC 和子网规模时,可能会有许多元素(容器和节点除外)会消耗 IP 地址,例如负载均衡器、RDS 数据库和其他 vpc 内服务。

此外,Amazon EKS 可以创建多达 4 个弹性网络接口 (X-ENI),这些接口是允许与控制平面进行通信所必需的(更多信息请点击此处)。在集群升级期间,Amazon EKS 会创建新的集群, X-ENIs 并在升级成功时删除旧集群。出于这个原因,我们建议与 EKS 集群关联的子网的网络掩码至少为 /28(16 个 IP 地址)。

您可以使用示例 EKS 子网计算器电子表格来规划您的网络。该电子表格根据工作负载和 VPC ENI 配置计算 IP 使用量。将 IP 使用率与 IPv4 子网进行比较,以确定配置和子网大小是否足以满足您的工作负载。请记住,如果您的 VPC 中的子网用尽了可用的 IP 地址,我们建议使用 VPC 的原始 CIDR 块创建一个新的子网。请注意,现在 Amazon EKS 允许修改集群子网和安全组

自定义网络

如果你即将耗尽 RFC1918 IP 空间,你可以使用自定义网络模式通过将 Pod 调度到专用的附加子网内来节省可路由的 IP。虽然自定义网络接受二级 CIDR 范围的有效 VPC 范围,但我们建议您使用100.64.0.0/10共享地址空间 (RFC 6598) 中的 CIDR,因为与 RFC1918 范围相比,这些 CIDR 不太可能用于企业设置。例如,您可以用100.64.0.0/16作 VPC 的辅助 CIDR。有关允许的辅助 CIDR 范围,请参阅 IPv4 CIDR 区块关联限制

有关详细信息,请参阅 “自定义网络” 的专用部分

自定义网络

增强的子网发现

增强型子网发现通过标记新子网,以便 Amazon VPC CNI 可以发现它们,从而为 IP 耗尽提供了一种简化的网络配置替代方案。Amazon VPC CNI借助增强型子网发现,当前的工作负载可以在相同的子网上继续运行,亚马逊弹性Kubernetes服务(Amazon EKS)现在可以在新的 “可用子网” 上安排更多容器。

如果您的集群当前子网的 IP 地址已用完,您只需按如下方式向 Amazon EKS 集群添加其他子网即可:

  1. 将新的 CIDR 区块关联到您的 VPC。

  2. 在新的 CIDR 区块中创建一个新子网,并用 “kubernetes” 对其进行标记。io/role/cni” = “1”。

  3. 将 Amazon VPC CNI 插件的 ENABLE_SUBNET_DISCOVERY 配置设置为 “真”(自 1.18.0 版起默认)。

在您的 VPC 和 Amazon EKS 集群上启用增强子网发现后,新的弹性网络接口 (ENI) 将连接到您的亚马逊 EKS 节点,如下图所示:

增强的子网发现

有关更多信息,请参阅 AWS 容器博客上的 Amazon VPC CNI 推出增强型子网发现。

优化 IP 温水池

使用默认配置,VPC CNI 会在温水池中保留完整的 ENI(和关联的 IP)。这可能会消耗大量 IP,尤其是在较大的实例类型上。

如果您的集群子网可用的 IP 地址数量有限,请仔细检查以下 VPC CNI 配置环境变量:

  • WARM_IP_TARGET

  • MINIMUM_IP_TARGET

  • WARM_ENI_TARGET

您可以将的值配置MINIMUM_IP_TARGET为与您预期在节点上运行的 Pod 数量非常匹配。这样做可以确保 Pod 创建后,CNI 可以在不调用 EC2 API 的情况下从温水池中分配 IP 地址。

请注意,将值设置WARM_IP_TARGET得过低,将导致对 EC2 API 的额外调用,并可能导致请求受限。对于大型集群,使用和MINIMUM_IP_TARGET以避免限制请求。

要配置这些选项,您可以下载aws-k8s-cni.yaml清单并设置环境变量。在撰写本文时,最新版本位于此处。检查配置值的版本是否与安装的 VPC CNI 版本相匹配。

警告

更新 CNI 时,这些设置将重置为默认值。在更新 CNI 之前,请对其进行备份。查看配置设置以确定更新成功后是否需要重新应用它们。

您可以即时调整现有应用程序的 CNI 参数,而无需停机,但应选择支持可扩展性需求的值。例如,如果你正在处理批量工作负载,我们建议更新默认值WARM_ENI_TARGET以满足 Pod 规模需求。设置WARM_ENI_TARGET为较高的值将始终保持运行大型批处理工作负载所需的热 IP 池,从而避免数据处理延迟。

警告

改进 VPC 设计是应对 IP 地址耗尽的建议对策。考虑一下诸如 IPv6 和辅助 CIDR 之类的解决方案。在排除其他选项之后,调整这些值以最小化 Warm IP 的数量应该是临时解决方案。错误配置这些值可能会干扰集群操作。在对生产系统进行任何更改之前,请务必查看此页面上的注意事项

监控 IP 地址清单

除了上述解决方案外,监控 IP 利用率也很重要。您可以使用 CNI 指标助手监控子网的 IP 地址清单。一些可用的指标是:

  • 集群可以支持的最大 ENI 数量

  • 已分配的 ENI 数量

  • 当前分配给 Pod 的 IP 地址数量

  • 可用的 IP 地址总数和最大数量

您还可以设置CloudWatch 警报,以便在子网的 IP 地址耗尽时收到通知。

警告

确保 VPC CNI 的DISABLE_METRICS变量设置为 false。

进一步的考虑

还有其他一些不是亚马逊 EKS 固有的架构模式可以帮助缓解 IP 枯竭。例如,您可以优化 VPC 之间的通信,或者在多个账户之间共享 VPC 以限制 IPv4 地址分配。

在此处了解有关这些模式的更多信息: