

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

# 运行 IPv6 EKS 集群
<a name="ipv6"></a>

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

[![AWS Videos](http://img.youtube.com/vi/zdXpTT0bZXo?rel=0/0.jpg)](http://www.youtube.com/watch?v=zdXpTT0bZXo?rel=0)


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

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

![双堆栈 VPC](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_eks-ipv6-foundation.png)


在 IPv6 世界中，每个地址都可以通过互联网进行路由。默认情况下，VPC 会从公共 GUA 范围内分配 IPv6 CIDR。但是，自 [2024 年 8 月](https://aws.amazon.com/about-aws/whats-new/2024/08/aws-private-ipv6-addressing-vpcs-subnets/)起，您还可以通过亚马逊 VPC IP 地址管理器 (IPAM) 为 VPC 和子网使用私有 IPv6 寻址。有关更多信息，请参阅[此 AWS 网络博客文章](https://aws.amazon.com/blogs/networking-and-content-delivery/understanding-ipv6-addressing-on-aws-and-designing-a-scalable-addressing-plan)和 [VPC 文档](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#vpc-ipv6-addresses)。

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

![双堆栈 VPC](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_eks-egress-ipv6.png)


在 V [PC 用户指南](https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/IPv6-on-AWS.html)中可以找到实施 IPv6 子网的最佳实践。

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

![双堆栈 VPC](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_eks-cluster-ipv6-foundation.png)


## 概述
<a name="_overview"></a>

EKS/IPv6 仅在前缀模式（VPC-CNI Plug-in ENI IP 分配模式）中支持。了解有关[前缀模式](prefix-mode-linux.md)的更多信息。

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

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

IPv6 前缀分配仅在 EKS 工作节点引导时发生。众所周知，这种行为可以缓解由于旨在及时分配私有 IPv4 地址的 VPC CNI 插件 (ipamd) 生成的 API 调用受限，Pod 流失率高的 EKS/IPv4 集群经常在 Pod 调度中延迟的情况。众所周知， VPC-CNI 插件会不必要地调高高级旋钮 [WARM\_IP/ENI*，MINIMUM\_IP*](https://github.com/aws/amazon-vpc-cni-k8s#warm_ip_target)。

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

![工作器子网的插图](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_image-2.png)


每个 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](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_eks-ipv4-snat-cni.png)


在上图中，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](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_eks-ipv4-snat-cni-internet.png)


在上图中，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 配置为处理 IPv6，同时阻止任何 IPv4 连接。

Kubernetes 服务将仅接收来自唯一本[地](https://datatracker.ietf.org/doc/html/rfc4193) IPv6 单播地址 (ULA) 的 IPv6 地址 (clusterIP)。IPv6 集群的 ULA 服务 CIDR 是在 EKS 集群创建阶段自动分配的，无法修改。下图描述了 Pod 到 Kubernetes 的服务流程：

![EKS/IPv6](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_Pod-to-service-ipv6.png)


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

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

![互联网 IPv4 用户到 EKS/IPv6 入口服务](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_ipv4-internet-to-eks-ipv6.png)


**注意**  
上述模式需要部署[最新版本](https://kubernetes-sigs.github.io/aws-load-balancer-controller)的 AWS 负载均衡器控制器

### EKS 控制平面数据平面通信
<a name="_eks_control_plane_data_plane_communication"></a>

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

![集群的插图包括 X-ENIs](http://docs.aws.amazon.com/zh_cn/eks/latest/best-practices/images/networking/ipv6_image-5.png)


## 建议
<a name="_recommendations"></a>

### 基于计算资源的时间安排
<a name="_schedule_based_on_compute_resources"></a>

一个 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 调度失败。

### 评估现有自定义网络的用途
<a name="_evaluate_purpose_of_existing_custom_networking"></a>

如果当前启用了[自定义联网](https://docs.aws.amazon.com/eks/latest/best-practices/custom-networking.html)，Amazon EKS 建议您重新评估您对 IPv6 的需求。如果您选择使用自定义网络来解决 IPv4 耗尽问题，则不再需要使用 IPv6。如果您使用自定义网络来满足安全要求，例如为节点和 Pod 设置单独的网络，我们建议您提交 [EKS 路线图请求](https://github.com/aws/containers-roadmap/issues)。

### 集群中的 Fargate 吊舱 EKS/IPv6
<a name="_fargate_pods_in_eksipv6_cluster"></a>

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

### 部署 AWS Load Balancer 控制器 (LBC)
<a name="_deploy_the_aws_load_balancer_controller_lbc"></a>

 **上游的树内 Kubernetes 服务控制器不**支持 IPv6。我们建议使用[最新版本](https://kubernetes-sigs.github.io/aws-load-balancer-controller)的 AWS Load Balancer 控制器附加组件。LBC 只有在使用带有以下注释的相应的 kub service/ingress ernetes 定义后才会部署双栈 NLB 或双栈 ALB `"alb.ingress.kubernetes.io/ip-address-type: dualstack"` `"alb.ingress.kubernetes.io/target-type: ip"` 