热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析

0x00起因昨天,我在研究容器网络的时候,同事突然问了我一个问题:Kubernetes上的容器能支持跨主机二层通信?这个问题一下把我问住了,我感觉自己这几天的容器网络都白学了,我竟
0x00 起因

昨天,我在研究容器网络的时候,同事突然问了我一个问题: Kubernetes 上的容器能支持跨主机二层通信?这个问题一下把我问住了,我感觉自己这几天的容器网络都白学了,我竟然无言以对。。但这个问题也激起了我强烈的好奇心,我怎么也要弄个明白。

0x01 思考

在被问到这个问题后,我开始进行了思考。首先无论是 IaaS 平台的网络或者是 PaaS 平台的网络架构跨宿主机通信的方式主要也就以下几种方式:

  • Host-gw
  • UDP
  • VXLAN
  • GRE
  • IPSec

其实从根本上看,我认为只有 Overlay 网络和 Host-gw 这两种。Overlay 在我看来就是和隧道协议的原理是差不多的,就是在承载网络协议上面再定义新的协议。而 Host-gw 则是通过配置路由了,使宿主机成为一个路由器,像是把网络架构从三维压缩到了二维,从而让容器和宿主机展开在同一平面上。

但由于 Host-gw 通过宿主机进行了路由转发, 自然两个宿主机上把原始容器的 mac 地址也修改了,无疑是无法进行二层通信的。而 UDP 封装的是三层的数据包,所以也是无法进行链路层通信的。那么只剩下 VXLAN 了。

VXLAN 相比 UDP 和其他的一些隧道协议的好处如数据包内核态封装解封装,24位 VXLANID,支持组播和二层通信等等。所以我把希望全部寄托在 VXLAN 上了。加上之前有搭建过 OpenStack 并且平时也经常使用云主机,同一 VPC 内的云主机可以二层通信这我是知道的。所以我认为在 Kubernetes 上使用 VXLAN 也是可以二层通信的。

然而,事实并没有这么简单。首先让我们看一下 IaaS 平台上 VXLAN 是如何工作的。

0x02 VXLAN in OpenStack

协议图

在 IaaS 平台上,VXLAN 的协议格式如下图所示:

《Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析》
可以看到跨宿主机通信的报文就是 外层数据帧 + VXLAN 头 + 内层数据帧。
那么问题来了,两台虚拟机通信,一台是是 A,一台是 B,他们通信存在如下问题:

  1. A 往 B 发数据时,A 是怎么知道 B 的 mac 地址的呢?
  2. 谁能知道 A 和 B 的宿主机的 IP 地址?
  3. 谁来封装和解封装 A 和 B 的数据包?

答案是 VTEP,所有宿主机上的 VTEP 都在一个组播组内,他们之间通过组播通信,所以上面的这几件事都是 VTEP 负责干。那么自然 VTEP 知道各台虚拟机在哪台宿主机上了,不知道就在组播组内问一下,然后自己学习记住 mac 地址。如下图所示:

《Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析》

在 VTEP 的帮助下,各个虚拟机就能达到了跨宿主机通信的目的。

0x03 VXLAN in kubernetes

Kubernetes 上的网络管理需要通过第三方的插件,如 Flannel,weave,calico 等。这里我们使用 Flannel VXLAN。在Kubernetes 上使用 VXLAN 同样也要新建一个 VTEP 设备,如 flannel.1。

本以为,在 IaaS 平台上,使用 VXLAN 协议可以跨主机二层通信,那么同样在 Kubernetes 上 使用 VXLAN ,容器也可以实现二层通信啦?然而事实证明我还是太年轻了。

在容器里面用 tcpdump 抓包发现,内层报文的源 mac 地址和目的 mac 地址并不是容器的的 mac 地址,而是源宿主机和目标宿主机 flannel.1 的 mac 地址,如下图所示:

《Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析》

这就让人很困惑了,这又是为啥呢。原来 VTEP 是个链路层的端点设备,在 OpenStack 等 IaaS 平台上多是用 OpenvSwitch 来实现 VTEP 的功能,OpenvSwitch 的功能非常强大,他可以自动的学习各个宿主机上的虚拟机的 mac 地址,并且通过 openflow 协议的流表做数据包的操作。

而在 Kubernetes 上就不一样了, VTEP 他并不是通过组播的方式来学习容器的 Mac 地址。而是每台 Kubernetes node 启动时,flannel 进程会把他的子网, flannel.1 网卡 mac 地址写入到 Etcd 里面,并下发到每台 node 上,从而每台主机上都会建立发往目标网段的路由,并由 flannel.1 发出。如下图所示:

《Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析》

然而此时 flannel.1 只知道发送目标 flannel.1 的 mac 地址,并不知道对方的宿主机 ip,那么怎么封装外层帧呢?这个时候 flannel 设备会查到 FBD,根据 mac 地址找到对方的宿主机地址 ip。同时,VTEP 还把 VNI 设置为 1,这个也是 VTEP 识别是不是归自己处理的数据帧的一个重要的标识,并最终组装成如下所示的包发往对方:

《Kubernetes能保证链路层的连通性吗?IaaS和SaaS平台VXLAN对比分析》

那么也就可以解释为什么内部数据帧的 mac 地址为什么是 VTEP 设备的 mac 地址了。

0x04 结论

至此,我们可以得出结论了。Kubernetes 无法保证二层网络互通,因为 flannel.1 设备并没有学习到容器的 mac 地址,所以如果一个容器 A 发往容器 B ,那么容器 A 并不知道容器 B 的 mac 地址。
那么如果想要实现容器跨主机二层通信,那么可能需要像 OpenvSwtich 一样,所有的 VTEP 设备加入到一个组播组中,并且要具有学习 mac 的能力。

0x05 总结

VXLAN 的一些功能 flannel 都没有用到,比如flannel 上 VXLAN 的VNI 都是设置为 1,无法对网络做一个隔离。总的来说在 flannel 使用 VXLAN更多的只是作为 UDP 模式的一种替代,只是把封装、解封装放在内核态了,并且从三层降为二层。当然,一般情况下容器网络三层互通也够用了。


推荐阅读
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • HSRP热备份路由器协议的应用及配置
    本文介绍了HSRP热备份路由器协议的应用及配置方法,包括设计目标、工作原理、配置命令等。通过HSRP协议,可以实现在主动路由器故障时自动切换到备份路由器,保证网络连通性。此外,还介绍了R1和R2路由器的配置方法以及Sw1和Sw2交换机的配置方法,最后还介绍了测试连通性和路由追踪的方法。 ... [详细]
  • 介绍一款好用的内网穿透工具FRP
    本文介绍了一款好用的内网穿透工具FRP,它是一个使用Go语言开发的高性能的反向代理应用。FRP支持多种协议类型,并且可以根据域名进行路由转发。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 计算机网络计算机网络分层结构
    为了解决计算机网络复杂的问题,提出了计算机网络分层结构。计算机网络分层结构主要有OSI7层参考模型,TCPIP4层参考模型两种。为什么要分层不同产商 ... [详细]
author-avatar
手艺人生大姑娘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有