- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- TQD_School_1_导论.pdf VIP
- waters TQD操作手册.pdf VIP
- 2020秋七年级数学上册培优专项《新定义运算问题》.docx VIP
- (新)05 新定义中运算及解方程问题(考试版) 七年级数学上册(苏科版).docx VIP
- 医养结合工作开展情况汇报.docx VIP
- 无人机专业英语 课件全套 unit1 introduction to unmanned aerial veh ----unit3 flight dynamics of uav.pptx
- 中药灌肠在儿科的应用.pptx VIP
- 国家开放大学《国际经济法》形考任务1-4参考答案 .pdf VIP
- 内蒙古九师联盟2024-2025学年高三上学期期末考试数学试题【含答案解析】.docx VIP
- 电力建设工程施工及验收规范.docx VIP
原创力文档


文档评论(0)