flannel (VXLAN、Host Gateway模式详解)

VXLAN网络设备主要有三种角色,分别是VTEP(VXLAN Tunnel EndPoint)、VXLAN网关、VXLANIP网关
  • 1.VTEP是直接与终端连接的设备,负责原始以太报文的VXLAN封装和解封装。
  • 2.VXLAN网关除了具备VTEP的功能外,还负责VLAN报文与VXLAN报文之间的映射和转发。VXLAN的虚拟机与传统VLAN的虚拟机之间互访,通过VXLAN网关来完成。
  • 3 . VXLANIP网关具有VXLAN网关的所有功能,此外,还负责处理不同VXLAN之间的报文通信。不同VXLAN的虚拟机之间需要互访,必须经过VXLANIP网关完成。

在这里插入图片描述

  • node1的容器1通过cni0的网关接口,通过flannel的vxlan模式进行封装,通过eth0网卡出去,进行udp传输,里面搭载了vxlan的封装协议数据包,传输给node2,到达node2后,内核进行识别解封,然后node2的flannel设备再次进行解封,在到达cni0,这样就相当于已经到达了集群的内部了,然后把信息注入到node2的容器2
  • 查询k8s的apiserver,从etcd获取分配子网的信息
    在这里插入图片描述
    在这里插入图片描述

  • 当前node1,node2都有pods,信息都保存在master主机的etcd中。他们是属于不同网段的.他们要通讯是跨主机的
  • 访问10.244.1.0/24这个网段要走cni0的网卡,数据包先到达cni0网卡上,在从cni0网卡路由出去

在这里插入图片描述

可以看出一端在pod中,一端在cni0网卡上,他们通过虚拟网络进行通讯

在这里插入图片描述

  • 当我们想访问10.244.2.0/24网段是需要走10.244.2.0这个网关,使用flannel.1这个设备。这就是为什么从cni0出来到达flannel设备。10.244.2.0正是node172上的flannel.1这个设备:在这里插入图片描述
flannel封装VNI

然后matser的flannel开始封装VNI,它有源地址和目的地地址组成
在这里插入图片描述


以下Host-GW模式

看图都知道了比vxlan简单咯,直接路由

在这里插入图片描述
在这里插入图片描述

host-gw 不会封装数据包,而是在主机的路由表中创建到其他主机 subnet 的路由条目,从而实现容器跨主机通信。

kubectl edit configmap -n kube-system kube-flannel-cfg

修改成以下

  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "host-gw"	//把类型改为host-gw
      }

删除pods重建生效

kubectl get pod -n kube-system | grep kube-flannel |awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 可以看到直接走主机的网关。要求在二层上必须是相通的。但在大型的私有云上不只有一个网络段,就不适用了。

缺点

  • udp方式存在的弊端太多了

  • VXLAN 直连路由

对于二层网段相同的可以采用 直连路由的方式,相当于host-gw 的方式,对于不同的则采用 flannel 的方式。

编辑

kubectl edit configmap -n kube-system kube-flannel-cfg

修改

  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan",
        "Directrouting": true		//直连路由
#重建生效
kubectl get pod -n kube-system | grep kube-flannel |awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述
在这里插入图片描述
也可以达到host-gw的效果

猜你喜欢

转载自blog.csdn.net/weixin_42562106/article/details/114076571