• 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

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

  • 相关阅读:
    k8s 使用 Init Container 确保依赖的服务已经启动
    asp.net core 从 3.0 到 3.1
    Github原生CI/CD,初尝Github Actions
    [nginx]编译安装及安全优化
    [nginx]盗链和防盗链场景模拟实现
    [nginx]location语法
    [nginx]站点目录及文件访问控制
    [svc]nginx限制客户端上传附件的大小
    [sql]mysql指引(整理中...)-对db的分类
    [sql]mysql参数(配置)手册
  • 原文地址:https://www.cnblogs.com/Spider-Man-1/p/12739388.html
Copyright © 2020-2023  润新知