Kubernetes 中的网络要解决的核心问题就是每台主机的 IP 地址网段划分,以及单个容器的 IP 地址分配。概括为:
为了解决该问题,出现了一系列开源的 Kubernetes 中的网络插件与方案,如:flannel、calico、weave、cilium
容器网络的实现方式有以下几种
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
Flannel 实质上是一种overlay network
,也就是将 TCP 数据包报封装在另一种网络包里面进行路由转发和通信
它的原理如下:
这种虚拟化网络,会带来性能的损失
Calico 是一个纯三层的数据中心网络方案, 不需要额外的NAT、隧道或者Overlay Network。由于通信时不需要解包和封包,网络性能损耗小,易于排查,且易于水平扩展。
此外,Calico基于iptables还提供了丰富而灵活的网络Policy,保证通过各个节点上的ACLs来提供Workload的多租户隔离、安全组以及其他可达性限制等功能。
Calico 项目提供的 BGP
网络解决方案,与 Flannel
的 host-gw
模式几乎一样。也就是说,Calico也是基于路由表实现容器数据包转发,但不同于Flannel使用flanneld进程来维护路由信息的做法,而Calico项目使用BGP协议来自动维护整个集群的路由信息。Calico 项目实际上将集群里的所有节点,都当作是边界路由器来处理,它们一起组成了一个全连通的网络,互相之间通过 BGP 协议交换路由规则。
Calico主要由Felix、etcd、BGP client以及BGP Route Reflector组成
通过Amazon VPC CNI插件的使用,Pod可以分配到在 VPC 网络上的 IP 地址。用户可以实现同一个K8S集群部署在:
每一个Pod上都是VPC内真实的IP地址,即网卡上分配的Secondary IP
:
这种方式相对于flannel等方案更加简单直接,这样做带来的优点是:
实现集群内外ip直接互通网络——在k8s的落地过程当中,不少企业每每都有强烈的需求保证k8s集群内外网络的直连互通
减小了overlay方案中数据包的封包和拆包的网络损耗,可以提高性能
L-IPAM(Local IP Address Manager)
运行在每一个worker 节点上(其实就是aws-node
daemonset),将全部ENI的全部secondary ip
加入到本地ip地址池中。那么,问题来了, ip地址池中的数据是从哪里来的呢?其实,aws ec2中有一个 ec2metadata 的概念,保存着关于该实例的全部信息,包括绑定到ec2的全部ENI, 以及ENI上的全部ip, 而且有相应的接口获取。默认情况下,CNI会预热相当于一个满ENI的IP。