美文网首页
docker跨主机网络

docker跨主机网络

作者: why_not_ | 来源:发表于2018-12-31 12:23 被阅读0次

    跨主机网络

    host网络

    none 无外部网络
    host 共享主机网路
    bridge 桥接网络
    joiend容器 共享另一个容器的网络
    解决了单的host上容器的通信问题

    跨主机网络

    1、docker 原生的overlay、macvlan
    2、第三方方案flannel、weave、calico

    libnetwork&CNM

    libnetwork是docker容器网络库,定义了container network model,CNM 这个模型对容器网络进行了抽象

    • sandbox 是容器的网络栈 包含容器的intreface、路由表、dns sandbox可以包含来自不同network的endpoint
    • endpoint 的作用是将sandbox接入network。endpoint的典型实现是 veth pair 一个endpoint只能属于一个网络,也只能属于一个sandbox
    • network 包含一组endpoint,同一network的endpoint可以直接通信

    两个 Network:默认网络 “bridge” 和自定义网络 “my_net2”。实现方式是 Linux Bridge:“docker0” 和 “br-5d863e9f78b6”。

    三个 Enpoint,由 veth pair 实现,一端(vethxxx)挂在 Linux Bridge 上,另一端(eth0)挂在容器内。

    三个 Sandbox,由 Network Namespace 实现,每个容器有自己的 Sanbox。

    docker overlay

    为了支持容器跨host通信,docker原生提供了 overlay driver网络 ,使用户可以创建基于VxLAN的overlay网络

    VxLAN可以将二层的数据封装到UDP进行传输 提供与VLAN相同的以太网二层服务,但是拥有更强的扩展性和灵活性

    docker overlay 需要一个key-value 的数据库保存网络状态信息 包括 network、endpoint、ip

    cunsul
    etcd
    zookeeper

    tcp 2377 集群管理通信
    t/u7946 节点之间通信
    udp 4789 覆盖网络流量
    在创建覆盖网络之前,需要将docker守护进程初始化为swarm管理器
    \# docker swarm init
    或者连接到现有的swarm
    \# docker swarm join

    swarm

    Docker swarm 提供docker 容器集群服务,使用它用户可以将多个docker主机封装为单个大型的虚拟docker主机,快速打造一套容器云平台

    swarm 内置了对docker 网络插件的支持 ,用户可以 很容易的的部署跨主机的容器集群服务

    swarm 是典型的 master-slave 主从结构

    通过发现服务来选举manager 管理节点 各个节点上运行agent接受manager的统一管理
    swarm v2中集群会通过raft协议分布式选举出manager节点,无需额外的发现服务,避免了单点瓶颈

    swarm v2 中内置了基于dns的负载均衡和对外部负载均衡机制的集成支持

    macvlan

    macvlan本身是linux kernel 内核的模块 允许在物理网卡上添加多个mac地址,即多个interface 每个interface可以配置一个IP

    macvlan其实是一种网卡虚拟化技术

    # ip link set eno16777728 promisc on
    打开网卡混杂模式(关键)(虚拟机设置也要开启)
    # ip link show eno16777728

    # docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eno16777728 mac_net
    在不同的host上建立相同网络 通过指定的interface互相通信

    1、-d macvlan    指定网络驱动
    2、macvlan是local网络,为保证相互通信必须要用户自己管理IP subnet
    3、docker 不会为macvlan创建网关,这里的网关应该是真实存在的
    4、-o parent    指定使用的网络interface
    
    1. macvlan 不依赖 linux bridge 容器的网卡通过macvlan虚拟出来的interface
      容器的interface接口直接与物理机连接 在网络上与其他主机没有区别

    macvlan 会独占主机的网卡,也就是说一个网卡只能创建一个 macvlan 网络,macvlan也可以连接到sub-interface

    不同 macvlan 网络不能 在二层上 通信。在三层上可以通过网关将 macvlan 连通

    macvlan 网络的连通和隔离完全依赖 VLAN、IP subnet 和路由,docker 本身不做任何限制,用户可以像管理传统VLAN 网络那样管理 macvlan

    flannet

    flannet 是由CoreOS开发 flannet为每一个host主机分配一个subnet 容器从subnet 中分配ip 这些ip可以在主机之间路由

    flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet。为了在各个主机间共享信息,flannel 用 etcd(与 consul 类似的 key-value 分布式数据库)存放网络配置、已分配的 subnet、host 的 IP 等信息

    数据包如何在主机间转发是由 backend 实现的。flannel 提供了多种 backend,最常用的有 vxlan 和 host-gw

    weave

    weave 创建的虚拟网络可以将部署在不同host上的容器连接起来 weave 的dns模块还支持 容器之间 hostname 访问

    weave 不依赖分布式数据库交换网络信息 每个主机上都只需运行weave 组件就能建立容器跨主机网络
    # curl -L git.io/weave -o /usr/local/bin/weave
    下载脚本
    # chmod a+x /usr/local/bin/weave
    赋权
    # weave launch
    运行脚本 启动weave服务 容器化

    1. weave主程序建立网络、收发数据、提供dns
    2. weaveplugin network driver
    3. weaveproxy 代理 启动容器时将容器添加到weave网络

    # docker network ls
    weave会创建一个weave网络

    weave 网络包含两个虚拟交换机:Linux bridge weave 和 Open vSwitch datapath,veth pair vethwe-bridge 和 vethwe-datapath 将二者连接在一起。weave 和 datapath 分工不同,weave 负责将容器接入 weave 网络,datapath 负责在主机间 VxLAN 隧道中并收发数据。

    网络模型

    跨主机网络意味着将不同网络上的容器用同一个虚拟网络连接起来

    • docker overlay 在主机之间建立VxLAN隧道,原始数据包在发送端被封装成VxLAN数据包,到达目的后接受端解包
    • macvlan 在二层上通过VLAN连接容器,在三层上依赖外部网关连接不同macvlan 数据包直接发送,underlay网络
    • flannel 两种backend vxlan与docker overlay类似,属于overlay网络 host-gw 将主机作为网关,依赖三层IP转发,不需要进行包封装,underlay网络
    • weave 是VxLAN的实现,属于overlay网络
    IP管理
    • docker overlay 网络中所有主机共享同一个sybnet,容器启动时会顺序分配,可以通过—subnet指定
    • macvlan 需要用户自己管理subnet,为容器分配ip,不同sybnet 通信依赖外部网关
    • flannet 为每个主机自动分配独立的subnet,不同subnet之间的路由信息也由flannel自动生成和配置
    • weave 的默认配置下所有容器使用 10.32.0.0/12 subnet 可以通过--ipalloc-range 分配特定的subnet
    连通和隔离
    • 同一docker overlay 网络中的容器可以通信,但不同网络之间无法通信,要实现跨网络访问,只有将容器加入多个网络。与外网通信可以通过docker_gwbridge网络
    • macvlan 网络的连通或隔离完全取决于二层vlan和三层路由
      不同flannel网络中的容器直接就可以通信,没有隔离,与外网通信可以通过bridge网络
    • weave 默认配置下所有容器在一个大的subnet中,可以自由通信,如果要实现隔离,需要为容器指定不同的subnet或ip。与外网通信 将主机加入到weave网络,并把主机当作网关
    性能
    • underlay网络性能优于overlay网络
    • overlay网络利用隧道技术,将数据包封装到UDP中进行传输。因为涉及数据包的封装解封,存在额外的cpu和网络开销
    • overlay较underlay可以支持更多的二层网络,更好的利用已有网络,以及有效的避免物理交换机MAC表耗尽等优势

    相关文章

      网友评论

          本文标题:docker跨主机网络

          本文链接:https://www.haomeiwen.com/subject/umevlqtx.html