Kubernetes跨主机通信方案

容器跨主机通信

Kubernetes的网络模型

容器和容器之间要互相通信、容器和宿主机之间也要互相通信,简单理解为就是所有网络之间都要可以进行通信;

解决方案(一) ---> Flannel项目

Flannel项目是CoreOS公司主推的容器网络解决方案,Flannel本身只是一个框架,真正提供网络功能的是 Flannel的后端实现,支持三种后端:

img

1、VXLAN

​ Virtual Extensible LAN(虚拟可扩展局域网),是Linux内核本身支持的一种网络虚拟 化技术;

​ VXLAN设计思想:在现有的三层网络之上,"覆盖" 一层虚拟的、由内核VXLAN维护的一 个二层网络,所有容器只要连接到这个二层网络之上,就可以像在一个局域网中进行通 信;

​ 二层网络之间要有一个通信的隧道,VXLAN会在宿主机上设置一个VTEP设备作为隧道两 端;VTEP设备就是(flannel.1)网络设备;

​ Linux内核会把目的VTEP设备的MAC地址,封装成一个二层数据帧,但是这个时候的二 层数据帧是没有办法直接通信的,然后Linux内核会把"二层数据帧"封装成内部数据帧, 通过宿主机的eth0网卡进行传输;

​ 访问流程:

​ 容器的IP地址--->cni0网桥--->到达本机flannel.1隧道入口--->被Linux内核封装成内 部数据帧--->通过宿主机的eth0网卡进行传输;

​ CNI设计思想:

​ Kubernetes在启动Infra容器之后,就可以直接调用CNI网络插件,为这个Infra容器

​ 的Network Namespace,配置网络栈;

​ 网络栈(网卡、路由表、IPTABLES规则)

2、HOST-GW

img

​ 访问流程:

​ 将每个flannel子网,的"下一跳",设置成对应宿主机的IP;

​ 容器的IP地址--->cni0网桥---->到达flannel.1--->下一跳地址直接就是对应宿主机的IP 地址;

隧道模式和三层网络模式:

​ 不同点:

​ 三层网络是通过配置下一跳主机的路由规则实现互通,隧道是通过在你的IP包外在 封装一个MAC包头来实现的

3、UDP

​ 这种方式已经弃用了,性能很差, 因为封装和解封装需要从用户态到内核态进行多次切 换;

posted @ 2020-04-20 17:55  _Deephug  阅读(465)  评论(0编辑  收藏  举报