CNI(Container Network Interface)容器网络接口:是Kubernetes提出的一个标准,解决了跨主机网络通信的问题。使用CNI的约束:
1.一个pod分配一个唯一的IP, 这个IP是整个集群的唯一IP,这是保障跨主机通讯的前提,一个pod一个IP
2.node可以访问任何节点pod,不限于本节点,pod之间也可以相互访问
3.pod可以访问所有的pod
vxlan(隧道)、host-gw(路由)、udp(弃用) 。默认使用隧道模式,将数据包二次封装走宿主机的二层网络,然后到达目的网络
也同样支持隧道和路由方案:ipip(隧道)、bgp(路由)。默认也使用隧道模式
取决于当前网络现状,如果在公有云上,那很多公有云会对路由模式有所限制,也就是说如果你用路由模式的话,会在每台k8s node机器上写入相应的路由表,而有些云主机是不支持的,会导致云主机无法通信,影响现有的网络,故选择路由模式不可取。
路由方案:对现有网络有要求,性能最好,一般要求二层可达,组件大二层网络
隧道方案:只要三层可达基本都可以通信,基于现有以太网
vxlan模式介绍:
会在每个节点上创建一个cni0
网桥,还会创建一个lannel.1
的隧道端点,主要是对数据包的再次封装,之后传输到目标节点上,也会在每台机器上创建一些路由表
路由表解释:若数据包的目的IP匹配到其中一个IP段,则走改条路由表规则,将数据包到达flannel.1这里
flannel和caclio网络是相互冲突的,在一个k8s集群中一般只有一个cni网络组建,所以下面讲解如何将flannel切换成caclio
kubectl delete -f kube-flannel.yaml
上述删除只是将flannel的守护进程删除了而已,但是网桥和隧道端点并没有删除,在删除pod的时候,pod之间的网络就已经不通了(若是路由方案的话,还是可以通的)
ip link del cni0
ip link del flannel.1
使用以下命令查看网桥,隧道端点和路由表是否删除干净,
ifconfig
ip route
确保网桥,隧道端点和路由表清除干净之后再部署caclio
下载caclio.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
从前面文章可以得出,集群网段为10.244.0.0/16
,所以calico.yaml中的网段也需要改成当前网段:
取消前面的注解并将IP网段从192.168改成10.244
在不指定caclio工作模式的情况下,默认都是隧道方案,此方案对现有网络的依赖是最小的
若将Always
改成Never
,则使用BGP
保存后执行:
kubectl apply -f caclio.yaml
flannel:适合小规模集群,维护成本低。集群规模小于100台,可以使用flannel的host-gateway
calico:以上相反
当网络模式切换过后,所有的pod都需要重新构建才能使用新的网络,故在生产环境切换网络模式代价成本很高,所以需要运维人员在知道产生的后果之后再进行操作。
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:k8s中CNI(容器网络接口)解析