Big picture
了解Calico支持的各种网络选项,以便可以根据需要选择最佳选项。
Value
Calico灵活的模块化体系结构支持广泛的部署选项,因此可以根据自己的特定环境和需求选择最佳的网络方案。这包括在BGP和非BGP的情况下,以underlying或overlay模式与各种CNI和IPAM插件以及基础网络类型一起运行的能力。
Concepts
如果想完全了解可用的网络选项,我们建议确保自己熟悉并理解以下概念。如果希望跳过学习并直接获得选择和建议,则可以跳至“网络选项”。
Kubernetes网络基础知识
Kubernetes网络模型定义了一个“扁平”网络,其中:
- 每个Pod都有自己的IP地址。
- 无需NAT,任何节点上的Pod均可与所有其他节点上的所有Pod通信。
这将创建一个干净的,向后兼容的模型,从端口分配,命名,服务发现,负载平衡,应用程序配置和迁移的角度来看,可以将Pod像VM或物理主机一样对待。可以使用网络策略来定义网络分段,以将流量限制在这些基本网络功能内。
在此模型中,可以灵活地支持不同的网络方案和环境。确切地如何实现网络的详细信息取决于所使用的CNI,网络和云提供商插件的组合。
CNI插件
CNI(容器网络接口)是一个标准API,允许将不同的网络实现插入Kubernetes。每当创建或销毁Pod时,Kubernetes都会调用API。CNI插件有两种类型:
- CNI网络插件:负责向Kubernetes Pod网络中添加Pod或从Kubernetes Pod网络中删除Pod。这包括创建/删除每个Pod的网络接口,以及将其连接/断开与其他网络实现的连接。
- CNI IPAM插件:负责在Pod创建或删除时分配和释放Pod的IP地址。根据插件的不同,这可能包括为每个节点分配一个或多个IP地址(CIDR)范围,或从底层公共云网络获取IP地址以分配给Pod。
云提供商集成
Kubernetes云提供商集成是特定于云的控制器,可以配置基础云网络以帮助提供Kuberenetes网络。根据云提供商的不同,这可能包括自动将路由编程到基础云网络中,以便它本机知道如何路由Pod流量。
Kubenet
Kubenet是Kubernetes中内置的一个非常基本的网络插件。它没有实现跨节点通信或网络策略。它通常与云提供商集成一起使用,后者在云提供商网络中设置路由以在节点之间或在单节点环境中进行通信。Kubenet与Calico不兼容。
Overlay网络
overlay网络是位于另一个网络之上的网络。在Kubernetes的上下文中,overlay网络可用于处理基础网络顶部节点之间的Pod到Pod流量,这些节点不知道Pod IP地址或哪些Pod在哪些节点上运行。overlay网络通过将基础网络不知道如何处理(例如使用Pod IP地址)的网络数据包封装在基础网络确实知道如何处理的外部数据包(例如节点IP地址)中。用于封装的两种常见网络协议是VXLAN和IP-in-IP。
使用overlay网络的主要优点是它减少了对基础网络的依赖性。例如,可以在几乎任何基础网络之上运行VXLAN,而无需与基础网络集成或对其进行任何更改。
使用overlay网络的主要缺点是:
- 对性能有轻微影响。封装数据包的过程占用少量CPU,并且数据包中用于编码封装(VXLAN或IP-in-IP标头)所需的额外字节减少了可以发送的内部数据包的最大大小,这意味着需要为相同数量的总数据发送更多数据包。
- Pod IP地址无法在集群外部路由。
跨子网Overlay网络
除了标准的VXLAN或IP-in-IP overlay外,Calico还支持VXLAN和IP-in-IP的“cross-subnet”模式。在这种模式下,在每个子网中,基础网络充当L2网络。在单个子网内发送的数据包不进行封装,因此可以获得非overlay网络的性能。跨子网发送的数据包像普通的overlay网络一样被封装,从而减少了对基础网络的依赖(无需与基础网络集成或对其进行任何更改)。
就像使用标准overlay网络一样,基础网络也不知道Pod IP地址,并且Pod IP地址无法在集群外部路由。
Pod IP路由到集群外部的能力
不同的Kubernetes网络实现的一个重要区别特征是Pod IP地址是否可在整个较宽网络的集群外部路由。
不可路由
如果Pod IP地址无法在集群外部路由,则当Pod尝试建立与集群外部IP地址的网络连接时,Kubernetes将使用一种称为SNAT(源网络地址转换)的技术来更改源IP从Pod的IP地址到托管Pod的节点的IP地址。连接上的所有返回数据包都会自动映射回Pod IP地址。因此,Pod不知道发生了SNAT,连接的目的地将节点视为连接的源,而底层的更广泛的网络不会看到Pod IP地址。
对于相反方向的连接,其中集群外部的某些设备需要连接到Pod,这只能通过Kubernetes service或Kubernetes ingress来完成。集群之外的任何人都无法直接连接到Pod IP地址,因为更广泛的网络不知道如何将数据包路由到Pod IP地址。
可路由
如果Pod IP地址可以在集群外部路由,则Pod可以不使用SNAT即可连接到外部世界,并且集群外部可以直接连接到Pod,而无需通过Kubernetes service或Kubernetes ingress。
Pod IP可路由到集群外部的优点是:
- 避免将SNAT用于出站连接对于与现有更广泛的安全要求进行集成可能至关重要。它还可以简化操作日志的调试和易懂性。
- 如果有专门的工作负载,这意味着某些Pod需要直接访问而不需要通过Kubernetes service或Kubernetes ingress,那么可路由的Pod IP在操作上可能更简单。
Pod IP地址可路由到集群外的主要缺点是,Pod IP在整个网络中必须是唯一的。因此,例如,如果运行多个群集,则需要为每个群集中的Pod使用不同的IP地址范围(CIDR)。当大规模运行时,或者如果现有其他企业对IP地址空间有大量重要需求,这又可能导致IP地址范围耗尽的挑战。
决定可路由性的因素是什么?
如果集群使用overlay网络,则Pod IP通常无法路由到集群外。
如果集群不使用overlay网络,那么Pod IP是否路由到集群外取决于所用的CNI插件,云提供商集成或与物理网络(对于本地)BGP对等连接。
BGP
BGP(边界网关协议)是用于跨网络共享路由的基于标准的网络协议。它是互联网的基本组成部分之一,具有出色的扩展特性。
Calico内置了对BGP的支持。在本地部署中,这使Calico可以与物理网络(通常连接到Top或Rack路由器)建立对等关系以交换路由,从而形成一个none-overlay网络,其中Pod IP地址可以在更广泛的网络中路由,就像附加的任何其他工作负载一样到网络。
关于Calico网络
Calico网络灵活的模块化架构包括以下内容。
Calico CNI网络插件
Calico CNI网络插件使用一对虚拟以太网设备(一对)将Pod连接到主机网络名称空间的L3路由。这种L3架构避免了许多其他Kubernetes网络解决方案中附加的L2桥不必要的复杂性和性能开销。
Calico CNI IPAM插件
Calico CNI IPAM插件为一个或多个可配置IP地址范围之外的Pod分配IP地址,并根据需要为每个节点动态分配IP块。与许多其他CNI IPAM插件(包括在许多网络解决方案中使用的主机本地IPAM插件)相比,具有更有效的IP地址空间使用。
Overlay网络模式
Calico可以提供VXLAN或IP-in-IP网络,包括cross-subnet模式。
Non-overlay网络模式
Calico可以提供在任何基础L2网络之上运行的non-overlay网络,或者是具有适当的云提供商集成的公共云网络或支持BGP的L3网络(通常是具有标准Top-of-Rack路由器)。
网络策略
Calico的网络策略执行引擎实现了Kubernetes网络策略的全部功能,以及Calico Network Policy的扩展功能。这可以与Calico的内置网络模式或任何其他Calico兼容的网络插件和云提供商集成结合使用。
与Calico兼容的CNI插件和云提供商集成
除Calico CNI插件和内置网络模式外,Calico还与许多第三方CNI插件和云提供商集成兼容。
Amazon VPC CNI
Amazon VPC CNI插件从基础AWS VPC分配Pod IP,并使用AWS弹性网络接口提供VPC本机Pod网络(可在集群外部路由的Pod IP)。它是Amazon EKS中使用的默认网络,并与Calico一起用于网络策略实施。
Azure CNI
Azure CNI插件从基础Azure VNET分配Pod IP,将Azure虚拟网络配置为提供VNET本机Pod网络(可在群集外部路由的Pod IP)。它是Microsoft AKS中使用的默认网络,可与Calico一起执行网络策略。
Azure cloud provider
Azure云提供商集成可以用作Azure CNI插件的替代方法。它使用host-local IPAM插件分配Pod IP,并使用相应的路由对基础Azure VNET子网进行编程。Pod IP仅可在VNET子网内路由(这通常意味着它们无法路由到群集外部)。
Google cloud provider
Google云提供商集成使用host-local IPAM插件分配Pod IP,并对Google Cloud网络Alias IP范围进行编程,以在Google Cloud上提供VPC本机Pod网络(可在集群外部路由的Pod IP)。它是Google Kubernetes Engine(GKE)的默认设置,并带有Calico来执行网络策略。
Host local IPAM
host-local IPAM插件是常用的IP地址管理CNI插件,它为每个节点分配固定大小的IP地址范围(CIDR),然后从该范围内分配Pod IP地址。默认地址范围大小是256个IP地址(a/24),其中两个IP地址是为特殊目的保留的,未分配给Pod。host-local IPAM插件的简单性使其易于理解,但与Calico CNI IPAM插件相比,其IP地址空间使用效率较低。
Flannel
Flannel使用从host-local IPAM插件获得的静态CIDR路由pod间的通信。Flannel提供了许多网络后端,但主要与VXLAN后端一起使用。Calico CNI和Calico网络策略可以与flannel和host-local IPAM插件结合使用,以提供具有策略实施功能的VXLAN网络。这种组合有时称为“Canal”。
注意:Calico现在内置了对VXLAN的支持,为了简化起见,我们通常建议优先使用Calico + Flannel组合。
网络选择
本地
Calico本地部署最常见的网络设置是non-overlay模式,该模式使用BGP与物理网络(通常是机架路由器的顶部)对等,以使Pod IP可在集群外部路由。(当然,可以根据需要配置其余的本地部署网络,以限制群集外的Pod IP路由的范围。)此设置提供了丰富的Calico高级功能,包括公告Kubernetes serviceIP的能力(cluster IPs or external IPs),以及在Pod,名称空间或节点级别控制IP地址管理的能力,以支持与现有企业网络和安全要求集成的各种可能性。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
No |
BGP |
如果不能将BGP对等连接到物理网络,并且群集在单个L2网络中,则还可以运行non-overlay模式,而Calico只能在群集中的节点之间对等BGP。即使这不是严格的overlay网络,也无法在集群外部路由Pod IP,因为基础网络没有Pod IP的路由。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
No |
BGP |
或者,可以在VXLAN或IP-in-IP模式下运行Calico,并使用cross-subnet模式来优化每个L2子网内的性能。
推荐方案:
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
VXLAN |
Calico |
替代方案:
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
IPIP |
BGP |
AWS
如果希望在集群外部可路由Pod IP地址,则必须使用Amazon VPC CNI插件。这是EKS的默认网络模式,并使用Calico的网络策略。Pod IP地址是从基础VPC分配的,每个节点的Pod的最大数量取决于实例类型。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
AWS |
AWS |
No |
VPC/Native |
如果希望避免依赖特定的云提供商,或者由于IP地址范围耗尽的挑战,或者如果Amazon VPC CNI插件每个节点支持的最大Pod数量不足以从基础VPC分配Pod IP,则存在问题。根据需求,我们建议使用Calico的overlay + cross-subnet模式。Pod IP将无法在集群外部路由,但是可以在不依赖基础云网络的情况下将集群扩展到Kubernetes的极限。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
VXLAN |
Calico |
在这个简短的视频中,可以了解有关AWS上的Kubernetes Networking的更多信息,包括上述每个选项的工作原理。Everything you need to know about Kubernetes networking on AWS。
Azure
如果希望在群集外部可以路由Pod IP地址,则必须使用Azure CNI插件。这由AKS和Calico进行网络策略支持。Pod IP地址是从基础VNET分配的。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Azure |
Azure |
No |
VPC/Native |
如果要使用AKS,但由于IP地址范围耗尽的问题而无法从基础VNET分配Pod IP,则可以将Calico与Azure云提供商集成一起使用。它使用host-local IPAM为每个节点分配/24地址段,并为这些/24地址段在群集的基础VNET子网中编程路由。在群集/VNET子网外部无法路由Pod IP,因此如果需要,可以在多个群集中使用相同的Pod IP地址范围(CIDR)。
注意:在某些AKS文档中将其称为kubenet + Calico,但实际上是带有Azure云提供程序的Calico CNI,并且不使用kubenet插件。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Host Local |
Calico |
No |
VPC/Native |
如果不使用AKS,而是希望避免依赖于特定的云提供商,或者由于IP地址范围耗尽的问题而无法从基础VNET分配Pod IP,那么我们建议使用Calico的overlay + cross-subnet模式。Pod IP将无法在集群外部路由,但是可以在不依赖基础云网络的情况下将集群扩展到Kubernetes的极限。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
VXLAN |
Calico |
可以在此短视频中了解有关Azure上Kubernetes Networking的更多信息,包括上述每个选项的工作原理:Everything you need to know about Kubernetes networking on Azure
Google Cloud
如果想在集群外部路由Pod IP地址,则必须将Google云提供商集成与host-local IPAM CNI插件结合使用。GKE和Calico都为网络策略提供了支持。从基础VPC分配Pod IP地址,并自动将相应的Alias IP地址分配给节点。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Host Local |
Calico |
No |
VPC/Native |
如果希望避免依赖特定的云提供商,或者由于IP地址范围耗尽的挑战而无法从基础VPC分配Pod IP,那么我们建议使用Calico的overlay模式。由于Google云网络是纯L3网络,因此不支持cross-subnet模式。Pod IP将无法在集群外部路由,但是可以在不依赖基础云网络的情况下将集群扩展到Kubernetes的极限。
推荐方案:
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
VXLAN |
Calico |
替代方案:
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
IPIP |
BGP |
可以在此短片中了解有关Google云上的Kubernetes Networking的更多信息,包括上述每个选项的工作原理:Everything you need to know about Kubernetes networking on Google cloud
IBM Cloud
如果使用的是IBM Cloud,则建议使用IKS,该产品具有内置Calico的功能,可提供cross-subnet +IPIP模式的网络模式。除了为Pod提供网络策略外,IKS还使用Calico网络策略来保护群集中的主机节点。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
IPIP |
BGP |
Anywhere
上面的环境列表显然并不详尽。理解本指南中的概念和解释有助于确定适合的环境。如果仍然不确定,则可以通过Calico用户的Slack或Discourse论坛寻求建议。记住,如果要使用,而不想担心各种选项,则可以在几乎任何环境中以VXLAN + overlay模式运行Calico。
Policy |
IPAM |
CNI |
Overlay |
Routing |
Calico |
Calico |
Calico |
VXLAN |
Calico |