主流Docker网络的实现原理概述.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE 2 主流Docker网络的实现原理概述 目 录 TOC \o 1-3 \h \z \u 一、容器网络简介 3 二、Docker原生的Overlay 6 2.1 Overlay网络环境 6 2.2 容器南北流量 7 2.3 容器东西向流量 8 2.4 ARP代理 9 2.5 VTEP表静态配置 11 2.6 总结 12 三、和Docker Overlay差不多的Weave 12 四、简单优雅的Flannel 15 4.1 Flannel简介 16 4.2 Flannel Overlay网络 16 4.3 Flannel host-gw网络 19 4.4 Flannel利用云平台路由实现跨主机通信 21 五、黑科技最多的Calico 27 5.1 Calico环境配置 27 5.2 Calico容器内部网络 29 5.3 Calico主机路由 31 5.4 Calico多网络支持 31 5.5 Calico跨网段通信 35 六、与OpenStack网络集成的Kuryr 36 一、容器网络简介 容器网络主要解决两大核心问题:一是容器的IP地址分配,二是容器之间的相互通信。本文重在研究第二个问题并且主要研究容器的跨主机通信问题。 实现容器跨主机通信的最简单方式就是直接使用host网络,这时由于容器IP就是宿主机的IP,复用宿主机的网络协议栈以及underlay网络,原来的主机能通信,容器也就自然能通信,然而带来的最直接问题就是端口冲突问题。 因此通常容器会配置与宿主机不一样的属于自己的IP地址。由于是容器自己配置的IP,underlay平面的底层网络设备如交换机、路由器等完全不感知这些IP的存在,也就导致容器的IP不能直接路由出去实现跨主机通信。 要解决如上问题实现容器跨主机通信,主要有如下两个思路: 思路一:修改底层网络设备配置,加入容器网络IP地址的管理,修改路由器网关等,该方式主要和SDN结合。 思路二:完全不修改底层网络设备配置,复用原有的underlay平面网络,解决容器跨主机通信,主要有如下两种方式: Overlay隧道传输。把容器的数据包封装到原主机网络的三层或者四层数据包中,然后使用原来的网络使用IP或者TCP/UDP传输到目标主机,目标主机再拆包转发给容器。Overlay隧道如Vxlan、ipip等,目前使用Overlay技术的主流容器网络如Flannel、Weave等。 修改主机路由。把容器网络加到主机路由表中,把主机当作容器网关,通过路由规则转发到指定的主机,实现容器的三层互通。目前通过路由技术实现容器跨主机通信的网络如Flannel host-gw、Calico等。 本文接下来将详细介绍目前主流容器网络的实现原理。 在开始正文内容之前,先引入两个后续会一直使用的脚本: 第一个脚本为?docker_netns.sh: #!/bin/bash NAMESPACE=$1 if [[ -z $NAMESPACE ]]; then ls -1 /var/run/docker/netns/ exit 0 fi NAMESPACE_FILE=/var/run/docker/netns/${NAMESPACE} if [[ ! -f $NAMESPACE_FILE ]]; then NAMESPACE_FILE=$(docker inspect -f {{.NetworkSettings.SandboxKey}} $NAMESPACE 2/dev/null) fi if [[ ! -f $NAMESPACE_FILE ]]; then echo Cannot open network namespace $NAMESPACE: No such file or directory exit 1 fi shift if [[ $# -lt 1 ]]; then echo No command specified exit 1 fi nsenter --net=${NAMESPACE_FILE} $@ 该脚本通过指定容器id、name或者namespace快速进入容器的network namespace并执行相应的shell命令。 如果不指定任何参数,则列举所有Docker容器相关的network namespaces。 # ./docker_netns.sh # list namespaces 4-a4a048ac67 abe31dbbc394 default # ./docker_netns.sh busybox ip

文档评论(0)

智慧IT + 关注
实名认证
内容提供者

微软售前技术专家持证人

生命在于奋斗,技术在于分享!

领域认证该用户于2023年09月10日上传了微软售前技术专家

1亿VIP精品文档

相关文档