节点网络:各主机自身(master、node、etcd)所属的网络,其地址配置于主机层面的网络接口,不被k8s集群管理
Pod网络:这是一个虚拟网络,为各Pod对象设定IP地址等网络参数,其地址配置于Pod内容器的网络接口上,Pod网络需要借助于kubenet或CNI插件实现,该插件可以部署在k8s集群之外,也可以托管在集群上
Service网络:这也是一个虚拟网络,用于为k8s集群中的service配置虚拟IP地址,这种IP没有任何网络接口,它是通过Node上的kube-proxy配置为iptables或ipvs规则,从而将发往此地址的所有流量调度至后端各Pod对象上,service网络在创建k8s集群时指定,而各service的地址则在用户创建service时动态配置,此IP是集群提供服务的接口,故也称为Cluster IP
二大常见Kubernetes网络:
Flannel:
Flannel是为kubernetes设计的一个非常简洁的多节点三层网络方案,解决不同host上的容器互联问题,原理是为每个host分配一个subnet,容器从此subnet中分配IP,这些IP可以在host间路由,容器间无需NAT和port mapping就可以跨主机通信,每个subnet都是从一个更大的IP池中划分的,flannel会在每个host上面运行一个守护进程flanneld,其职责就是从大池子中分配subnet,为了各个主机间共享信息,flannel用etcd存放网络配置、已分配的subnet、host的IP 等信息
Flannel的节点间有三种通信方式:
1. VXLAN:默认配置,利用内核级别的VXLAN来封装host之间传送的包
2. Host-gw:二层网络配置,不支持云环境,通过在host的路由表中直接创建到其他主机subnet的路由条目
3. Udp:通常用于debug
Calico:
Calico是一个比较完整的项目,比较注重安全转为云环境设置,是一个三层的数据中心网络架构,无需依托overlay网络,经过生产环境的验证
Calico在每个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息向整个Calico网络内传播,小规模部署可以直接互联,大规模部署可通过指定的BGP route reflector来完成
Calico基于iptables还提供了丰富而灵活的网络Policy,保证通过各个节点上的ACLs来提供workload的多租户隔离、安全组以及其他可达性限制等功能