本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Linux 的前缀模式
提示
通过亚马逊 EKS 研讨会探索
亚马逊 VPC CNI 为 Amazon EC2 网络接口分配网络前缀,以增加节点可用的 IP 地址数量并提高每个节点的 pod 密度。您可以将亚马逊 VPC CNI 插件的 1.9.0 或更高版本配置为分配 IPv4 和 IPv6 CIDR,而不是为网络接口分配单个辅助 IP 地址。
IPv6 集群默认启用前缀模式,是唯一支持的选项。VPC CNI 为 ENI 上的插槽分配 /80 IPv6 前缀。有关更多信息,请参阅本指南的 IPv6 部分。
在前缀分配模式下,每种实例类型的弹性网络接口的最大数量保持不变,但您现在可以将 Amazon VPC CNI 配置为分配 /28(16 个 IP 地址)IPv4 地址前缀,而不是为网络接口上的插槽分配单个 IPv4 地址。当设置ENABLE_PREFIX_DELEGATION为 true 时,VPC CNI 会从分配给 ENI 的前缀中为 Pod 分配 IP 地址。请按照 EKS 用户指南中提及的说明启用前缀 IP 模式。
您可以分配给网络接口的 IP 地址的最大数量取决于实例类型。您分配给网络接口的每个前缀都算作一个 IP 地址。例如,c5.large 实例具有每个网络接口 10 个 IPv4 地址的限制。此实例的每个网络接口都有一个主 IPv4 地址。如果网络接口没有辅助 IPv4 地址,则您最多可以为网络接口分配 9 个前缀。您每为网络接口多分配一个 IPv4 地址,则您就可以为网络接口少分配一个前缀。查看 AWS EC2 文档,了解每种实例类型的每个网络接口的 IP 地址以及为网络接口分配前缀。
在工作节点初始化期间,VPC CNI 为主 ENI 分配一个或多个前缀。CNI 会预先分配一个前缀,通过维护一个温水池来更快地启动 pod。可以通过设置环境变量来控制在温水池中保存的前缀数量。
-
WARM_PREFIX_TARGET,超出当前需求的要分配的前缀数量。 -
WARM_IP_TARGET,要分配的超过当前需求的 IP 地址的数量。 -
MINIMUM_IP_TARGET,任何时候可用的最小 IP 地址数量。 -
WARM_IP_TARGETMINIMUM_IP_TARGET如果设置将覆盖WARM_PREFIX_TARGET。
随着计划中的更多 Pod 增加,将为现有 ENI 请求额外的前缀。首先,VPC CNI 尝试为现有 ENI 分配新的前缀。如果 ENI 已满负荷,则 VPC CNI 会尝试向该节点分配新的 ENI。在达到最大 ENI 限制(由实例类型定义)之前,将连接新的 ENI。连接新的 ENI 时,ipamd 将分配维护WARM_PREFIX_TARGETWARM_IP_TARGET、和MINIMUM_IP_TARGET设置所需的一个或多个前缀。
建议
在以下情况下使用前缀模式
如果你在工作节点上遇到 Pod 密度问题,请使用前缀模式。为避免 VPC CNI 错误,我们建议在迁移到前缀模式之前,检查子网中是否有 /28 前缀的连续地址块。有关子网预留的详细信息,请参阅 “使用子网预留避免子网分段 (IPv4)” 部分。
为了向后兼容,将 max-pod max-pods--use-max-pods=false值指定为节点的用户数据。有关更多信息,请参阅《亚马逊 EKS 用户指南》中的 MaxPods 是如何确定的。有关用户数据的示例,请参阅 EKS 用户指南。
./max-pods-calculator.sh --instance-type m5.large --cni-version ``1.9``.0 --cni-prefix-delegation-enabled
前缀分配模式特别适用于 CNI 自定义网络的用户,其中 Pod 不使用主 ENI。通过前缀分配,即使没有用于 Pod 的主网卡,您仍然可以在几乎每种 Nitro 实例类型上附加更多 IP。
在以下情况下避开前缀模式
如果您的子网非常分散,可用的 IP 地址不足以创建 /28 前缀,请避免使用前缀模式。如果生成前缀的子网是分段的(频繁使用的子网,辅助 IP 地址分散),则前缀连接可能会失败。通过创建新子网和保留前缀可以避免此问题。
在前缀模式下,分配给工作节点的安全组由 Pod 共享。如果你有安全要求,通过在共享计算资源上运行具有不同网络安全要求的应用程序来实现合规性,可以考虑为 Pod 使用安全组。
在同一个节点组中使用相似的实例类型
您的节点组可能包含多种类型的实例。如果一个实例的最大 pod 数量较低,则该值将应用于节点组中的所有节点。考虑在节点组中使用相似的实例类型,以最大限度地利用节点。我们建议配置 node.kubernetes。io/instance-如果您使用 Karp
警告
特定节点组中所有节点的最大 pod 数量由节点组中任何单个实例类型的最小最大 pod 数定义。
配置 WARM_PREFIX_TARGET 以保存 IPv4 地址
安装清单的WARM_PREFIX_TARGET为 1。在大多数情况下,推荐值 1 可以很好地组合快速的 Pod 启动时间,同时最大限度地减少分配给实例的未使用 IP 地址。WARM_PREFIX_TARGET
如果您需要进一步为每个节点保存 IPv4 地址,请使用WARM_IP_TARGET和MINIMUM_IP_TARGET设置,这些设置在配置WARM_PREFIX_TARGET时会被覆盖。通过设置WARM_IP_TARGET为小于 16 的值,可以防止 CNI 附加全部多余的前缀。
与附加新的 ENI 相比,更倾向于分配新的前缀
与创建新的 ENI 并将其附加到实例相比,为现有 ENI 分配额外前缀更快的 EC2 API 操作。使用前缀可以提高性能,同时节省 IPv4 地址分配。附加前缀通常在一秒钟内完成,而附加新的 ENI 最多可能需要 10 秒。对于大多数用例,CNI 在前缀模式下运行时,每个工作节点只需要一个 ENI。如果您能负担得起(在最坏的情况下)每个节点最多 15 个未使用 IP,我们强烈建议您使用更新的前缀分配网络模式,并实现随之而来的性能和效率提升。
使用子网预留来避免子网分段 (IPv4)
当 EC2 为 ENI 分配 /28 IPv4 前缀时,它必须是子网中连续的 IP 地址块。如果生成前缀的子网是分散的(二级 IP 地址分散的高度使用的子网),则前缀连接可能会失败,并且您将在 VPC CNI 日志中看到以下错误消息:
failed to allocate a private IP/Prefix address: InsufficientCidrBlocks: There are not enough free cidr blocks in the specified subnet to satisfy the request.
为避免分段并有足够的连续空间来创建前缀,您可以使用 VPC 子网 CIDR 预留在子网内预留 IP 空间以供前缀专用。创建预留后,VPC CNI 插件将调用 EC2 API 来分配从预留空间中自动分配的前缀。
建议创建一个新子网,为前缀预留空间,并为在该子网中运行的工作节点启用 VPC CNI 前缀分配。如果新子网仅供在启用了 VPC CNI 前缀分配的 EKS 集群中运行的 Pod 专用,则您可以跳过前缀预留步骤。
避免降级 VPC CNI
前缀模式适用于 VPC CNI 版本 1.9.0 及更高版本。启用前缀模式并将前缀分配给 ENI 后,必须避免将 Amazon VPC CNI 插件降级到低于 1.9.0 的版本。如果您决定降级 VPC CNI,则必须删除并重新创建节点。
在过渡到前缀委派期间替换所有节点
强烈建议您创建新的节点组以增加可用 IP 地址的数量,而不是滚动替换现有的工作节点。封锁并排空所有现有节点,以安全地驱逐所有现有 Pod。为了防止服务中断,我们建议在关键工作负载的生产集群上实施