Kubernetes网络详解
Kubernetes⽹络详解
关于汉字的谜语简介
Kubernetes 对容器技术做了更多的抽象,其中最重要的⼀点是提出 pod 的概念,pod 是 Kubernetes 资源调度的基本单元,我们可以简单地认为,从⽹络的⾓度来看,pod 必须满⾜以下条件:
1. 同⼀个pod内的所有容器之间共享端⼝,可直接通过localhost+端⼝来访问
2. 由于每个pod有单独的IP,所以不需要考虑容器端⼝与主机端⼝映射以及端⼝冲突问题
事实上,Kubernetes进⼀步确定了对⼀个合格集⽹络的基本要求:
1. 任意两个pod之间其实是可以直接通信的,⽆需显式地使⽤NAT进⾏地址的转换;
2. 任意集节点node与任意pod之间是可以直接通信的,⽆需使⽤明显的地址转换,反之亦然;
3. 任意pod看到⾃⼰的IP跟别⼈看见它所⽤的IP是⼀样的,中间不能经过地址转换;
也就是说,必须同时满⾜以上三点的⽹络模型才能适⽤于kubernetes,事实上,在早期的Kubernetes中,并没有什么⽹络标准,只是提出了以上基本要求,只有满⾜这些要求的⽹络才可以部署Kubernetes,
基于这样的底层⽹络假设,Kubernetes设计了pod-deployment-service的经典三层服务访问机制。直到1.1发布,Kubernetes才开始采⽤全新的⽹络标准。
⽹络⽅案
⽹络架构是Kubernetes中较为复杂、让很多⽤户头疼的⽅⾯之⼀。Kubernetes⽹络模型本⾝对某些特定的⽹络功能有⼀定要求,但在实现⽅⾯也具有⼀定的灵活性。因此,业界已有不少不同的⽹络⽅案,来满⾜特定的环境和要求。
如容器⽹络模型⼀样,对于统⼀主机上的pod之间,通过docker0⽹桥设备直接⼆层(数据链路层)⽹络上通过MAC地址直接通信:
⽽跨主机的pod之间的相互通信也主要有以下两个思路:
1. 修改底层⽹络设备配置,加⼊容器⽹络IP地址的管理,修改路由器⽹关等,该⽅式主要和SDN(Software define networking)结合。
2. 完全不修改底层⽹络设备配置,复⽤原有的underlay平⾯⽹络,解决容器跨主机通信,主要有如下两种⽅式:
隧道传输(Overlay):将容器的数据包封装到原主机⽹络的三层或者四层数据包中,然后使⽤主机⽹络的IP或者TCP/UDP传输到⽬标主机,⽬标主机拆包后再转发给⽬标容器。
Overlay隧道传输常见⽅案包括Vxlan、ipip等,⽬前使⽤Overlay隧道传输技术的主流容器⽹络有Flannel等;
修改主机路由:把容器⽹络加到主机路由表中,把主机⽹络设备当作容器⽹关,通过路由规则转发到指定的主机,实现容器的三层互通。⽬前通过路由技术实现容器跨主机通信的⽹络如Flannel host-gw、Calico等;
CNI
CNI (Container Network Interface),即容器⽹络的 API 接⼝。它是 K8s 中标准的⼀个调⽤⽹络实现的接⼝,Kubelet 通过这个标准的 API 来调⽤不同的⽹络插件以实现不同的⽹络配置⽅
式,实现了这个接⼝的就是 CNI 插件,它实现了⼀系列的 CNI API 接⼝。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。
如何使⽤ CNI
实现⼀个 CNI ⽹络插件只需要⼀个配置⽂件和⼀个可执⾏⽂件
配置⽂件描述插件的版本、名称、描述等基本信息;
可执⾏⽂件会被上层的容器管理平台调⽤,⼀个 CNI 可执⾏⽂件需要实现将容器加⼊到⽹络的 ADD 操作以及将容器从⽹络中删除的 DEL 操作(以及⼀个可选的 VERSION 查看版本操作);
Kubernetes 使⽤ CNI ⽹络插件的基本⼯作流程:
1. kubelet 先创建 pause 容器创建对应的⽹络命名空间;
2. 根据配置调⽤具体的 CNI 插件,可以配置成 CNI 插件链来进⾏链式调⽤;
3. 当 CNI 插件被调⽤时,它根据环境变量以及命令⾏参数来获得⽹络命名空间、容器的⽹络设备等必要信息,然后执⾏ ADD 操作;
4. CNI 插件给 pause 容器配置正确的⽹络,pod 中其他的容器都是复⽤ pause 容器的⽹络;
相关知识点
在对CNI插件们进⾏⽐较之前,我们可以先对⽹络中会见到的相关术语做⼀个整体的了解。不论是阅读本⽂,还是今后接触到其他和CNI有关的内容,了解⼀些常见术语总是⾮常有⽤的。第2层⽹络: OSI(Open Systems Interconnections,开放系统互连)⽹络模型的“数据链路”层。第2层⽹络会处理⽹络上两个相邻节点之间的帧传递。第2层⽹络的⼀个值得注意的⽰例是以太⽹,其中MAC表⽰为⼦层。
第3层⽹络: OSI⽹络模型的“⽹络”层。第3层⽹络的主要关注点,是在第2层连接之上的主机之间路由数据包。IPv4、IPv6和ICMP是第3层⽹络协议的⽰例。
VXLAN:代表“虚拟可扩展LAN”。⾸先,VXLAN⽤于通过在UDP数据报中封装第2层以太⽹帧来帮助实现⼤型云部署。VXLAN虚拟化与VLAN类似,但提供更⼤的灵活性和功能(VLAN仅限于4096个⽹络ID)。VXLAN是⼀种封装和覆盖协议,可在现有⽹络上运⾏。刘德华电影列表
Overlay⽹络:Overlay⽹络是建⽴在现有⽹络之上的虚拟逻辑⽹络。Overlay⽹络通常⽤于在现有⽹络之上提供有⽤的抽象,并分离和保护不同的逻辑⽹络。
封装:封装是指在附加层中封装⽹络数据包以提供其他上下⽂和信息的过程。在overlay⽹络中,封装被⽤于从虚拟⽹络转换到底层地址空间,从⽽能路由到不同的位置(数据包可以被解封装,并继续到其⽬的地)。
⽹状⽹络:⽹状⽹络(Mesh network)是指每个节点连接到许多其他节点以协作路由、并实现更⼤连接的⽹络。⽹状⽹络允许通过多个路径进⾏路由,从⽽提供更可靠的⽹络。⽹状⽹格的缺点是每个附加节点都会增加⼤量开销。
BGP:代表“边界⽹关协议”,⽤于管理边缘路由器之间数据包的路由⽅式。BGP通过考虑可⽤路径,路由规则和特定⽹络策略,帮助弄清楚如何将数据包从⼀个⽹络发送到另⼀个⽹络。BGP有时被⽤作CNI插件中的路由机制,⽽不是封装的覆盖⽹络。
CNI插件分析
通常来说,CNI 插件可以分为三种:Overlay、路由及 Underlay。
Overlay 模式的典型特征是容器独⽴于主机的 IP 段,这个 IP 段进⾏跨主机⽹络通信时是通过在主机之间创建隧道的⽅式,将整个容器⽹段的包全都封装成底层的物理⽹络中主机之间的包。该⽅式的好处在于它不依赖于底层⽹络;
路由模式中主机和容器也分属不同的⽹段,它与 Overlay 模式的主要区别在于它的跨主机通信是通过路由打通,⽆需在不同主机之间做⼀个隧道封包。但路由打通就需要部分依赖于底层⽹络,⽐如说要求底层⽹络有⼆层可达的⼀个能⼒;
Underlay 模式中容器和宿主机位于同⼀层⽹络,两者拥有相同的地位。容器之间⽹络的打通主要依靠于底层⽹络。因此该模式是强依赖于底层能⼒的。
插件选择
环境限制
不同环境中所⽀持的底层能⼒是不同的。
清朝皇帝顺序
虚拟化环境(例如 OpenStack)中的⽹络限制较多,⽐如不允许机器之间直接通过⼆层协议访问,必须要带有 IP 地址这种三层的才能去做转发,限制某⼀个机器只能使⽤某些 IP 等。在这种被做了强限制的底层⽹络中,只能去选择 Overlay 的插件,常见的有 Flannel-vxlan, Calico-ipip, Weave 等等;
物理机环境中底层⽹络的限制较少,⽐如说我们在同⼀个交换机下⾯直接做⼀个⼆层的通信。对于这种集环境,我们可以选择 Underlay 或者路由模式的插件。Underlay 意味着我们可以直接在⼀个物理机上插多个⽹卡或者是在⼀些⽹卡上做硬件虚拟化;路由模式就是依赖于 Linux 的路由协议做⼀个打通。这样就避免了像 vxlan 的封包⽅式导致的性能降低。这种环境下我们可选的插件包括 clico-bgp, flannel-hostgw, sriov 等等;
公有云环境也是虚拟化,因此底层限制也会较多。但每个公有云都会考虑适配容器,提升容器的性能,
因此每家公有云可能都提供了⼀些 API 去配置⼀些额外的⽹卡或者路由这种能⼒。在公有云上,我们要尽量选择公有云⼚商提供的 CNI 插件以达到兼容性和性能上的最优。⽐如 Aliyun 就提供了⼀个⾼性能的 Terway 插件。
功能需求
⾸先是安全需求;
K8s ⽀持 NetworkPolicy,就是说我们可以通过 NetworkPolicy 的⼀些规则去⽀持“Pod 之间是否可以访问”这类策略。但不是每个 CNI 插件都⽀持 NetworkPolicy 的声明,如果⼤家有这个需求,可以选择⽀持 NetworkPolicy 的⼀些插件,⽐如 Calico, Weave 等等。
第⼆个是是否需要集外的资源与集内的资源互联互通;
⼤家的应⽤最初都是在虚拟机或者物理机上,容器化之后,应⽤⽆法⼀下就完成迁移,因此就需要传统的虚拟机或者物理机能跟容器的 IP 地址互通。为了实现这种互通,就需要两者之间有⼀些打通的⽅式或者直接位于同⼀层。此时可以选择 Underlay 的⽹络,⽐如 sriov 这种就是 Pod 和以前的虚拟机或者物理机在同⼀层。我们也可以使⽤ calico-bgp,此时它们虽然不在同⼀⽹段,但可以通过它去跟原有的路由器做⼀些 BGP 路由的⼀个发布,这样也可以打通虚拟机与容器。
最后考虑的就是 K8s 的服务发现与负载均衡的能⼒。
K8s 的服务发现与负载均衡就是我们前⾯所介绍的,但并不是所有的 CNI 插件都能实现这两种能⼒。⽐如很多 Underlay 模式的插件,在 Pod 中的⽹卡是直接⽤的 Underlay 的硬件,或者通过硬件虚拟化插到容器中的,这个时候它的流量⽆法⾛到宿主机所在的命名空间,因此也⽆法应⽤ kube-proxy 在宿主机配置的规则。
这种情况下,插件就⽆法访问到 K8s 的服务发现。因此⼤家如果需要服务发现与负载均衡,在选择 Underlay 的插件时就需要注意它们是否⽀持这两种能⼒。
经过功能需求的过滤之后,能选的插件就很少了。经过环境限制和功能需求的过滤之后,如果还剩下 3、4 种插件,可以再来考虑性能需求。
性能需求
我们可以从 Pod 的创建速度和 Pod 的⽹络性能来衡量不同插件的性能。
Pod 的创建速度
当我们创建⼀组 Pod 时,⽐如业务⾼峰来了,需要紧急扩容,这时⽐如说我们扩容了 1000 个 Pod,
就需要 CNI 插件创建并配置 1000 个⽹络资源。Overlay 和路由模式在这种情况下的创建速度是很快的,因为它是在机器⾥⾯⼜做了虚拟化,所以只需要调⽤内核接⼝就可以完成这些操作。但对于 Underlay 模式,由于需要创建⼀些底层的⽹络资源,所以整个 Pod 的创建速度相对会慢⼀些。因此对于经常需要紧急扩容或者创建⼤批量的 Pod 这些场景,我们应该尽量选择 Overlay 或者路由模式的⽹络插件。
早安暖心的情话Pod 的⽹络性能
主要表现在两个 Pod 之间的⽹络转发、⽹络带宽、PPS 延迟等这些性能指标上。Overlay 模式的性能较差,因为它在节点上⼜做了⼀层虚拟化,还需要去封包,封包⼜会带来⼀些包头的损失、CPU 的消耗等,如果⼤家对⽹络性能的要求⽐较⾼,⽐如说机器学习、⼤数据这些场景就不适合使⽤ Overlay 模式。这种情形下我们通常选择 Underlay 或者路由模式的 CNI 插件。
主流插件介绍
由CoreOS开发的项⽬Flannel,可能是最直接和最受欢迎的CNI插件。它是容器编排系统中最成熟的⽹络结构⽰例之⼀,旨在实现更好的容器间和主机间⽹络。随着CNI概念的兴起,Flannel CNI插件算是早期的⼊门。
与其他⽅案相⽐,Flannel相对容易安装和配置。它被打包为单个⼆进制⽂件flanneld,许多常见的Kubernetes集部署⼯具和许多Kubernetes发⾏版都可以默认安装Flannel。Flannel可以使⽤Kubernetes集的现有etcd集来使⽤API存储其状态信息,因此不需要专⽤的数据存储。
Flannel配置第3层IPv4 overlay⽹络。它会创建⼀个⼤型内部⽹络,跨越集中每个节点。在此overlay⽹络中,每个节点都有⼀个⼦⽹,⽤于在内部分配IP地址。在配置pod时,每个节点上的Docker桥接⼝都会为每个新容器分配⼀个地址。同⼀主机中的Pod可以使⽤Docker桥接进⾏通信,⽽不同主机上的pod会使⽤flanneld将其流量封装在UDP数据包中,以便路由到适当的⽬标。
Flannel实现原理
了解了以上概念之后,就能说明flannel的实现原理了,为了解释清楚,把实现原理分为以下⼏个步骤:
1. 数据从Web App Frontend1这个容器发出经veth0⽹桥转发到宿主机的docker0⽹桥上
2. docker0⽹桥根据数据包的⽬的地址进⾏转发,若为⾮本机容器地址则转发给Flannel0⽹卡处理
3. Flannel0⽹卡交给flanneld这个进程处理,flanneld通过查询etcd,到⽬的容器地址,并进⾏转发
4. 数据包到达⽬的主机,经flanneld解包,最后由docker0转发到⽬的容器
家长祝老师教师节快乐祝福语
这样整个数据包发送过程就解释完成了。
当然仅仅是这样还不够,flannel为每个在它管理下的容器赋予了⼀个独⽴的不会重复的ip地址,这样跨主机容器的ip地址就不会重复了,在这个前提下才能实现以上步骤的精确转发。Flannel有⼏种不同类型的后端可⽤于封装和路由。默认和推荐的⽅法是使⽤VXLAN,因为VXLAN性能更良好并且需要的⼿动⼲预更少。
总的来说,Flannel是⼤多数⽤户的不错选择。从管理⾓度来看,它提供了⼀个简单的⽹络模型,⽤户只需要⼀些基础知识,就可以设置适合⼤多数⽤例的环境。⼀般来说,在初期使⽤Flannel是⼀个稳妥安全的选择,直到你开始需要⼀些它⽆法提供的东西。
Calico是Kubernetes⽣态系统中另⼀种流⾏的⽹络选择。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性⽽闻名。Calico的功能更为全⾯,不仅提供主机和pod之间的⽹络连接,还涉及⽹络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。
在满⾜系统要求的新配置的Kubernetes集上,⽤户可以通过应⽤单个manifest⽂件快速部署Calico。如果您对Calico的可选⽹络策略功能感兴趣,可以向集应⽤其他manifest,来启⽤这些功能。
尽管部署Calico所需的操作看起来相当简单,但它创建的⽹络环境同时具有简单和复杂的属性。与Flannel不同,Calico不使⽤overlay⽹络。相反,Calico配置第3层⽹络,该⽹络使⽤BGP路
由协议在主机之间路由数据包。这意味着在主机之间移动时,不需要将数据包包装在额外的封装层中。BGP路由机制可以本地引导数据包,⽽⽆需额外在流量层中打包流量。
除了性能优势之外,在出现⽹络问题时,⽤户还可以⽤更常规的⽅法进⾏故障排除。虽然使⽤VXLAN等技术进⾏封装也是⼀个不错的解决⽅案,但该过程处理数据包的⽅式同场难以追踪。使⽤Calico,标准调试⼯具可以访问与简单环境中相同的信息,从⽽使更多开发⼈员和管理员更容易理解⾏为。
除了⽹络连接外,Calico还以其先进的⽹络功能⽽闻名。⽹络策略是其最受追捧的功能之⼀。此外,Calico还可以与服务⽹格Istio集成,以便在服务⽹格层和⽹络基础架构层中解释和实施集内⼯作负载的策略。这意味着⽤户可以配置强⼤的规则,描述pod应如何发送和接受流量,提⾼安全性并控制⽹络环境。
如果对你的环境⽽⾔,⽀持⽹络策略是⾮常重要的⼀点,⽽且你对其他性能和功能也有需求,那么Calico会是⼀个理想的选择。此外,如果您现在或未来有可能希望得到技术⽀持,那么Calico是提供商业⽀持的。⼀般来说,当您希望能够长期控制⽹络,⽽不是仅仅配置⼀次并忘记它时,Calico是⼀个很好的选择。
Canal也是⼀个有趣的选择,原因有很多。
⾸先,Canal 是⼀个项⽬的名称,它试图将Flannel提供的⽹络层与Calico的⽹络策略功能集成在⼀起。然⽽,当贡献者完成细节⼯作时却发现,很明显,如果Flannel和Calico这两个项⽬的标准化和灵活性都已各⾃确保了话,那集成也就没那么⼤必要了。结果,这个官⽅项⽬变得有些“烂尾”了,不过却实现了将两种技术部署在⼀起的预期能⼒。出于这个原因,即使这个项⽬不复存在,业界还是会习惯性地将Flannel和Calico的组成称为“Canal”。
由于Canal是Flannel和Calico的组合,因此它的优点也在于这两种技术的交叉。⽹络层⽤的是Flannel提供的简单overlay,可以在许多不同的部署环境中运⾏且⽆需额外的配置。在⽹络策略⽅⾯,Calico强⼤的⽹络规则评估,为基础⽹络提供了更多补充,从⽽提供了更多的安全性和控制。
⼀般来说,如果你喜欢Flannel提供的⽹络模型,但发现Calico的⼀些功能很诱⼈,那么不妨尝试⼀下Canal。从安全⾓度来看,定义⽹络策略规则的能⼒是⼀个巨⼤的优势,并且在许多⽅⾯是Calico的杀⼿级功能。能够将该技术应⽤到熟悉的⽹络层,意味着您可以获得更强⼤的环境,且可以省掉⼤部分的过渡过程。
Weave是由Weaveworks提供的⼀种Kubernetes CNI⽹络选项,它提供的模式和我们⽬前为⽌讨论的所有⽹络⽅案都不同。Weave在集中的每个节点之间创建⽹状overlay⽹络,参与者之间可以灵活路
由。这⼀特性再结合其他⼀些独特的功能,在某些可能导致问题的情况下,Weave可以智能地路由。
为了创建⽹络,Weave依赖于⽹络中每台主机上安装的路由组件。然后,这些路由器交换拓扑信息,以维护可⽤⽹络环境的最新视图。当需要将流量发送到位于不同节点上的pod
时,Weave路由组件会⾃动决定是通过“快速数据路径”发送,还是回退到“sleeve”分组转发的⽅法。
快速数据路径依靠内核的本机Open vSwitch数据路径模块,将数据包转发到适当的pod,⽽⽆需多次移⼊和移出⽤户空间。Weave路由器会更新Open vSwitch配置,以确保内核层具有有关如何路由传⼊数据包的准确信息。相反,当⽹络拓扑不适合快速数据路径路由时,sleeve模式可⽤作备份。它是⼀种较慢的封装模式,在快速数据路径缺少必要的路由信息或连接的情况下,它可以来路由数据包。当流量通过路由器时,它们会了解哪些对等体与哪些MAC地址相关联,从⽽允许它们以更少的跳数、更智能地路由后续流量。当⽹络更改导致可⽤路由改变时,这⼀相同的机制可以帮助每个节点进⾏⾃⾏更正。
对于那些寻求功能丰富的⽹络、同时希望不要增加⼤量复杂性或管理难度的⼈来说,Weave是⼀个很好的选择。它设置起来相对容易,提供了许多内置和⾃动配置的功能,并且可以在其他解决⽅案可能出现故障的场景下提供智能路由。⽹状拓扑结构确实会限制可以合理容纳的⽹络的⼤⼩,不过对于⼤多数⽤户来说,这也不是⼀个⼤问题。此外,Weave也提供收费的技术⽀持,可以为企业⽤户提供故
障排除等等技术服务。
开发CNI 插件
有时社区的插件⽆法满⾜⾃⼰的需求,⽐如在阿⾥云上只能使⽤ vxlan 这种 Overlay 的插件,⽽ Overlay 插件的性能相对较差,⽆法满⾜阿⾥云上的⼀些业务需求,所以阿⾥云上开发了⼀个 Terway 的插件。
如果我们⾃⼰的环境⽐较特殊,在社区⾥⾯⼜不到合适的⽹络插件,此时可以开发⼀个⾃⼰的 CNI 插件。
CNI 插件的实现通常包含两个部分:
1. ⼀个⼆进制的 CNI 插件去配置 Pod ⽹卡和 IP 地址。这⼀步配置完成之后相当于给 Pod 上插上了⼀条⽹线,就是说它已经有⾃⼰的 IP、有⾃⼰的⽹卡了;
2. ⼀个 Daemon 进程去管理 Pod 之间的⽹络打通。这⼀步相当于说将 Pod 真正连上⽹络,让 Pod 之间能够互相通信。
给 Pod 插上⽹线
配置⽹卡
通常我们会⽤⼀个 “veth” 这种虚拟⽹卡,⼀端放到 Pod 的⽹络空间,⼀端放到主机的⽹络空间,这样就实现了 Pod 与主机这两个命名空间的打通。
分配 IP 地址
这个 IP 地址有⼀个要求,如何保障集⾥⾯给 Pod 分配的是个唯⼀的 IP 地址?
⼀般来说我们在创建整个集的时候会指定 Pod 的⼀个⼤⽹段,按照每个节点去分配⼀个 Node ⽹段。⽐如说上图右侧创建的是⼀个 172.16 的⽹段,我们再按照每个节点去分配⼀个 /24 的段,这样就能保障每个节点上的地址是互不冲突的。然后每个 Pod 再从⼀个具体的节点上的⽹段中再去顺序分配具体的 IP 地址,⽐如 Pod1 分配到了 172.16.0.1,Pod2 分配到了
172.16.0.2,这样就实现了在节点⾥⾯ IP 地址分配的不冲突,并且不同的 Node ⼜分属不同的⽹段,因此不会冲突。
这样就给 Pod 分配了集⾥⾯⼀个唯⼀的 IP 地址。
配置 Pod 的 IP 和路由
第⼀步,将分配到的 IP 地址配置给 Pod 的虚拟⽹卡;
第⼆步,在 Pod 的⽹卡上配置集⽹段的路由,令访问的流量都⾛到对应的 Pod ⽹卡上去,并且也会配置默认路由的⽹段到这个⽹卡上,也就是说⾛公⽹的流量也会⾛到这个⽹卡上进⾏路由;
最后在宿主机上配置到 Pod 的 IP 地址的路由,指向到宿主机对端 veth1 这个虚拟⽹卡上。这样实现的是从 Pod 能够到宿主机上进⾏路由出去的,同时也实现了在宿主机上访问到 Pod 的 IP 地址也能路由到对应的 Pod 的⽹卡所对应的对端上去。
连接⽹络
生成两种沉淀的复分解反应刚才我们是给 Pod 插上⽹线,也就是给它配了 IP 地址以及路由表。那怎么打通 Pod 之间的通信呢?也就是让每⼀个 Pod 的 IP 地址在集⾥⾯都能被访问到。
⼀般我们是在 CNI Daemon 进程中去做这些⽹络打通的事情。通常来说是这样⼀个步骤:
⾸先 CNI 在每个节点上运⾏的 Daemon 进程会学习到集所有 Pod 的 IP 地址及其所在节点信息。学习的⽅式通常是通过监听 K8s APIServer,拿到现有 Pod 的 IP 地址以及节点,并且新的节点和新的 Pod 的创建的时候也能通知到每个 Daemon;
拿到 Pod 以及 Node 的相关信息之后,再去配置⽹络进⾏打通。
⾸先 Daemon 会创建到整个集所有节点的通道。这⾥的通道是个抽象概念,具体实现⼀般是通过 Overlay 隧道、阿⾥云上的 VPC 路由表、或者是⾃⼰机房⾥的 BGP 路由完成的;
第⼆步是将所有 Pod 的 IP 地址跟上⼀步创建的通道关联起来。关联也是个抽象概念,具体的实现通常是通过 Linux 路由、fdb 转发表或者OVS 流表等完成的。Linux 路由可以设定某⼀个 IP 地址路由到哪个节点上去。fdb 转发表是 forwarding database 的缩写,就是把某个 Pod 的 IP 转发到某⼀个节点的隧道端点上去(Overlay ⽹络)。OVS 流表是由 Open vSwitch 实现的,它可以把 Pod 的 IP 转发到对应的节点上。
结语
Kubernetes采⽤的CNI标准,让Kubernetes⽣态系统中的⽹络解决⽅案百花齐放。更多样的选择,意味着⼤多数⽤户将能够到适合其当前需求和部署环境的CNI插件,同时还可以在环境发⽣变化时也能到新的解决⽅案。
不同企业之间的运营要求差异很⼤,因此拥有⼀系列具有不同复杂程度和功能丰富性的成熟解决⽅案,⼤⼤有助于Kubernetes在满⾜不同⽤户独特需求的前提下,仍然能够提供⼀致的⽤户体验。
参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。