K8s集群网络上
服务器网络架构
-
路由器:网络出口
-
核心层:主要完成数据高效转发、链路备份等
-
汇聚层:网络策略、安全、工作站交换机的接 入、VLAN之间通信等功能
-
接入层:工作站的接入
交换技术
交换机工作在OSI参考模型的第二层,即数据链路层。交换机拥有一条高带宽的背部总线 交换矩阵,在同一时间可进行多个端口对之间的数据传输。
交换技术分为2层和3层:
-
2层:主要用于小型局域网,仅支持在数据链路层转发数据,对工作站接入。
-
3层:三层交换技术诞生,最初是为了解决广播域的问题,多年发展,三层交换机已经 成为构建中大型网络的主要力量
广播域
交换机在转发数据时会先进行广播,这个广播可以发送的区域就是一个广播域。交换机之间对广播帧是透明的,所以 交换机之间组成的网络是一个广播域。路由器的一个接口下的网络是一个广播域,所以路由器可以隔离广播域。
ARP(地址解析协议)
发送这个广播帧是由ARP协议实现,ARP是通过IP地址获取物理地址的一个TCP/IP协议。
三层交换机
前面讲的二层交换机只工作在数据链路层,路由器则工作在网络层。而功能强大的三层交换机可同时工作在数据链路 层和网络层,并根据 MAC地址或IP地址转发数据包。
VLAN(Virtual Local Area Network):虚拟局域网
VLAN是一种将局域网设备从逻辑上划分成一个个网段。一个VLAN就是一个广播域,VLAN之间的通信是通过第3层 的路由器来完成的。VLAN应用非常广泛,基本上大部分网络项目都会划分vlan。
VLAN的主要好处:
-
分割广播域,减少广播风暴影响范围。
-
提高网络安全性,根据不同的部门、用途、应用划分不同网段。
路由技术
路由器主要分为两个端口类型:LAN口和WAN口
WAN口:配置公网IP,接入到互联网,转发来自LAN口的IP数据包。
LAN口:配置内网IP(网关),连接内部交换机。
路由器是连接两个或多个网络的硬件设备,将从端口上接收的数据包,根据数据包的 目的地址智能转发出去。
路由器的功能:
-
路由
-
转发
-
隔离子网
-
隔离广播域
路由器是互联网的枢纽,是连接互联网中各个局域网、广域网的设备,相比交换机来说,路由器的数据转发很复杂, 它会根据目的地址给出一条最优的路径。那么路径信息的来源有两种:
静态路由:指人工手动指定到目标主机的地址然后记录在路由表中,如果其中某个节点不可用则需要重新指定。
动态路由:则是路由器根据动态路由协议自动计算出路径永久可用,能实时地适应网络结构的变化。
常用的动态路由协议:
-
RIP( Routing Information Protocol ,路由信息协议)
-
OSPF(Open Shortest Path First,开放式最短路径优先)
-
BGP(Border Gateway Protocol,边界网关协议)
OSI七层模型
OSI(Open System Interconnection)是国际标准化组织(ISO)制定的一个 用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
TCP(Transmission Control Protocol,传输控制协议),面向连接协议,双方先建立可靠的连接, 再发送数据。适用于传输数据量大,可靠性要求高的应用场景。
UDP(User Data Protocol,用户数据报协议),面向非连接协议,不与对方建立连接,直接将数 据包发送给对方。适用于一次只传输少量的数据,可靠性要求低的应用场景。相对TCP传输速度快。
K8s网络模型: 回看Docker容器网络模型
Docker网络模型涉及的名词:
-
网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命名空间中,彼此间无法通信; Docker利用这一特性,实现不同容器间的网络隔离。
-
Veth设备对:Veth设备对的引入是为了实现在不同网络命名空间的通信。
-
Iptables/Netfilter:Docker使用Netfilter实现容器网络转发。
-
网桥:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
-
路由:Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。
K8s网络模型:Pod网络
Pod是K8s最小调度单元,一个Pod由一个容器或多个容器组成,当多个容器时,怎么都用这一个Pod IP?
实现:k8s会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其 他容器看到的网络试图就完全一样了。即网络设备、IP地址、Mac地址等。在Pod的IP地址就是infra container的IP地 址。
在 Kubernetes 中,每一个 Pod 都有一个真实的 IP 地址,并且每一个 Pod 都可以使用此 IP 地址与 其他 Pod 通信。
Pod之间通信会有两种情况:
-
两个Pod在同一个Node上
-
两个Pod在不同Node上
第一种情况:两个Pod在同一个Node上
同节点Pod之间通信道理与Docker网络一样的,如下图:
1.对 Pod1 来说,eth0 通过虚拟以太网设备 (veth0)连接到 root namespace;
2.网桥 cbr0 中为 veth0 配置了一个网段。一旦 数据包到达网桥,网桥使用ARP 协议解析出其 正确的目标网段 veth1;
3.网桥 cbr0 将数据包发送到 veth1;
4.数据包到达 veth1 时,被直接转发到 Pod2 的 network namespace 中的 eth0 网络设备。
第二种情况:两个Pod在不同Node上
相比同节点Pod通信,这里源Pod发出的数据包需 要传递到目标节点,但是源Pod并不知道目标Pod 在哪个节点上?
因此,为了实现容器跨主机通信需求,就需要部署网络组件,这些网络组件都必 须满足如下要求:
-
一个Pod一个IP
-
所有的 Pod 可以与任何其他 Pod 直接通信
-
所有节点可以与所有 Pod 直接通信
-
Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个
目前支持的一些K8s网络组件:
网络组件说明:https://kubernetes.io/docs/concepts/cluster-administration/networking/
K8s网络模型: CNI(容器网络接口)
CNI(Container Network Interface,容器网络接口):是一个容器网络规范,Kubernetes网络采用的就是这个CNI规 范,负责初始化infra容器的网络设备。
CNI二进制程序默认路径:/opt/cni/bin/
项目地址:https://github.com/containernetworking/cni
以Flannel网络组件为例,当部署Flanneld后,会在每台宿主机上生成它对应的CNI配置文件(它其实是一个 ConfigMap),从而告诉Kubernetes要使用 Flannel 作为容器网络方案。
CNI配置文件默认路径:/etc/cni/net.d
当 kubelet 组件需要创建 Pod 的时候,先调用dockershim它先创建一个 Infra 容器。然后调用 CNI 插件为 Infra 容器 配置网络。
这两个路径可在kubelet启动参数中定义:
–network-plugin=cni
–cni-conf-dir=/etc/cni/net.d
–cni-bin-dir=/opt/cni/bin
K8s网络组件之Flannel
Flannel是CoreOS维护的一个网络组件,Flannel为每个Pod提供全局唯一的IP,Flannel使用ETCD来存储Pod子网与 Node IP之间的关系。flanneld守护进程在每台主机上运行,并负责维护ETCD信息和路由数据包。
项目地址:https://github.com/coreos/flannel
YAML地址:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
K8s网络组件之Flannel:部署
部署前有两处可能需要调整:
kube-flannel.yml
Network:指定Pod IP分配的网段,与controller-manager配置的保持一样。
-
–allocate-node-cidrs=true
-
–cluster-cidr=10.244.0.0/16
-
kubeadm部署:/etc/kubernetes/manifests/kube-controller-manager.yaml
-
二进制部署:/opt/kubernetes/cfg/kube-controller-manager.conf
Backend:指定工作模式
K8s网络组件之Flannel:工作模式
Flannel支持多种工作模式:
-
UDP:最早支持的一种方式,由于性能最差,目前已经弃用。
-
VXLAN:Overlay Network方案,源数据包封装在另一种网络包里面进行路由转发和通信
-
Host-GW:Flannel通过在各个节点上的Agent进程,将容器网络的路由信息写到主机的路由表上,这样一来所有 的主机都有整个容器网络的路由数据了。
-
Directrouting:同时支持VXLAN和Host-GW工作模式
-
公有云VPC:ALIYUN,AWS
K8s网络组件之Flannel:VXLAN模式
VXLAN介绍
VXLAN,即 Virtual Extensible LAN(虚拟可扩展局域网),是 Linux 内核本身就支持的一种网络 虚似化技术。VXLAN 可以完全在内核态实现上述封装和解封装的工作,从而通过与前面相似的“隧 道”机制,构建出覆盖网络(Overlay Network)。
VXLAN的覆盖网络设计思想:在现有的三层网络之上,覆盖一个二层网络,使得连接在这个VXLAN 二层网络上的主机之间,可以像在同一局域网里通信。
为了能够在二层网络上打通“隧道” ,VXLAN 会在宿主机上设置一个特殊的网络设备作为“隧道” 的两端。这个设备就叫作 VTEP,即:VXLAN Tunnel End Point(虚拟隧道端点)。
VTEP设备进行封装和解封装的对象是二层数据帧,这个工作是在Linux内核中完成的。
Flannel工作逻辑图如下:
如果Pod 1访问Pod 2,源地址10.244.1.10,目的地址10.244.2.10 ,数据包传输流程如下:
1.容器路由:容器根据路由表,将数据包发送下一跳10.244.1.1,从eth0网卡出。可以使用ip route命令查看路由表
2.主机路由:数据包进入到宿主机虚拟网卡cni0,根据路由表转发到flannel.1虚拟网卡,也就是来到了隧道的入口。 10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink # 凡是发往10.244.2.0/24网段的数据包,都需要经过flannel.1设备发出,并且下一跳是10.244.2.0, 即Node2 VTEP设备flannel.1。
3.VXLAN封装:而这些VTEP设备之间组成一个二层网络,但是二层网络必须要知道目的MAC地址,那这个MAC地址从哪获取到呢?其实在flanneld进 程启动后,就会自动添加其他节点ARP记录,可以通过ip neigh show dev flannel.1命令查看。
4.二次封包:知道了目的MAC地址,Linux内核就可以进行二层封包了。但是,对于宿主机网络来说这个二层帧并不能在宿主机二层网络里传输。所以接 下来,Linux内核还要把这个数据帧进一步封装成为宿主机网络的一个普通数据帧,好让它载着内部数据帧,通过宿主机的ens33网卡进行传输。 数据格式如下图:
5.封装到UDP包发出去:在封装成宿主机网络可传输的数据帧时,还缺少目标宿主机MAC地址,也就是说这个UDP包该发给哪台宿主机呢? flanneld进程也维护着一个叫做FDB的转发数据库,可以通过bridge fdb show dev flannel.1命令查看。可以看到,上面用的对方flannel.1的MAC地址 对应宿主机IP,也就是UDP要发往的目的地。所以使用这个目的IP与MAC地址进行封装。
6.数据包到达目的宿主机:接下来,就是宿主机与宿主机之间通信了,数据包从Node1的ens33网卡发出去,Node2接收到数据包,解封装发现是VXLAN 数据包,把它交给flannel.1设备。flannel.1设备则会进一步拆包,取出原始IP包(源容器IP和目标容器IP),通过cni0网桥二层转发给容器。
#抓包分析 |
Tcpdump抓包指南之关键字的使用
1.类型关键字: host,net,port
2.传输关键字:src,dst
3.协议关键字:tcp,udp,http,arp,ftp
K8s网络组件之Flannel:HOST-GW模式
host-gw模式相比vxlan简单了许多,直接添加路由,将目的主机当做网关,直接路由原始封包。
修改配置文件:
kube-flannel.yml
当你设置flannel使用host-gw模式,flanneld会在宿主机上创建节点的路由表:
目的 IP 地址属于 10.244.2.0/24 网段的 IP 包,应该经过本机的 eth33 设备发出去(即:dev ens33);并且,它下一跳地址是 192.168.0.13(即:via 192.168.0.13)。
一旦配置了下一跳地址,那么接下来,当 IP 包从网络层进入链路层封装成帧的时候,ens33 设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。
而 Node 2 的内核网络栈从二层数据帧里拿到 IP 包后,会“看到”这个 IP 包的目的 IP 地址是 10.244.2.10,即 container-2 的 IP 地址。这时候,根据 Node 2 上的路由表,该目的地址会匹配到第五条路由规则(也就是 10.244.2.0 对应的路由规则),从而 进入 cni0 网桥,进而进入到 container-2 当中。
可见,数据包是封装成帧发送出去的,会使用路由表的下一跳来设置目的MAC地址,会经过二层网络到达目的节点,因此,hostgw模式必须要求集群宿主机之间二层连通。
#抓包分析 |
K8s网络组件之Flannel:小结
VXLAN特点:
-
先进行二层帧封装,再通过宿主机网络封装,解封装也一样,所以增加性能开销
-
对宿主机网络要求低,只要三层网络可达
Host-GW特点:
-
直接路由转发,性能损失很小
-
对宿主机网络要求二层可达
卸载flnnel
https://blog.csdn.net/weixin_34409741/article/details/92513036
学习:https://edu.51cto.com/center/course/lesson/index?id=532871