View a markdown version of this page

运行 IPv6 EKS 集群 - Amazon EKS

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

运行 IPv6 EKS 集群

IPv6 模式下的 EKS 解决了大规模 EKS 集群中常见的 IPv4 耗尽挑战。EKS对IPv6的支持侧重于解决IPv4耗尽问题,该问题源于IPv4地址空间的有限规模。这是我们的许多客户提出的重大问题,与 Kubernetes IPv4/IPv6 双栈功能截然不同。EKS/IPv6 还将提供使用 IPv6 CIDR 互连网络边界的灵活性,从而最大限度地减少发生 CIDR 重叠的机会,从而解决双重问题 (,)。In-Cluster Cross-Cluster在 IPv6 模式(--ip-family ipv6)下部署 EKS 集群时,该操作是不可逆的。简而言之,EKS IPv6 支持将在集群的整个生命周期中启用。

在 IPv6 EKS 集群中,Pod 和服务将接收 IPv6 地址,同时保持与传统 IPv4 终端节点的兼容性。这包括外部 IPv4 终端节点访问集群内服务的能力,以及 Pod 访问外部 IPv4 端点的能力。

亚马逊 EKS IPv6 支持利用原生 VPC IPv6 功能。每个 VPC 都分配了一个 IPv4 地址前缀(CIDR 块大小可以从 /16 到 /28)和来自亚马逊 GUA(全球单播地址)的唯一的 /56 IPv6 地址前缀(固定);您可以为 VPC 中的每个子网分配 /64 地址前缀。路由表、网络访问控制列表、对等互连和 DNS 解析等 IPv4 功能在启用 IPv6 的 VPC 中的工作方式相同。然后,VPC 被称为双栈 VPC,以下图表描述了支持基于群集的 IPv4IPv6 VPC 基础模式: EKS/IPv6

双堆栈 VPC

在 IPv6 世界中,每个地址都可以通过互联网路由。默认情况下,VPC 从公有 GUA 范围分配 IPv6 CIDR。但是,自 2024 年 8 月起,您还可以通过亚马逊 VPC IP 地址管理器 (IPAM) 为 VPC 和子网使用私有 IPv6 寻址。有关更多信息,请参阅这篇 AWS 联网博客文章 VPC 文档

下图描绘了集群内的 Pod IPv6 互联网出口流: EKS/IPv6

双堆栈 VPC

实施 IPv6 子网的最佳实践可以在 VPC 用户指南中找到。

在 IPv6 EKS 集群中,节点和 Pod 接收公有 IPv6 地址。EKS 根据唯一本地 IPv6 单播地址 (ULA) 为服务分配 IPv6 地址。与 IPv4 不同,IPv6 集群的 ULA 服务 CIDR 是在集群创建阶段自动分配的,无法指定。下图描绘了 EKS/IPv6 基于集群控制平面数据计划的基础模式:

双堆栈 VPC

概述

EKS/IPv6 仅支持前缀模式(VPC-CNI Plug-in ENI IP 分配模式)。了解有关前缀模式的更多信息

前缀分配仅适用于 Nitro-based EC2 实例,因此 EKS/IPv6 仅当集群数据平面使用 EC2 Nitro-based 实例时才支持前缀分配。

简而言之,IPv6 前缀为 /80(每个工作节点)将产生大约 10^14 个 IPv6 地址,限制因素将不再是 IP,而是 Pod 密度(资源方面)。

IPv6 前缀分配仅在 EKS 工作节点引导时发生。众所周知,这种行为可以缓解因旨在及时分配私有 IPv4 地址的 VPC CNI 插件 (ipamd) 生成的 API 调用受限而导致高容器流失率 EKS/IPv4 集群在 Pod 调度中经常出现延迟的情况。众所周知,它会使 VPC-CNI 插件的高级旋钮不必要地进行微调 WARM_IP/ENI,MINIMUM_IP

下图放大为 IPv6 工作节点弹性网络接口 (ENI):

工作子网的插图

每个 EKS 工作节点都被分配了 IPv4 和 IPv6 地址,以及相应的 DNS 条目。对于给定的工作节点,仅使用来自双栈子网的单个 IPv4 地址。EKS 对 IPv6 的支持使您能够通过高度自以为是的仅限出口 IPv4 模型与 IPv4 终端节点(AWS、本地、互联网)进行通信。EKS 实现了主机本地 CNI 插件,该插件仅次于 VPC CNI 插件,该插件为 Pod 分配和配置 IPv4 地址。CNI 插件为 169.254.172 中的 Pod 配置了特定于主机的不可路由 IPv4 地址。0/22 范围。分配给 Pod 的 IPv4 地址是工作节点所独有的,不会在工作节点之外公布。169.254.172。0/22 提供多达 1024 个可支持大型实例类型的唯一 IPv4 地址。

下图描绘了 IPv6 Pod 连接到集群边界外(非互联网)的 IPv4 终端节点的流程:

EKS/IPv6

在上图中,Pod 将对终端节点执行 DNS 查询,在收到 IPv4 “A” 响应后,Pod 的节点专用 IPv4 地址将通过源网络地址转换 (SNAT) 转换为连接到 EC2 的主网络接口的私有 IPv4 (VPC) 地址。 Worker-node

注意

上述模式要求在运行 EKS/IPv6 Pod 的子网上禁用 DNS64。启用 DNS64 后,DNS 解析器会返回 IPv4-only 终端节点的合成 IPv6 地址以及 IPv4 地址。因此,流量通过 NAT 网关(如果包含在架构中)的 NAT64 功能进行路由,而不是停留在 VPC 内,如上图所示。这可能会导致 NAT 网关的意外使用和相关成本。

EKS/IPv6 Pod 还需要使用公有 IPv4 地址通过互联网连接到 IPv4 端点,以实现类似的流程。下图描绘了 IPv6 Pod 连接到集群边界外的 IPv4 端点(可通过互联网路由)的流程:

EKS/IPv6

在上图中,Pod 将对终端节点执行 DNS 查询,在收到 IPv4 “A” 响应后,Pod 的节点专用 IPv4 地址将通过源网络地址转换 (SNAT) 转换为连接到 EC2 的主网络接口的私有 IPv4 (VPC) 地址。 Worker-node然后,Pod IPv4 地址(源 IPv4:EC2 主 IP)被路由到 IPv4 NAT 网关,在该网关中,EC2 主 IP(SNAT)被转换为有效的互联网可路由 IPv4 公有 IP 地址(NAT 网关分配的公有 IP)。

跨节点的任何 Pod-to-Pod 通信始终使用 IPv6 地址。VPC CNI 将 iptables 配置为在阻止任何 IPv4 连接的同时处理 IPv6。

Kubernetes 服务将仅接收来自唯一本地 IPv6 单播地址 (ULA) 的 IPv6 地址 (ClusterIP)。IPv6 集群的 ULA 服务 CIDR 在 EKS 集群创建阶段自动分配,无法修改。下图描绘了 Pod 到 Kubernetes 的服务流程:

EKS/IPv6

使用 AWS 负载均衡器将服务暴露在互联网上。负载均衡器接收公有 IPv4 和 IPv6 地址,又名双栈负载均衡器。对于访问 IPv6 集群 kubernetes 服务的 IPv4 客户端,负载均衡器执行 IPv4 到 IPv6 的转换。

亚马逊 EKS 建议在私有子网中运行工作节点和 Pod。你可以在公有子网中创建公共负载均衡器,对在私有子网中的节点上运行的 Pod 的流量进行负载均衡。下图描绘了互联网 IPv4 用户访问基于 EKS/IPv6 Ingress 的服务:

互联网 IPv4 用户到 EKS/IPv6 入口服务
注意

上述模式需要部署最新版本的 AWS 负载均衡器控制器

EKS 控制平面数据平面通信

EKS 将在双堆栈模式 (X-ENIs) 下配置 Cross-Account ENI (IPv4/IPv6)。Kubelet 和 kube-proxy 等 Kubernetes 节点组件被配置为支持双栈。Kubelet 和 kube-proxy 在 HostNetwork 模式下运行,绑定到连接到节点主网络接口的 IPv4 和 IPv6 地址。Kubernetes api-server 通过基于 IPv6 的与 Pod 和节点组件通信。 X-ENIs Pod 通过与 API 服务器通信 X-ENIs,而 Pod 与 api 服务器的通信始终使用 IPv6 模式。

集群的插图包括 X-ENIs

建议

基于计算资源的时间表

一个 IPv6 前缀就足以在单个节点上运行许多 Pod。这也有效地消除了对节点上最大 Pod 数量的 ENI 和 IP 限制。尽管 IPv6 消除了对 Max-Pod 的直接依赖,但当对较小的实例类型(如 m5.large)使用前缀附件时,很可能会在耗尽其 IP 地址之前很久就耗尽实例的 CPU 和内存资源。如果您使用自管理节点组或具有自定义 AMI ID 的托管节点组,则必须手动设置 EKS 建议的最大 Pod 值。

您可以使用以下公式来确定可以在 IPv6 EKS 集群的节点上部署的最大 Pod 数量。

((Number of network interfaces for instance type (number of prefixes per network interface-1)* 16) + 2
((3 ENIs)_((10 secondary IPs per ENI-1)_ 16)) + 2 = 460 (real)

托管节点组会自动为您计算最大容器组(pod)数量。避免更改 EKS 的最大 Pod 数量的推荐值,以避免因资源限制导致的 Pod 调度失败。

评估现有自定义网络的用途

如果当前启用了自定义联网,Amazon EKS 建议重新评估您对使用 IPv6 的需求。如果您选择使用自定义网络来解决 IPv4 耗尽问题,则不再需要使用 IPv6。如果您使用自定义网络来满足安全要求,例如为节点和 Pod 建立单独的网络,则建议您提交 EKS 路线图请求

集群中的 Fargate Po EKS/IPv6 d

EKS 支持在 Fargate 上运行的 Pod 使用 IPv6。在 Fargate 上运行的 Pod 将使用从 VPC CIDR 范围中划分出来的 IPv6 和 VPC 可路由私有 IPv4 地址 ()。IPv4IPv6简而言之,你 EKS/Fargate 的 Pod 集群的宽密度将仅限于可用的 IPv4 和 IPv6 地址。建议调整双栈 subnets/VPC CIDR 的大小,以适应未来的增长。如果底层子网不包含可用的 IPv4 地址,则无论 IPv6 可用地址如何,你都无法安排新的 Fargate Pod。

部署 AWS 负载均衡器控制器 (LBC)

上游树内 Kubernetes 服务控制器不支持 IPv6。我们建议使用最新版本的 AWS 负载均衡器控制器插件。LBC 只有在使用相应的 kub service/ingress ernetes 定义后才会部署双栈 NLB 或双栈 ALB,这些定义注解为:和 "alb.ingress.kubernetes.io/ip-address-type: dualstack" "alb.ingress.kubernetes.io/target-type: ip"