正在运行的IPv6EKS集群 - Amazon EKS

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

正在运行的IPv6EKS集群

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

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

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

双堆栈 VPC

在IPv6世界上,每个地址都可以通过互联网进行路由。默认情况下,IPv6CIDR从公共GUA范围内VPC分配。VPCs不支持从 RFC 4193(fd00:: /8 或 fc00:: /8ULA)定义的唯一本地地址 () 范围内分配私IPv6有地址。即使您想转让自己IPv6CIDR拥有的,也是如此。通过在中实现仅限出站的互联网网关 (EIGW),支持从私有子网导出到互联网,允许出站流量VPC,同时阻止所有传入流量。下图描绘了EKS/IPv6集群内的 Pod IPv6 互联网出口流:

双堆栈 VPC

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

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

双堆栈 VPC

概述

EKS/IPv6仅在前缀模式(VPC-CNI 插件 ENI IP 分配模式)中受支持。了解有关适用于 Linux 的前缀模式前缀模式的更多信息。

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

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

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

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

工作器子网的插图

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

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

EKS/IPv6

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

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

EKS/IPv6

在上图中,Pod 将对端点执行DNS查找,在收到 IPv4 “A” 响应后,Pod 的仅限节点的唯一IPv4地址通过源网络地址转换 (SNAT) 转换为连接到 Worker-Node 的主网络接口的私有 IPv4 (VPC) 地址。EC2然后,Pod IPv4 地址(来源IPv4:EC2主 IP)被路由到IPv4NAT网关,在那里将EC2主 IP 转化为有效的互联网可路由IPv4公有 IP 地址(NAT网关分配的公有 IPSNAT)。

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

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

EKS/IPv6

服务使用AWS负载均衡器公开到互联网。负载均衡器接收公共IPv6地址IPv4和地址,也就是双栈负载均衡器。对于访问IPv6集群 kubernetes 服务的IPv4客户端,负载均衡器会IPv4进行转换。IPv6

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

互联网IPv4用户到 EKS /In IPv6 gress 服务
注意

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

EKS控制平面和数据平面通信

EKS将在双堆栈模式 ENIs (IPv4/ENIs) 下配置跨账户 (X-IPv6)。Kubernetes 节点组件(例如 kubelet 和 kube-proxy)被配置为支持双堆栈。Kubelet 和 kube-proxy 在某种 hostNetwork 模式下运行,并绑定到两者IPv4,IPv6地址连接到节点的主网络接口。Kubernetes api 服务器通过 X-is 基础与 Pod 和节点组件进行通信。ENIs IPv6Pod 通过 X-与 api 服务器通信ENIs,而 Pod 到 api 服务器的通信始终使用模式。IPv6

包括 X-的集群的插图 ENIs

建议

保持访问权限 IPv4 EKS APIs

EKSAPIsIPv4只能通过以下方式访问。这还包括集群终API端节点。您将无法APIs从IPv6仅有的网络访问集群终端节点。您的网络必须支持 (1) 一种IPv6过渡机制,例如NAT64/DNS64,用于促进IPv6和IPv4主机之间的通信,以及 (2) 支持IPv4端点转换的DNS服务。

基于计算资源的时间安排

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

您可以使用以下公式来确定可以在IPv6EKS集群的节点上部署的 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 的最大数量。避免更改最大 Pod 数EKS的建议值,以避免由于资源限制而导致的 Pod 调度失败。

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

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

/Cluster 中的 EKS Fargate Pods IPv6

EKS支持IPv6在 Fargate 上运行的 Pod。在 Fargate 上运行的 Pod 将消耗IPv6从VPCCIDR范围 (IPv4&) 中刻出的VPC可路由私有IPv4地址。IPv6简而言之 EKS/Fargate Pods cluster wide density will be limited to the available IPv4 and IPv6 addresses. It is recommended to size your dual-stack subnets/VPCCIDRs,你是为了未来的增长。如果底层子网不包含可用地址,则无论可用IPv4地址如何,都无法安排新的 Fargate Pod。IPv6

部署 Loa AWS d Balancer 控制器 (LBC)

上游的树内 Kubernetes 服务控制器不支持。IPv6我们建议使用最新版本的 Loa AWS d Balancer Controller 附加组件。只有在使用相应的 kubernetes service/ingress 定义ALB时才LBC会部署双堆栈NLB或双堆栈,并标注为:和 "alb.ingress.kubernetes.io/ip-address-type: dualstack" "alb.ingress.kubernetes.io/target-type: ip"

AWSNetwork Load Balancer 不支持双栈UDP协议地址类型。如果您对低延迟、实时流媒体、在线游戏和物联网有强烈的需求,我们建议您运行IPv4集群。要了解有关管理UDP服务运行状况检查的更多信息,请参阅 “如何将UDP流量路由到 Kubernetes”。

📝 编辑此页面 GitHub