网络

以前在x信的时候,经常跟小伙伴说要每年至少要出去面试一次,这样可以有效的避免自己困在信息茧房中。这次就面了一个x云的架构师,他们更关注的就是网络,数据库,大数据这些。

于是就碰到了几个比较的问题,我自己也没深入思考过,毕竟这些东西都是平时云厂商给我们做好的。

overlay网络和underlayer网络各自是什么意思?

这个其实有点蒙啊,很少听到这么说的,只听说过存储上有overlay的说法。

于是我又自己查了下,原来underlayer一般就是指物理网络,比如以太网,光纤网络,mpls网络。但是mpls网络我一直以为不算的。于是认真研究了一下mpls。考完ccna也都20多年了,这块内容确实要更新下了。

传统网络我们都是路由表来进行转发的。大部分联网的设备都是有路由表的。比如我现在这个itx电脑。

route

可以很容易发现我这个网络很简单,就是一条,发给除了10.1.1.0/24网段以外的数据都是走10.1.1.1 这个网关。比如我要去到1.1.1.1 这个地址。traceroute看一下就可以看到当中经过很多hop,但是第一跳就是itx的网关10.1.1.1。在路由协议里比如静态路由,rip, ospf等等这些都是通过线路本身权重和ip地址等等方式来进行路由的。但是这种方式最大的问题点就是性能,在一些核心网络的路由器上,可能会有成千上万条路由记录,那这个就是会很影响性能。

traceroute

但是mpls的网络是基于标签的,虽然也是使用路由协议,但建立的是标签转发信息库(LFIB)。标签路径由入口路由器决定,后续只需按标签转发,这样的话可以保证路径可靠,当然mpls本身标签转发肯定也是有冗余的,不然就会有单点故障。而传统的网络路由转发是当中每一个路由设备来决定的(下一跳)。

不过mpls的主要优势并不是这些,而是QoS支持的比较好,同时原生支持 MPLS L3VPNL2VPN,就这两点导致一些高网络要求场景下会使用mpls.

那overlay就是基于这种物理网络之上的上层网络。这种网络主要是因为虚拟机和容器化产生的。不然的话我们迁移虚拟机,或者迁移容器实例,那对应的ip可能都会变了。

这个我们在云上会感触很深,在同一个az中迁移虚拟机,它的ip和mac地址都是不会变的。但是如果是跨az迁移的话,因为我们网段是根据az建立的,所以ip地址肯定会变的,不然你这个ip都无法出新的网关。但是mac地址是可以不变的。

这里面不得不提VxLan技术了,解决“跨三层网络构建二层虚拟网段”的问题。根据RFC 7348指引,它本质上是用udp封装mac地址的协议。但是本质上对于云厂商来说VxLan还是为了解决4k vlan不够用的问题。同时虚拟机迁移后保证mac地址继续不变。

而且这个现在各家交换机厂商也都支持了,顺便查到现在这种云机房的交换机的部署架构都是Spine-Leaf的方式。Leaf就是每个机柜的交换机,它会上挂到所有的Spine,而Spine就类似我们原先的核心交换机,只负责 Leaf↔Leaf 转发,不挂任何终端。虽然看上去跟原先的核心交换没有区别,其实还是有区别的,比如以前如果核心交换接口满了,那我们只能找一个更多口的核心交换替换,或者核心交换上面再加一层核核心交换。而Spine-Leaf就是横向扩容就行。这样任何两台服务器互相访问:Leaf → Spine → Leaf。

但是Spine-Leaf都是3层转发的,所以需要2层的隔离就需要使用VxLan了。

当然overlay的协议里不光有VxLan,还有Geneve,这个是兼容了VxLan等其他协议,但是对应支持的设备还不也是很普及,VxLan一般都是支持的,毕竟出来都是10多年的东西了。

vxlan

geneve

说说k8s里各种cni的区别

cni就是容器网络接口的缩写。

下面这个是kimi给整理的几种cni的区别

维度 Cilium Calico Flannel Weave Kube-OVN
核心技术 eBPF 内核态转发(eBPF) BGP/VXLAN/IPIP(路由) VXLAN(host-gw)(overlay) 自定义 UDP/FastDP(overlay) OVN逻辑交换/路由,L2/L3/L4一体
网络策略 L3-L7 全栈(HTTP/DNS/SNI) 原生K8s NetworkPolicy + 全局策略 本身无,需再装Calico策略引擎 支持,但规则丰富度<Calico 原生,且支持子网级ACL、QoS
转发性能 9.2 Gbps/0.3 ms/1.2 Mpps 9 Gbps/1.2 ms 裸金属BGP近线速;VXLAN模式≈Flannel 7.5 Gbps/2.3 ms 7.8 Gbps/2.1 ms 5.8 ms(→8.9 Gbps with DPDK) 接近Calico BGP,DPDK版本可40 Gbps
资源占用 CPU 1.2 % / 45 MB 2.8 % / 85 MB 3.5 % / 120 MB 4.2 % / 150 MB 更高(需 OVS+OVN)
加密 WireGuard(透明 + 低损耗) IPsec/WireGuard IPsec(默认) IPsec
可观测性 Hubble 实时 L7 拓扑、零开销 基础流日志 拓扑图 流表计数
多集群 ClusterMesh 原生 BGP RR/手工 EVPN
规模 5 k+ 节点无集中瓶颈 5 k+ ≤1 k ≤1 k 2 k+(需分片 OVN)
运维门槛 内核 5.4+、懂 eBPF 中等 极简 高(要懂 OVS/OVN)
组件 需要etcd 需要K8s CRD 需要额外DB 需要内核模块 需要用户态守护 离线机房备注
Flannel ✅(Node/Lease) vxlan,wireguard(可选) flanneld 只要apiserver通就能跑;无apiserver则无法工作
Calico ✅或❌(可选K8s-datastore) ✅(KDD模式) ❌(BGP模式无DB) iptables/ipset/bpf(可选) calico-node/calico-cni 可切“KDD=off”用etcd,也可全走K8s-CRD;离线场景建议自带etcd
Weave ✅(IPAM-lease) weave内核模块(自动编译) weave-router 完全gossip,不依赖etcd;但启动时要list-node,所以apiserver必须在线
Kube-OVN ✅(必须) ovn-nb/sb DB(北向/南向) openvswitch内核 ovn-controller/ovs-vswitchd 必须自备etcd+ovn-db;离线机房需提前起3个容器
Cilium ✅或❌(可选K8s-CRD) ❌(CRD模式) eBPF(kprobe,tc) cilium-agent 同Calico:可纯CRD,也可外挂etcd;离线推荐自带etcd

下面这个是deepseek给总结的几种cni的区别

特性 Cilium Calico Flannel Weave Kube-OVN
网络模型 基于eBPF的覆盖/路由网络 BGP路由/覆盖网络 VXLAN覆盖网络 VXLAN覆盖网络 OVN虚拟网络
安全策略 基于eBPF的L3-L7策略 基于iptables/BPF的L3-L4策略 无内置策略 基本加密 基于OVN ACL的L2-L4策略
性能 极高(eBPF绕过内核协议栈) 高(路由直连) 中等 中等 中等
可观测性 丰富的可观测性(Hubble) 基本指标 基本 基本 集成监控
服务发现 内置K8s服务替换kube-proxy 依赖kube-proxy 依赖kube-proxy 依赖kube-proxy 内置L2/L3/LB

通过这些对比,我们可以看到基本上cilium是未来趋势,但是有内核版本要求。calico是现在主流生产环境用的,flannel这个就可以自己玩玩的。

那首先我们需要知道为什么需要有cni。按照k8s的说法主要是这些情况:

https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/networking/

  1. 高度耦合的容器间通信:这个已经被 Podlocalhost 通信解决了。
  2. Pod 间通信:这是本文档讲述的重点。
  3. Pod 与 Service 间通信:涵盖在 Service 中。
  4. 外部与 Service 间通信:也涵盖在 Service 中。

不过这里主要是以pod之间通信为主了。

完整的列表可以参考:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy 这个列表里居然还有阿里云的terway。阿里云的这个跟阿里云绑定的非常深,但是性能非常好,没有什么隧道这些东西,我司都是用的terway而不是其他的,早期开的网段都是/16这样大的,最后网段都快不够用了,后来为了迁移就做了很多的网段调整。

Calico使用bgp路由协议,那意味着使用calico的话,整个k8s集群内部就是一个单独的as自治域, 同时bgp网络会有eBGP和iBGP。eBGP存放的是对外的网络信息,但是bgp网络是需要有asn的,这个calico默认有一个64512, 但是只能内部使用,如果对外使用,或者2个集群互相通信,那就需要拆分开来。当然不用担心这个asn广播出去,这个定义的时候就是一个private asn。这个在https://datatracker.ietf.org/doc/html/rfc6996 已经定义了64512 - 65534和4200000000 - 4294967294 都是private asn,足够大家用的。

关于通信流程我还得再学习才能写,一个是ip和pod的关系映射,以及各种安全策略和ip转换或路由的问题。