Windows Linux与Kubernetes的Linux处于同等地位

编者注:今天的帖子由Microsoft首席PM经理Jason Messer撰写,内容涉及对Windows网络堆栈的改进,以支持Kubernetes CNI模型。

自从我上次写博客以来 适用于Windows的Kubernetes网络 在四个月前,Windows Core Networking团队在平台和开源Kubernetes项目上均取得了巨大进步。通过更新,在网络方面,Windows现在可以与Linux媲美。客户现在可以在任何环境(包括Azure,本地和第三方云堆栈)上部署具有OS的混合OS,Kubernetes集群,并且具有Linux支持的相同网络原语和拓扑,而无需任何变通办法,“黑客”或第三方交换机扩展名。

您可能会问:“那又怎样?”这些平台改进对希望运行Kubernetes的开发人员和运营团队的生活产生重大影响的原因有很多与应用程序和基础架构相关的原因。请继续阅读以了解更多信息!

紧密耦合的沟通

这些改进可在单个““将Pods视为Kubernetes集群的调度单位,在其中,一个或多个应用程序容器位于同一位置并能够共享存储和网络资源。Pod中的所有容器共享相同的IP地址和端口范围,并且能够使用localhost相互通信,这使应用程序可以轻松地利用“帮助程序”来执行诸如监视,配置更新,日志管理和代理之类的任务。另一种将Pod视为应用程序的计算主机的方法代表过程的容器。

简化的网络拓扑

我们还将Kubernetes集群中Windows节点上的网络拓扑简化了,方法是将每个容器(或更一般地说,每个Pod)所需的端点数量减少到一个。以前,在Kubernetes集群中运行的Windows容器(pod)需要两个终结点-一个用于外部(互联网)通信,另一个用于集群中其他节点或pod之间的集群内通信。这是由于以下事实:来自连接到具有本地范围(即,不可公开路由)的主机网络的容器的外部通信需要NAT操作,该操作只能通过主机上的Windows NAT(WinNAT)组件提供。集群内部通信要求容器通过第二端点连接到具有“全局”(集群级别)范围的单独网络。现在,最近的平台改进使NAT''ing可以直接在通过Microsoft虚拟过滤平台(VFP)Hyper-V交换机扩展实现的容器终结点上进行。现在,外部和集群内部流量都可以流经单个端点。

在Windows内核中使用VFP进行负载平衡

Kubernetes工作者节点依靠kube-proxy负载均衡入口网络流量到集群中Pod之间的服务IP。 Windows的早期版本通过用户空间代理实现了Kube-proxy的负载平衡。我们最近添加了对“代理模式:iptables”的支持,该支持在Windows内核中使用VFP实现,以便Windows OS内核可以更有效地平衡任何IP流量。用户还可以通过在服务定义中指定externalIP参数来配置外部负载均衡器。除了上述改进之外,我们还为以下各项添加了平台支持:

  • 支持每个容器/ 荚的DNS搜索后缀(Docker的改进-删除了kube-proxy以前为附加DNS后缀所做的其他工作) 
  • [平台支持]用于创建ACL的5元组规则(寻求社区的帮助以将其与对K8s网络策略的支持集成在一起)

现在,Windows Server具有 已加入Windows Insider程序,客户和合作伙伴现在可以利用这些新平台功能,这些功能将为人们热切期盼的产品,今年晚些时候发布的新功能以及六个月后的新版本提供价值。最新的Windows Server内部人员 建立 现在包括对所有这些平台改进的支持。

除了针对Windows的平台改进之外,该团队还提交了CNI,kubelet和kube-proxy的代码(PR),目的是将Windows支持集中在Kubernetes v1.8版本中。这些PR删除了Windows上先前需要的解决方法,例如用于内部负载平衡的用户模式代理,向每个Kube-DNS请求附加其他DNS后缀以及用于外部(互联网)连接的单独容器终结点。

这些新的平台功能以及在kubelet和kube-proxy上的工作与Linux上Kubernetes使用的CNI网络模型保持一致,并且无需额外的配置或自定义(Azure)资源模板即可简化K8s集群的部署。为此,我们完成了有关CNI网络和IPAM插件的工作,以创建/删除端点并管理IP地址。 CNI插件通过kubelet工作,以Windows主机网络服务(HNS)API为目标,以创建由VFP交换机扩展强制实施的“ l2bridge”网络(类似于Linux上的macvlan)。

“ l2bridge”网络驱动程序在入口和出口处重写容器网络流量的MAC地址,以使用容器主机的MAC地址。这就消除了通过容器主机所连接的上游网络交换机端口“学习”多个MAC地址(主机上运行的每个容器一个)的需求。这样可以保留物理交换机TCAM表中的内存空间,并依靠Hyper-V虚拟交换机在主机中进行MAC地址转换,以将流量转发到正确的容器。 IP地址由默认的Windows IPAM插件管理,该插件要求从容器主机的网络IP空间获取POD CIDR IP。

团队进行了演示(链接 视频)这些新平台功能和8/8上SIG-Windows组的开源更新。我们正在与社区合作,将kubelet和kube-proxy PR合并在一起,以便在今年9月发布的Kubernetes v1.8版本中及时发布这些更改。然后,可以在当前的Windows Server内部人员构建中使用这些功能,并且 Windows Server版本1709.

在RTM之后不久,我们还将在Azure容器服务(ACS)中引入这些改进,以便Windows工作者节点和托管的容器是一流的Azure VNet公民。 Windows CNI的Azure IPAM插件将使这些终结点可以通过与VM实施方式相同的Windows容器网络策略直接连接到Azure VNet。

|功能| Windows Server 2016(有价证券)|下一个Windows Server功能版本,半年频道| Linux | |每个Pod具有共享网络名称空间的多个容器(隔离专区)|每个吊舱一个容器| ✔| ✔| |每个Pod的单个(共享)端点|两个端点:WinNAT(外部)+透明(集群内) ✔| ✔| |用户模式,负载平衡| ✔| ✔| ✔| |内核模式,负载平衡|不支持| ✔| ✔| |支持每个Pod的DNS搜索后缀(Docker更新)| Kube-Proxy为每个请求添加了多个DNS后缀| ✔| ✔| | CNI插件支持|不支持| ✔| ✔|

Kubernetes SIG Windows小组于美国东部时间星期二中午12:30每两周开会一次。要加入或查看以前会议的笔记,请查看此 文件.