亚马逊AWS官方博客
使用 dualstack ALB/NLB 结合 TargetGroupBinding 为仅有 IPv4 的 Kubernetes 服务提供 IPv6 接入
背景
随着物联网、工业互联网、5G 的快速发展,网络应用对 IP 地址的需求呈现出爆炸式的增长,而与之相对应的 IPv4 地址分配已全部耗尽。因此,越来越多的企业在逐步开始转向使用 IPv6。
IPv6 的全称是 Internet Protocol version 6,即互联网协议第 6 版。IPv4 中规定 IP 地址长度为 32,即有 2^32 个地址;而 IPv6 中 IP 地址的长度为 128,即有 2^128 个地址,其地址空间增大了 2^96 个。其次 IPv6 具有更高的安全性,通过 IPv6 协议的安全机制,可对网络层的数据进行加密,对 IP 报文进行校验,这提高了数据的安全性。
但是企业在转向 IPv6 的过程不是一蹴而就的,企业拥有非常多的应用和系统是基于 IPv4 的,如何迅速、尽量减少应用和网络的重新规划和部署,成为一个非常关键的问题。
本文将演示如何使用双栈的网络负载均衡器(NLB)来提供 IPv6 的接入点,接入到 IPv4 的 Amazon EKS 服务。
*注意*
Amazon EKS 目前无法提供双栈的 service 和 pod,仅仅支持将 IPv6 和 IPv4 同时分配给 EKS(Amazon Elastic Kubernetes Service)工作节点。
AWS VPC
1)支持在创建 VPC 时,可以选择”IPv4 & IPv6″ 的资源类型,这样 VPC 和其中的资源(如子网、网络接口等)将同时分配 IPv4 和 IPv6 地址。这种模式下,资源可以使用两种协议进行通信。
2)也可以在 VPC 中,单独为 IPv6 分配一个 CIDR 块,这个 CIDR 与 IPv4 CIDR 是完全独立的,所有 VPC 资源将获得一个 IPv6 地址,来自这个 CIDR 块。本文我们将重点讨论第二种方式。
AWS 提供的网关资源,如 IGW(Internet Gateway)– 互联网网关、Nat Gateway(NAT)网关等,都支持 IPv4 和 IPv6 双协议栈。因此 AWS 的 IGW、 NAT 都不需要额外的工作即可支持双栈。
需要注意的是,安全组入站和出站规则需要根据实际的业务需要设置 IPv4 和 IPv6 CIDR 块,从而控制流量。同理,VPC 路由表也需要配置 IPv4 和 IPv6,用于控制不同协议的流量路由。
前置条件:
- Amazon EKS 集群,已经安装好 AWS ALB Ingress Controller v2,支持 TargetGroupBinding CRD;
- VPC,本文中以 2 个公有子网和两个私有子网的 VPC 为例。
为 VPC 分配 IPv6 CIDR
修改 VPC CIDR 的时候,我们选择 Amazon 提供的 IPv6 CIDR 块,为现有的仅有 IPv4 的 VPC 分配 IPv6 地址块不会影响现有的工作负载:
分配完成之后检查 VPC 的 CIDR:
修改 NLB/ALB 子网的 CIDR 以及路由配置
我们将 IPv6 的 CIDR 切割成 60 位的子 CIDR,2406:da18:c4e:d900::/56 可以切割成为 16 个 60 位的子网段,对于不需要分配 IPv6 的子网,我们可以选择性不分配,比如 EKS 运行 worker node 的子网和现有的 EC2 资源的子网等,而仅仅分配 IPv6 给需要对外提供 IPv6 服务的子网,比如公有子网:
本文将 NLB 配置在公有子网,我们为这些公有子网设置 IPv6 路由,我们将::/0 指向 IGW:
配置双栈 NLB
如下图所示,我们将同时分配 IPv4 和 IPv6 同时分配给 NLB,并且选择我们分配了 IPv6 的公有子网:
NLB 子网设置如下:
目标组设置
因为我们不希望改变任何现有 EKS 的设置,包括原有的 IPv4 的服务暴露方式,比如 4 层的 service 和 7 层的 alb ingress。我们这里使用 ALB Ingress Controller 的 TargetGroupBinding 来连接现有的 service 和双栈的 NLB。因此我们为 NLB 先创建一个目标组(targetgroup),这个 targetgroup 通过 IP 的方式连接到现有的 pods。
因为 EKS 的服务使用 IPv4,因此,这个目标组使用 IPv4:
创建 TargetGroupBinding
TargetGroupBinding 是一种 Kubernetes 的自定义资源(CR),它可以使用现有的 ALB TargetGroup 或 NLB TargetGroup 来暴露在 Kubernetes 中部署的服务。
有了 TargetGroupBinding,我们可以在 Kubernetes 之外按照实际的业务需求来配置负载均衡器,将流量转发到现有的 Kubernetes Service 上面,从而达到复用负载均衡器或者是流量灰度的功能。
AWS LoadBalancer Ingress Controller 实际上也是使用 TargetGroupBinding 来支持 Ingress 和 Service,它会自动在 Service 所在的同一命名空间中创建 TargetGroupBinding。
我们下面的定义文件来创建一个 TargetGroupBinding:
创建完成之后,我们会看到对应的 service 的 endpoint(pod ip)会成功注册到前面所创建的目标组:
验证 NLB IPv6 的连通性
结论
通过使用双栈的 ALB/NLB,结合 ALB ingress controller 的 TargetGroupBinding 的功能,可以迅速、无损地为客户端提供 IPv6 的接入方式,而无须更改现有的 IPv4 Kubernetes 服务。
参考资料
ALB Ingress Controller – TargetGroupBinding
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.5/guide/targetgroupbinding/targetgroupbinding/
Amazon EKS IPv6
https://docs.thinkwithwp.com/zh_cn/eks/latest/userguide/cni-ipv6.html
IPv6 最佳实践白皮书
https://docs.thinkwithwp.com/zh_cn/whitepapers/latest/ipv6-on-aws/scaling-the-dual-stack-network-design-in-aws.html