K8S网络浅析(一)

1、Linux 物理网卡与虚拟网卡

linux内核会无差别的对待物理网卡和虚拟网卡,唯一的不同是:物理网卡支持以比特流的方式传输数据,虚拟网卡则直接在内存中拷贝数据,因而虚拟网卡不支持向服务器外传送数据,虚拟网卡主要有三类:

K8S网络浅析(一)_第1张图片

(1)tun:虚拟三层网卡,没有MAC地址,提供用户空间文件描述符仅用作tun应用空间程序像操作文件系统一样读取或写入数据,主要用于建立IP隧道

(2)tap:虚拟二层网卡,有MAC地址,可用于连接brdige,或者提供用户空间文件描述符像操作文件系统一样读取或写入数据,可用于建立二层隧道

(3)veth:虚拟的标准以太网卡,与tun/tap不同,成对出现,一端相互连接,一端连接内核网络协议栈。

2、K8S网络模型

(1)地址分配:每个POD内的多个容器共享共同的网络空间,类似1台虚机,以pod为单位分配集群内唯一的网络地址

(2)内网:集群内的多个POD之间,无论是否处于同一个node节点内,均能网络互通

(3)外网:集群内的pod的以service的形式对外提供服务,要求通过service地址能够被外部地址访问。

3、Calico解决方案

(1)Calico简介

  • 提供CNI plugin与K8S集成
  • 独立的网络方案:需要使用etcd作为存储
  • Matser Node:运行在hostnetwork下,calico-kube-controllers同步K8S数据和etcd数据
  • Woker Node:运行在hostnetwork下,calico-node,配合CNI plugin工作;calico-node运行4个进程,利用runsvidr作为主进程,管理4个进程,felix进程管理calico相关网卡、皮质worknode上的路由表和响应的Network Policy;Bird运行BGP协议;Confd:用于从etcd同步配置文件,并重启相应进程以应用配置

(2)calico BGP转发原理」

  • BGP:边界网关协议,用户交换路由信息
  • calico BGP:采用IBGP方案,基于BGP实现集群内各个worker node的路由信息交换,进而实现集群路由信息的同步。同时支持full-mesh和BGP route reflector两种连接方案,默认采用full mesh方案。

(3)calio具体实现

pod内外全部采用三层路由方式,没有linuxbridge连接veth设备,所有转发依赖内核的路由查找

1)pod内路由

  • 所有的pod网络数据都走三层转发,pod内路由
  • default via 169.254.1.1 dev eth0   #pod的路由默认送到169.254.1.1(为内网地址)
  • 169.254.1.1 dev eh0  #没有169.254.1.1的路由,从新定义169.254.1.1路由
  • calico内部存在实际的网卡地址为169.254.1.1,pod内的网络要封包时,需要通过arp查询169.254.1.1对应的mac地址,calico通过配置主机空间的cali veth设备(悬挂在主机网络空间中):使用自己的MAC地址arp 立马代答(proxy_delay 为0,proxy_delay为1)
  • pod发出数据包,目的地址为目的pod地址,mac地址为cali veth设备的MAC,calio打开cali veth设备的转发功能(forwarding=1,在主机网络空间转发数据包),cali veth设备查找主机的路由表转发数据

2)Pure BGP模式

假设从pod的CIDR中为每个worker node分配1段/24的地址,node1的pod cidr为10.10.1.0/24,物理网卡地址为192.168.1.106,node2的pod cidr为10.10.2.0/24,物理网卡地址为192.168.1.108

K8S网络浅析(一)_第2张图片

node1的路由表为:

10.10.2.0/24 via 192.168.1.108 dev eth0

blackhole 10.10.1.0/24

10.10.1.166 dev cali0

10.10.1.168 dev cali1

192.168.1.108 dev eth0

(注意:根据路由最长掩码匹配原则,只有已分配的pod地址才会在本机内路由)

node2的路由表为:

10.10.1.0/24 via 192.168.1.106 dev eth0

blackhole 10.10.2.0/24

10.10.2.126 dev cali0

192.168.1.106 dev eth0

(3)node间IP in IP

  • pure BGP的源IP暴露在node网络中,实际中很多情况不允许,可能IP冲突,解决方案为IP in IP
  • 增加1个ip in ip类型的netdev设备tunl0,占用第1个可用的pod地址
  • 增加路由:10.10.1.0/24 via 192.168.1.106 dev tunl0 
  • tunl0 完成ip in ip封装(实际过程为内核网络协议栈-tunl0-隧道应用程序读取数据-网络协议栈-物理网卡,外层IP包的封装只能在内核中进行),外层IP和MAC地址为node的IP和MAC地址,内层的IP和MAC为源pod和目的pod的IP和MAC地址
  • 目的worker node根据ip in ip的协议号(ip in ip的协议号为4),送给tunl0进行解封装隧道
  • 解封装后的数据与之前的pure BGP类似,不再赘述

 

 

你可能感兴趣的:(网络,k8s)