AWS 支持使用 NAT64 从仅 IPv6 节点连接到仅 IPv4 的外部服务。是否有相反的等效方法?
就上下文而言,我有一个 EKS 集群,它目前仅支持 IPv4,全部位于私有子网上。与任何外部 IP 的通信都是通过 NAT 网关进行的(通常用于 webhook 或类似的出站请求)。现在一些外部服务正在切换到仅支持 IPv6。有没有办法在不将整个集群迁移到 IPv6 的情况下连接到这些服务?由于 EKS 不支持双栈网络,因此迁移可能是一个相当大且有风险的项目。
答案1
不,IPv4 源 IPv6 目标远没有那么简单。与采用另一种方式或原生 IPv6 相比。
DNS64 + NAT64这是一种在仅 IPv6 网络中用于连接到 v4 的过渡机制,它很简单。一个很小的 v6 前缀可以包含整个 v4 地址空间。当结果只有 A 记录时,Fancy DNS 会在此前缀中生成 AAAA 记录。而双栈 NAT 只需进行简单的无状态 1 对 1 转换,速度很快,不需要配置。
对比另一种方式。假设远程服务的地址是 2001:db8:114:6614:240e:6d9d:8a1d:59d3
整个 32 位 IPv4 地址空间只能包含最后两位数字组,即 8a1d:59d3
部分。因此,花哨的 DNS 技巧和未修改的应用程序将不起作用。理论上,双栈代理可以终止 v4 连接并使 v6 连接出去。但是您将如何获取 v6 地址,解析 DNS 或 TLS 中的名称的应用程序流量?以及如何保持流量畅通,有状态 NAT?
然而,Kubernetes 对网络有自己的想法,EKS 也不例外。虽然它不仅仅是接入 NAT64,EKS 具有双栈设计。v6 已分配给 pod,但还有一个仅限主机的 v4,在 v4 连接到互联网的情况下,该 v4 会进行几次 NAT。
请注意,应用程序上的 v6 到互联网上的 v6 是多么简单,无需 NAT 即可通过出口互联网网关。获得与 v6 外部资源的这种连接是贵组织这样做的原因。此外,还可以消除对根据 pod 数量调整子网大小的担忧。
实现这一点并将其应用于现代互联网是一个项目,是的。EKS 上的 IPv6 检查表必须使用 v6 创建集群。
你可以做这个项目。用这个新设计创建第二个集群。在其上启动新应用程序,并在有维护机会时迁移其他应用程序。如果有问题,请制定恢复计划,以恢复到以前的样子。在最坏的情况下,旧集群可以按原样重建。毕竟,这是基础设施即代码。
答案2
该选项在文档中相当隐蔽,但可以从 IPv4 EKS 集群进行 IPv6 出口。这可以使用启用 V6 出口vpc-cni 插件上的选项。
这会为每个 pod 配置一个“fd00::ac:00/118”范围内的节点私有地址。对于外部端点,pod 随后会通过节点执行 NAT。
从技术上讲,这不是“IPv4 到 IPv6 NAT”,但它确实实现了 IPv4 EKS 集群上 IPv6 出口的目标。
所需步骤:
- 在 VPC 和子网上分配 IPv6 块,并在子网上启用“自动分配 IPv6 地址”。添加仅出口互联网网关并适当配置路由表。
- 轮换所有节点以在每个节点上分配一个 IPv6 地址。
- 确保 vpc-cni 插件为 1.13+ 版本。
- 使用以下配置更新 vpc-cni 插件:
{"env":{"ENABLE_V6_EGRESS":"true"},"init":{"env":{"ENABLE_V6_EGRESS":"true"}}}
。仅在轮换所有节点后执行此操作,否则推出将失败。