适用于 Linux 的前缀模式 - Amazon EKS

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

适用于 Linux 的前缀模式

VPCCNIAmazon 为 A mazon EC2 网络接口分配网络前缀,以增加节点可用的 IP 地址数量并增加每个节点的 Pod 密度。您可以将 Amazon VPC CNI 插件的 1.9.0 或更高版本配置为分配网络接口IPv4,IPv6CIDRs而不必为网络接口分配单独的辅助 IP 地址。

默认情况下,前缀模式在IPv6集群上处于启用状态,并且是唯一支持的选项。为上的插槽VPCCNI分配一个 /80 IPv6 前缀。ENI有关更多信息,请参阅本指南的IPv6章节

在前缀分配模式下,每种实例类型的最大弹性网络接口数量保持不变,但您现在可以将 Amazon 配置VPCCNI为分配 /28(16 个 IP IPv4 地址)地址前缀,而不必为网络接口上的插槽分配单独IPv4的地址。如果设置ENABLE_PREFIX_DELEGATION为 true,则从VPCCNI分配给的前缀中为 Pod 分配一个 ENI IP 地址。请按照EKS用户指南中提及的说明启用前缀 IP 模式。

两个工作子网的插图

您可以分配给网络接口的 IP 地址的最大数量取决于实例类型。您分配给网络接口的每个前缀都算作一个 IP 地址。例如,一个c5.large实例的每个网络接口都有10IPv4地址限制。此实例的每个网络接口都有一个主IPv4地址。如果网络接口没有辅助IPv4地址,则最多可以为该网络接口分配 9 个前缀。对于分配给网络接口的每增加一个IPv4地址,可以为该网络接口少分配一个前缀。查看有关每种实例类型的每个网络接口的 IP 地址以及为网络接口分配前缀的AWSEC2文档。

在工作节点初始化期间,会为主节点VPCCNI分配一个或多个前缀。ENICNI预先分配了一个前缀,通过维护温池来更快地启动 pod。可以通过设置环境变量来控制要在温池中保存的前缀数量。

  • WARM_PREFIX_TARGET,即要分配的超出当前需求的前缀数量。

  • WARM_IP_TARGET,要分配的超出当前需求的 IP 地址数量。

  • MINIMUM_IP_TARGET,任何时候可用的 IP 地址的最小数量。

  • WARM_IP_TARGETMINIMUM_IP_TARGET如果设置则会覆盖WARM_PREFIX_TARGET

随着计划越来越多 Pod,将为现有ENI的 Pod 请求额外的前缀。首先,VPCCNI尝试为现有前缀分配新的前缀ENI。如果ENI已达到容量,则会VPCCNI尝试为该节点分配一个新ENI的。在达到最大ENI限制(由实例类型定义)之前,ENIs将附加新的。附加新内容ENI时,ipamd 将分配维护WARM_PREFIX_TARGETWARM_IP_TARGET、和MINIMUM_IP_TARGET设置所需的一个或多个前缀。

为 pod 分配 IP 的过程流程图

建议

在以下情况下使用前缀模式

如果您在工作节点上遇到 Pod 密度问题,请使用前缀模式。为避免VPCCNI错误,我们建议在迁移到前缀模式之前,检查子网中是否有 /28 前缀的连续地址块。有关子网预留的详细信息,请参阅 “使用子网预留避免子网碎片 (IPv4)” 部分。

为了向后兼容,最大容量限制设置为支持辅助 IP 模式。要增加 pod 密度,请将 Kubelet 的max-pods值指定为节点的用户数据。--use-max-pods=false您可以考虑使用 max-pod-calculator.sh 脚本来计算EKS给定实例类型的建议的最大 Pod 数。有关EKS用户数据的示例,请参阅用户指南

./max-pods-calculator.sh --instance-type m5.large --cni-version ``1.9``.0 --cni-prefix-delegation-enabled

前缀分配模式尤其适用于CNI自定义网络的用户,其中主ENI节点不用于 pod。通过前缀分配,即使没有ENI用于吊舱的主实例类型,您仍然可以在几乎所有的 Nitro 实例类型IPs上附加更多内容。

在以下情况下避免使用前缀模式

如果您的子网非常分散,且可用的 IP 地址不足,无法创建 /28 前缀,请避免使用前缀模式。如果生成前缀的子网碎片化(一个经常使用的子网,次要 IP 地址分散),则前缀连接可能会失败。可以通过创建新子网并保留前缀来避免此问题。

在前缀模式下,分配给工作节点的安全组由 Pod 共享。如果您有通过在共享计算资源上运行具有不同网络安全要求的应用程序来实现合规性的安全要求,可以考虑为 Pod 使用安全组

在同一个节点组中使用相似的实例类型

您的节点组可能包含多种类型的实例。如果实例的最大 Pod 数量较低,则该值将应用于节点组中的所有节点。考虑在节点组中使用相似的实例类型,以最大限度地提高节点使用率。如果您使用 Karpenter 进行自动节点扩展,我们建议您在配置程序的需求部分配置 node.kubernetes.io/instance-ty pe。API

警告

特定节点组中所有节点的最大 Pod 数量由该节点组中任何单个实例类型的最最大容器数量定义。

配置WARM_PREFIX_TARGET以节省地址 IPv4

安装清单的默认值WARM_PREFIX_TARGET为 1。在大多数情况下,建议的值 1 可以很好地兼顾快速的 pod 启动时间,同时最大限度地减少分配给实例的未使用的 IP 地址。WARM_PREFIX_TARGET

如果您需要进一步节省每个节点IPv4的地址,请使用WARM_IP_TARGETMINIMUM_IP_TARGET设置,这些设置在配置WARM_PREFIX_TARGET时会被覆盖。通过WARM_IP_TARGET将值设置为小于 16,可以CNI防止附加全部多余的前缀。

更喜欢分配新的前缀而不是附加新的前缀 ENI

与创建新ENI前缀并将其附加到实例相比,ENI为现有实例分配额外前缀的EC2API操作更快。使用前缀可以提高性能,同时节约IPv4地址分配。附加前缀通常在不到一秒钟的时间内完成,而附加新的前缀ENI可能需要长达 10 秒的时间。对于大多数用例,在CNI前缀模式下运行时,ENI每个工作节点只需要一个工作节点。如果您负担得起(在最坏的情况下)IPs每个节点多达 15 个未使用的资源,我们强烈建议您使用更新的前缀分配网络模式,并实现随之而来的性能和效率提升。

使用子网预留避免子网碎片 (IPv4)

EC2为分配一个 /28 IPv4 前缀时ENI,它必须是子网中连续的 IP 地址块。如果生成前缀的子网是碎片化的(一个高度使用的子网,具有分散的辅助 IP 地址),则前缀连接可能会失败,并且您将在VPCCNI日志中看到以下错误消息:

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 空间供前缀专用。创建预留后,VPCCNI插件将调EC2APIs用分配从预留空间中自动分配的前缀。

建议创建一个新子网,为前缀预留空间,并为在该子网中运行的工作节点启用前缀VPCCNI分配。如果新子网仅专用于在EKS集群中运行且启用了VPCCNI前缀分配的 Pod,则可以跳过前缀预留步骤。

避免降级 VPC CNI

前缀模式适用于 1.9.0 及更高VPCCNI版本。启用前缀模式并分配前缀后,必须避免将 Amazon VPC CNI 附加组件降级到低于 1.9.0 的版本。ENIs如果您决定降级,则必须删除并重新创建节点。VPC CNI

在过渡到前缀委派期间替换所有节点

强烈建议您创建新的节点组以增加可用 IP 地址的数量,而不是滚动替换现有的工作节点。封锁并耗尽所有现有节点,以安全地驱逐所有现有 Pod。为了防止服务中断,我们建议在生产集群上为关键工作负载实施 Pod 中断预算。新节点上的 Pod 将从分配给的前缀中分配一个 IP ENI。确认 Pod 正在运行后,您可以删除旧的节点和节点组。如果您使用的是托管节点组,请按照此处提到的步骤安全地删除节点组

📝 编辑此页面 GitHub