Docker容器及kubernetes网络

12 篇文章 0 订阅
9 篇文章 0 订阅

        本文讲述下docker容器以及k8s部署环境下,与网络相关的知识。读者需要对tcp/ip网络,交换/路由,网络虚拟化以及容器技术需要有一定的基础。

 

1. 浅谈容器网络

        容器container,就是一个被隔离的环境(Namespace)下,同时限制了访问权限(Cgroup)的进程运行时,它配置了属于自己的网卡,网络栈,就像物理机一样,可以访问外部网络,同时外部网络也可以访问容器,容器间也可以互相访问。

1.1 容器怎么访问外部网络

        配置了网卡的物理主机,网卡+tcp/ip协议栈就可以访问网络了。网卡完成物理层和链接层的收发,ip路由,tcp负载传输。主机与主机通信,主机访问互联网,用网线或者光纤连接主机到交换机,或者两台主机网线直连,主机配置IP地址,互相间就可以通信了,中间的网络,可能是二层,也可能是三层的。

 

                                                           Figure -- 1

        如图Figure -- 1所示,正是veth pair这个设备,把容器“连接”到主机,然后通过主机的路由转发,虚拟网桥桥接,Vxlan包封装这些种种技术,容器的packet最终通过物理主机的物理网卡发送或者接收。

        这里用到的一种名叫Veth Pair的虚拟设备,它的特点是:它被创建后,总是以两张网卡(Veth Peer)的形式成对出现,并且,从其中一个“网卡”发出的数据包,可以直接出现在与它对应的另一张“网卡”上,哪怕这两个“网卡”在不同的Network Namespace里。

        容器有自己的Network Namespace,TCP/IP网络栈,报文发送至Veth Pair在容器侧的虚拟设备,虚拟Veth设备发送报文,这个过程就是前端(front-end)的处理。报文到达宿主机后,在宿主机的Network Namespace,TCP/IP网络栈,路由、封装、转发,报文最后通过物理网卡发送出去,这个过程就是后端(back-end)的处理。

思考:

  1. Veth(virtual ethernet)是以太链路层设备,承载转发的是二层mac帧,容器发出的帧到达主机侧后,怎么到达bridge,路由是三层报文转发,怎么处理二层mac帧?
  2. 除了veth pair方式外,容器还可能有别的方式访问外部网络吗?哪种方式性能会好些?
  3. 容器对比物理主机,网络性能损耗在哪里?路由、封装、转发,还有哪些处理?

1.2 容器网络模型

       上一节讲了容器有独立的网络命名空间,通过veth pair访问外部网络。可以访问外部网络需要具备哪些条件呢?这一节就讲讲容器创建后,需要创建些啥设备,如何配置,有啥标准的接口和模型?

       首先选择网络方案(容器网络第三方插件),创建和配置容器网卡,网络栈(路由表、iptables、Arp、IP地址、dns等),加入到对应的命名空间,其次创建配置互通和隔离的方式(路由、vxlan、vlan等)。

       目前围绕docker容器,发展出了两种主流的接口和模型,一种是docker主导的Container network model(CNM)和k8s社区主导的Container network interface(CNI)。

 

2. 容器间的互通

        传统的网络是由桥接、交换、路由这些转发设备,服务器、笔记本、台式机、各种瘦终端、以及具备收发功能的嵌入式设备,这些林林总总的节点组成。随着虚拟化,容器,云计算技术的发展,一方面,出现了虚拟机、容器这样的虚拟实体,另一方面这些虚拟实体怎么互相访问,怎么通过网络与物理设备互相访问,就又出现了新的网络虚拟化技术(如vxlan,大二层技术等),同时为了应对新的场景(多租户,跨机房),更好的提供服务(转发路由选择、分类服务、流量控制监控),出现了Software Define Network(SDN)这样的技术。

2.1 虚拟机场景

        Qemu虚拟机是怎么访问外部网络的?与容器有啥区别?

                                                Figure -- 2

        如图Figure -- 2和Figure -- 1所示,虚拟机的虚拟网卡是虚拟化控制器VMM(qemu/kvm)虚拟化出来的,网卡的逻辑控制,数据层面的I/O都是虚拟化控制VMM在参与,说明白些,就是VMM这个软件程序在模拟,VMM后面将虚拟机的报文发送给tap设备,或者直接socket发送给某个目的地址。

      容器与虚拟机网络的差别:

  • 容器通过Veth Pair与外部网络通信,虚拟机通过虚拟网卡,性能损耗会更大。
  • 虚拟机网络承载的是带mac地址的以太帧,容器网络承载的是IP包。

2.2 容器访问外网

      这里讲一下docker容器通过IP与外部网络进行端对端层面的通信,容器的IP报文与外面网络是怎么交互的。

                                         Figure -- 3

 

       容器1的IP地址:172.17.0.2,节点2的IP地址:192.168.0.3,它们之间怎么互相访问?如图Figure -- 3所示,下面用ping举例说明报文的流向。

     1)Ping程序生成ICMP Reuqest报文,通过raw socket发送。

     2)Kernel收到报文后查询路由表,看是否有到达目的地址192.168.0.3的路由。

         $ route

         Kernel IP routeing table

         Destination    Gateway    Genmak     Flags  Metric  Ref  use  Iface

        default        172.17.0.1  0.0.0.0      UG    0      0    0    eth0

        172.17.0.0     0.0.0.0     255.255.0.0  U     0      0    0    eth0

        匹配到缺省路由,通过eth0设备发送。

      3)Veth Pair的另一端Veth0收到容器发的报文,veth0是bridge设备(docker0)的一个端口。Docker0是个二层的交换设备,虚拟的端口只收发报文,而由docker0转发。Docker0查看收到的报文时,发现目的mac地址(对应172.17.0.1的mac地址)就是本身的地址,就会把IP报文交给主机网络协议栈处理,主机查询路由表,看是否有到达192.168.0.3的路由。

         $ route

         Kernel IP routeing table

         Destination    Gateway    Genmak       Flags  Metric  Ref  use  Iface

         default       192.168.0.1  0.0.0.0        UG   100     0    0    enp2s0f0

         192.168.0.0   0.0.0.0      255.255.255.0  U    100     0    0    enp2s0f0

         172.17.0.0     0.0.0.0     255.255.0.0    U     0      0    0    docker0

          匹配到直连路由(192.168.0.0/24 via enp2s0f0),通过enp2s0f0发送。

   4目的主机Node2没有到达源容器172.17.0.1的路由信息,所有在源宿主机需要做IP伪装,将源IP替换成源宿主机的IP。

       iptables -t nat -S POSTROUTING

        -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

    5)接下来,容器的ICMP Request报文就通过物理网络到达目的主机Node2。

2.3 同主机场景

        这里讲一下docker容器通过IP与外部网络进行端对端层面的通信,同一主机的容器之间是怎么互相访问的。容器1的IP地址:172.17.0.2,容器2的IP地址:172.17.0.3,它们之间怎么互相访问?如图Figure -- 3所示,过程1)过程2)与上一节是一样的。

      4)docker0这个交换设备,收到veth0报文,查询到目的MAC地址(对应目的IP:172.17.0.3),发现可以通过端口Veth1发送。

     5)Veth Pair在容器2端的一个接口eth0就收到容器1发送的ICMP Request报文了。

2.4 不同主机场景

       这一节讲述下,不同主机场景下,容器间怎么互相访问的?这个问题,就是容器的“跨主通信”问题。在Docker的默认配置下,一台宿主机上的docker0网桥,和其他宿主机上的docker0网桥,不存在任何关联,宿主机不把它们打通,它们之间没有办法进行访问。

       不过,万变不离其宗,如图Figure -- 4所示,如果在主机间通过软件的方式,构建一个虚拟网络,连通这些不同宿主机上的容器、网桥,不就可以互相通信了。

                                                       Figure -- 4

        构建在宿主机物理网络上面的虚拟网络,对容器来说就好像是个连通的设备,并且不用去关心是用什么方式、技术实现的。这个Overlay Network,可以是二层的Vlxlan虚拟网络,IPinIP的tunnel,也可以是三层之间的路由转发,甚至是应用层软件转发。目前社区里有不少第三方的网络插件(Fannel、Calico、Weave等),基于不同的技术实现了Overlay Network,其实主要考量下面几点:

  • 容器的报文通过什么途径到插件。
  • 网络插件基于什么方式构建Overlay Network。
  • 原始报文如何封装、转发。

2.5 Fannel网络方案

      https://blog.csdn.net/somyjun/article/details/88736599

2.6 Calico网络方案

      https://blog.csdn.net/somyjun/article/details/88739545

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值