亚马逊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,用于控制不同协议的流量路由。

前置条件:

  1. Amazon EKS 集群,已经安装好 AWS ALB Ingress Controller v2,支持 TargetGroupBinding CRD;
  2. 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:

apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: 2048-tgb-old
  namespace: game-2048
spec:
  serviceRef:
    name: service-2048 # route traffic to the awesome-service
    port: 80
  targetGroupARN: arn:aws:elasticloadbalancing:ap-southeast-1:xxxxxxx:targetgroup/2048-target-group/xxxxx

创建完成之后,我们会看到对应的 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.aws.amazon.com/zh_cn/eks/latest/userguide/cni-ipv6.html

IPv6 最佳实践白皮书
https://docs.aws.amazon.com/zh_cn/whitepapers/latest/ipv6-on-aws/scaling-the-dual-stack-network-design-in-aws.html

本篇作者

李俊杰

亚马逊云解决方案架构师,负责云计算方案的咨询与架构设计,同时致力于容器方面研究和推广。在加入亚马逊云科技之前曾在金融行业 IT 部门负责传统金融系统的现代化改造,对传统应用的改造,容器化具有丰富经验。

林旭芳

亚马逊云科技解决方案架构师,主要负责亚马逊云科技云技术和解决方案的推广工作,在 Container、主机、存储、容灾等方向有丰富实践经验。