hyneriahope 2019-02-26
在Kubernetes诞生之前很久,大约20年前就已经指定了有限数量的公共IPv4地址和IPv6地址空间来解决互联网寻址问题。Kubernetes最初是在Google内部开发的,而且近年来才开始支持像Google和AWS这样的云服务,所以Kubernetes最初只支持IPv4。
对于已经致力于使用IPv6的企业而言,这可能是一个问题,而且对于需要太多IP地址的物联网设备而言更加重要。“物联网客户使用IPv6部署各种设备和边缘设备,”微软首席软件工程师Khaled Henidak指出,他致力于Azure的容器服务,并协调微软对Kubernetes的上游贡献。
运营商和电信公司也对采用Kubernetes感兴趣,比如美国最大运营商AT&T正在使用Kubernetes作为其用于运行5G和公共安全网络服务的Airship项目的基础。但他们已经部署了大量的IPv6,尤其是移动网络。大约90%的T-Mobile USA和Verizon Wireless流量已经是IPv6;对康卡斯特和AT&T而言,这个比例约为70%。
截至2017年,全球IP地址注册商只有3个新的IPv4地址可供分配(其中没有一个在美国,因此任何需要更多IPv4地址的人,都必须找到愿意出售他们的人)。
这意味着即使是那些因为使用像NAT这样的技术来解决地址短缺,而放慢IPv4速度的企业也会遇到问题,Google Cloud的首席软件工程师Tim Hockin表示。“Kubernetes非常自由地使用IP地址(每个Pod一个IP),这简化了系统并使其更易于使用和理解。对于非常大的安装,IPv4可能很难。发现大型企业已经“切断”其网络中的私有IPv4空间并不罕见,因此为Kubernetes集群寻找空间可能很难或不可能。IPv6使IP空间实际上是无限的。”
Kubernetes 1.9中添加了支持IPv6的集群的支持作为alpha功能,而对于版本1.13,Kubernetes默认DNS服务器更改为具有完全IPv6支持的CoreDNS。
“从支持[IPv6支持]回到测试版和遗传算法的唯一方面是与我们的自动化测试进行更深层次的集成,这是由我们的开发人员社区推动的,”Hockin说。
Kubernetes中的内置桥接网络使用Linux iptables功能实现; “iptables一段时间以来一直是对IPv6友好的,”Henidak指出。如果你正在使用容器网络接口(CNI)堆栈进行联网,那么像Project Calico这样的插件可让你禁用IPv4并为pod启用IPv6。
他指出,迁移到IPv6集群不应该做很多工作,但有一些事情需要注意。“如果你的网络基础设施和应用程序已经为IPv6做好准备,那么改变Kubernetes使用纯IPv6对于Kubernetes(dev或ops)用户来说应该不是特别困难。每个主要的操作系统都支持IPv6,大多数开源应用程序都可以在IPv6环境中运行。可能需要审核执行网络相关内容的自定义应用程序,以确保它们对IPv6安全。例如,IPv4地址通常存储在32位整数变量中,但IPv6地址不适合。”
双栈
但是,仅仅支持单个地址系列,无论是IPv4还是IPv6,都是不够的,因为它不能让Kubernetes轻松适应它需要集成的所有其他基础设施。
“Kubernetes并不孤立地运行;它在本地运行,需要与其他应用程序进行交互,或者主要是在云上运行,”Henidak指出。“如果我有一个应用程序,并通过负载均衡将其提供给外部,我在外部有一个IP,如果我的Kubernetes集群是IPv4或IPv6,那么该地址将只是IPv4或IPv6。如果我的网络仅使用一个地址空间和一个地址系列,则所有内容都必须位于同一系列中。如果我将我的节点作为IPv6,那么节点的客户端必须是IPv6,数据库必须是IPv6。这会产生问题,因为实际上很少有人将100%的所有内容用作IPv6。”
使用IPv6设备的物联网客户可以运行IPv6 Kubernetes集群供他们连接,但正如他指出的那样,“但这些集群还需要连接到内部运行或在另一个集群中运行的后端应用程序,甚至连接到只能与IPv4通信的云服务。”
在网络中没有复杂的IPv4/IPv6转换机制的情况下进行这项工作需要双栈网络,其中每个pod都分配了IPv4和IPv6地址,因此它可以与IPv6系统以及使用IPv4的传统应用和云服务进行通信。
AWS拥有最广泛的IPv6支持,但并未涵盖所有服务。15个AWS区域对EC2实例提供IPv6支持,为Elastic Load Balancing提供可公共路由的IPv6地址,通过双栈端点访问S3存储,对从设备传递到AWS IoT服务的消息提供IPv6支持,为公共和私有提供双栈支持具有Route Connect的虚拟接口,具有Route 53的IPv6端点的IPv6 DNS查询和运行状况检查,以及对CloudFront,Web应用程序防火墙和S3传输加速的IPv6支持。
自2016年以来,大多数Azure区域都通过负载均衡支持双栈VM ,并且私有预览了完整的IPv6双栈支持;一旦可用,Henidak表示将推出AKS和AKS Engine等工具(它使用Azure Resource Manager模板在Azure IaaS上引导Kubernetes集群。
“GCP在VPC网络中没有IPv6支持,但是,”Hockin指出,谷歌员工在GitHub上讨论了有关双栈支持的问题,该服务正在测试GCE内部的一些原型双栈配置。
为Kubernetes添加双栈支持需要比单独支持IPv6更多的工作,并且社区已经在一段时间内致力于Kubernetes增强建议。而不是采用简单的方法只为pod和节点提供双栈地址,而是使用单个系列 ,所有IPv4或所有IPv6,用于集群中的服务IP,这是一个真正的双栈实现,支持两个pod的IPv4和IPv6和服务。
由于应用程序使用完全限定的域名进行服务发现,因此集群中的DNS需要知道它是运行IPv4,IPv6还是双栈。。
增强项目将使用Bridge和PTP CNI插件以及Host-Local IPAM插件测试双栈功能。“有多个网络提供商都有自己的基于CNI堆栈的解决方案,”Henidak指出。“他们可能依赖于本机Linux内核功能或他们自己的实现,当Kubernetes迁移到IPv6双栈时,他们需要提供自己的双栈实现。”
像NGINX这样的Ingress控制器也需要提供双栈支持;在这两种情况下,网络提供商可能已经在其他环境中支持IPv6,但之前没有将它带到Kubernetes,因为它不是双栈。
“目前的考虑是,服务将有一个ID,上面写着'我希望将其提供为IPv4或IPv6',”他解释道。这是你为互操作性做出的选择。“如果我的Kubernetes应用程序在双栈模式下运行,那么它们有来自不同家族的多个IP地址;如果我将此作为IPv4公开,则意味着仅具有IPv4功能的客户端将能够与此服务进行通信,或者对于IPv6进行通信。这样,人们可以从指向同一个应用程序的两个不同系列中获取两个IP地址,从而支持多个客户端。无论客户端能够做什么,他们都能够进入集群。”
目的是在不中断现有实现和部署的情况下添加新功能。“主要原则不是打破任何东西,”Henidak说。“Kubernetes上有很多工具,很多客户都在调用Kubernetes API,他们期望从服务中获得某些输入和输出。我们想要转移到双栈的新工作,而不会破坏任何这一点,同时允许客户端的最大价值。”
这意味着该项目将在未来版本的Kubernetes中经历通常的alpha,beta和GA阶段,以便有时间进行测试,但这需要一些时间。“对Kubernetes的双栈IPv6支持或多或少是设计完整的,”Hockin说。“我们有一个非常好的Kubernetes增强建议,但这项工作已经停滞不前了。在完成这项工作之前,还将有一些发布。”
如果在更改达到Kubernetes的发布版本(Henidak估计将需要大约9个月)之前需要双栈IPv6支持,你可以在IPv6模式下运行集群并通过设置有状态NAT64和DNS64服务器来处理地址转换连接到外部,仅限IPv4的服务器,双栈入口控制器,负载平衡到集群中的仅IPv6端点,以及具有IPv4到IPv6映射的无状态NAT64服务器,以便仅IPv4外部客户端访问Kubernetes容器或他们公开的服务。
Henidak预测,新提案的最早采用者将是大型物联网用户。“我有客户说,‘我想要IPv6,我现在想要它'。即使是在早期阶段测试它并提供反馈,那些人也会立即接受,社区中的用户都希望与这些早期采用者接触。“
“然后有些人现在对IPv4很了解,但他们知道将来他们需要跟踪提案的IPv6。他们告诉我们‘我的网络上的IPv4空间不足,我已经将我的内部网络转换为IPv6,我需要双堆栈来与我的云托管Kubernetes集成。”