k8s网络
1.容器网络 pod
每个POD分配单独的Ip地址,IP-pre-Pod模型(IP以Pod为单位进行分配的,一个Pod一个IP的设计模型)
每个容器也可以称为pod,pod中有个pause容器,pause可以接入网络,并且共享网络给pod中其他容器,每个POD分配单独的Ip地址,在pod中每个容器共享自己的IP
对于k8s来说,我们搭建的网络,每一个node有自己的子网,所有的子网形成一个大的子网,实现网络互连
流向来说,通过pod暴露出的port流向外部的bridge或者说host上,通过host上的iptables或者其他方式路由到其他节点
使用container network interface 标准,由cncf基金会推出,主要是统一整个容器网络API,k8s主要是使用CNI插件来组件自己的容器网络,
当POD创建销毁时,k8s agent会调用CNI插件接口生成网络配置,
创建container(POD)可以生成IP地址,把container接入bridge,去生成container到其他节点的路由,删除container时,会把IP地址回收,处理network namespace回收
CNI也会在container里面生成虚拟网卡(NIC 全称:Network Interface Card),把它和container(POD)的namespace关联,从而container可以使用由CNI提供的IP

CNI创建网络1:
Kubelet runtime 也就是kubelet收到创建pod请求以后,会先生成pause的container,为pause的container创建一个network namespace,把它(network namespace)关联到pause container上面
CNI创建网络2:
触发CNI插件,触发插件时,把CNI的configuration load给这个CNI的插件,并且传递给其他环境变量,现在做的action是什么,已经创建的network namespace是什么,interface是什么

CNI创建网络3:
收到参数后开始创建网络,使用bridge plugin CNI例子来讲,
1.先创建单独的bridge出来,然后去创建虚拟以特网接口veth pair,把它和network namespace 连接起来,
2.同时它(CNI)会调用ipam(IP地址的分配),获取空闲IP分配给container,
3.CNI会切换到container的network namespace里,把ip地址设置在 container的network interface上

Network agent不仅需要CNI的plugin还需要daemon,不同的厂家都会实现不同的network agent,它去保证从这个IP会方便的路由到不同节点

calico:基于容器的网络,也可以openstack 用linux的内核转发机制,使用3层路由协议,实现container的互连
k8s上,calico会创建agent,calico cni插件,通过BGP协议路由表

fannel:使用overloay,container连上flannel 0这个上,不同的flannel angent 通过UDP互连,有性能影响,在原来的ip包上封装

NSX-t:使用2层转发,使用openVswitch做2层转发,需要运行openVswitch的服务

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐