前几天了解了一下docker overlay的原理,然后一直想验证一下自己的理解是否正确,今天模仿docker手工搭建了一个overlay网络。先上拓扑图,其实和上次画的基本一样。我下面提到的另一台机器是和下面拓扑图配置方法一样的一台机器,我就不重复画了。

首先实现图上红线部分,这部分是访问本机的container,主要涉及负载均衡(sandbox_1)和一个交换机(sandbox_2),不涉及overlay网络。

  • 创建各个namespace和必要的veth
ip netns add sandbox_1
ip netns add sandbox_2
ip netns add container
ip link add pandora_bridge type bridge
ip addr add 172.18.0.1/16 dev pandora_bridge
ip link add veth100 type veth peer name veth101
ip link set veth100 master pandora_bridge
ip link set veth101 netns sandbox_1
ip link set pandora_bridge up
ip link set veth100 up
ip link add veth102 type veth peer name veth103
ip link set veth102 netns sandbox_1
ip link set veth103 netns sandbox_2
ip link add veth104 type veth peer name veth105
ip link set veth104 netns sandbox_2
ip link set veth105 netns container
  • 设置sandbox_1里的路由和负载均衡
ip netns exec sandbox_1 bash
ip addr add 172.18.0.2/16 dev veth101
ip addr add 10.0.0.2/24 dev veth102
ip route add default via 172.18.0.1
ip link set veth101 up
ip link set veth102 up
ipvsadm -A -t 172.18.0.2:80 -s rr
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.4 -m
iptables -t nat -I POSTROUTING -d 10.0.0.0/24 -m ipvs --ipvs -j SNAT --to-source 10.0.0.2
echo 1 >/proc/sys/net/ipv4/vs/conntrack #这个地方困扰我很久
  • 设置sandbox_2里的交换机
ip netns exec sandbox_2 bash
ip link add edge_bridge type bridge
ip link set veth103 master edge_bridge
ip link set veth104 master edge_bridge
ip addr add 10.0.0.1/24 dev edge_bridge
ip link set edge_bridge up
ip link set veth103 up
ip link set veth104 up
  • 启动容器
ip netns exec container bash
ip addr add 10.0.0.4/24 dev veth105
ip link set veth105 up
ip route add default via 10.0.0.1
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  • 把外网口ens33的数据包转到这个处理流程
iptables -t nat -I PREROUTING -d 192.168.228.148 -p tcp --dport 80 -j DNAT --to-destination 172.18.0.2

上面这些步骤设置完整个红色的流程就能走通了。我在设置的时候负载均衡那里数据包始终不走POSTROUTING链,没法设置SNAT,浪费了不少时间,后来谷歌发现需要设置echo 1 >/proc/sys/net/ipv4/vs/conntrack,这个参数具体什么意思我还没去查。其他设置都很好理解。

然后处理绿线的部分,这个是overlay最关键的地方

  • 创建vxlan并且加入交换机,注意这个vxlan一定要在namespace 1里创建然后挪到sandbox_2,而且这个proxy也很重要,因为我们需要vxlan的arp代理功能(和普通设备的arp代理不一样),因为在overlay网络里广播非常耗资源,我们使用静态arp和vxlan的arp代理处理arp请求。
ip link add vxlan0 type vxlan id 100 dstport 4789 proxy
ip link set vxlan0 netns sandbox_2
  • 在vxlan0设置静态arp,这两个mac地址是我另一台机器上container和sandbox_2里的设备
ip netns exec sandbox_2 bash
arp -i vxlan0 -s 10.0.0.12 1e:66:c0:a0:95:3f
arp -i vxlan0 -s 10.0.0.14 3a:7f:72:5b:5d:dd
  • 在vxlan0上设置转发,告诉vxlan0那些数据包需要发给overlay的其他节点,这两个mac地址和上面两个对应,ip地址是另一台机器的ip地址
ip netns exec sandbox_2 bash
bridge fdb add 3a:7f:72:5b:5d:dd dev vxlan0 dst 192.168.228.149
bridge fdb add 1e:66:c0:a0:95:3f dev vxlan0 dst 192.168.228.149
  • 配置负载均衡,把部分流量转到另一台机器
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.14:80 -m

到这里这台机器就配置好了。

另一台机器配置方法一样,我就直接把命令贴出来了

ip netns add sandbox_1
ip netns add sandbox_2
ip netns add container
ip link add pandora_bridge type bridge
ip addr add 172.18.0.1/16 dev pandora_bridge
ip link add veth100 type veth peer name veth101
ip link set veth100 master pandora_bridge
ip link set veth101 netns sandbox_1
ip link set pandora_bridge up
ip link set veth100 up
ip link add veth102 type veth peer name veth103
ip link set veth102 netns sandbox_1
ip link set veth103 netns sandbox_2
ip link add veth104 type veth peer name veth105
ip link set veth104 netns sandbox_2
ip link set veth105 netns container
iptables -t nat -I PREROUTING -d 192.168.228.149 -p tcp --dport 80 -j DNAT --to-destination 172.18.0.2
ip link add vxlan0 type vxlan id 100 dstport 4789 proxy
ip link set vxlan0 netns sandbox_2 ip netns exec sandbox_1 bash
ip addr add 172.18.0.2/16 dev veth101
ip addr add 10.0.0.12/24 dev veth102
ip link set veth101 up
ip link set veth102 up
ip route add default via 172.18.0.1
ipvsadm -A -t 172.18.0.2:80 -s rr
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.14 -m
ipvsadm -a -t 172.18.0.2:80 -r 10.0.0.4 -m
iptables -t nat -I POSTROUTING -d 10.0.0.0/24 -m ipvs --ipvs -j SNAT --to-source 10.0.0.12
echo 1 >/proc/sys/net/ipv4/vs/conntrack ip netns exec sandbox_2 bash
ip link add edge_bridge type bridge
ip link set veth103 master edge_bridge
ip link set veth104 master edge_bridge
ip addr add 10.0.0.11/24 dev edge_bridge
ip link set edge_bridge up
ip link set veth103 up
ip link set veth104 up
ip link set vxlan0 master edge_bridge
ip link set vxlan0 up
arp -i vxlan0 -s 10.0.0.4 2a:bb:1a:0f:2c:3a
arp -i vxlan0 -s 10.0.0.2 0e:a8:06:71:ca:cc
bridge fdb add 2a:bb:1a:0f:2c:3a dev vxlan0 dst 192.168.228.148
bridge fdb add 0e:a8:06:71:ca:cc dev vxlan0 dst 192.168.228.148 ip netns exec container bash
ip addr add 10.0.0.14/24 dev veth105
ip link set veth105 up
ip route add default via 10.0.0.11
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

手工实现docker的vxlan的更多相关文章

  1. 在华为云ECS上手工通过Docker部署tomcat

    本文介绍了如何在华为云上ECS上手工通过Docker部署tomcat,并提供了Docker常用操作 一.环境准备 ECS:操作系统版本:    CentOS Linux release 7.6.181 ...

  2. 手工在Docker for mac上安装Kubernetes

    此文发布时间比较早,当前已经有更好的办法,请参考网页: https://github.com/AliyunContainerService/k8s-for-docker-desktop 以下为原文 通 ...

  3. 【转】理解Docker容器网络之Linux Network Namespace

    原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...

  4. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  5. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  6. Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  7. docker 换更优秀的 文件系统 比如 OverlayFS(centos7 overlay2)

    内容摘自:http://www.projectatomic.io/blog/2015/06/notes-on-fedora-centos-and-docker-storage-drivers/ doc ...

  8. 使用 Docker 搭建 Java Web 运行环境

    黄勇的博客 Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它.Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内外已经有越来越多的公司开始逐 ...

  9. 转:使用 Docker 搭建 Java Web 运行环境

    原文来自于:http://www.codeceo.com/article/docker-java-web-runtime.html Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都 ...

随机推荐

  1. AWD攻防技战法

    round1 弱口令 cat /etc/passwd  查看用户信息 修改用户密码(passwd  username) 通过ssh弱口令批量getshell  (通过msf的auxiliary/sca ...

  2. java面试题0004-在一个类上是否可以用abstract和final同时加以修饰?

    我们先用提干两个修饰词中的任意一个创建一个类 package components.javaTest.day4_20200910; /** * Question004: * java面试题0004-在 ...

  3. 不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

    本来想系统回顾下 ZooKeeper的,可是网上没找到一篇合自己胃口的文章,写的差不多的,感觉大部分都是基于<从Paxos到ZooKeeper 分布式一致性原理与实践>写的,所以自己读了一 ...

  4. Spring Cloud Alibaba微服务生态的基础实践

    目录 一.背景 二.初识Spring Cloud Alibaba 三.Nacos的基础实践 3.1 安装Nacos并启动服务 3.2 建立微服务并向Nacos注册服务 3.3 建立微服务消费者进行服务 ...

  5. Linux实战(20):非docker部署ELK

    部署环境: Elasticsearch:7.5.2 Kibana:7.5.2 Logstash:7.5.2 filebeat:7.5.2 redis:最新版 部署方式:rpm+二进制包 使用架构 软件 ...

  6. Linux实战(6):Centos8上传镜像

    小记 做以下操作之前得准备一个Docker Hub 的账号,然后创建仓库可私有也可公有这得看你自己了,仓库的名称需记住等等会有用. 安装podman podman跟docker使用的命令非常的接近,但 ...

  7. python中圆周率的计算

    蒙特卡罗方法计算圆周率 蒙特卡罗方法是一个撒点方法,取一个正圆的四分之一,和一个正方形的四分之一 形成一个单位方形,单位四分之一圆和四分之一正方形之比,就构成了圆周率 向这个区域撒点,如果点落在圆内部 ...

  8. Eclipse安装AmaterasUML插件问题

    为了画UML图,我想在Eclipse(版本Version: Oxygen Release (4.7.0))安装AmaterasUML,第一步,安装GEF - http://download.eclip ...

  9. Apache Hudi和Presto的前世今生

    一篇由Apache Hudi PMC Bhavani Sudha Saktheeswaran和AWS Presto团队工程师Brandon Scheller分享Apache Hudi和Presto集成 ...

  10. maven打包(jar)类型错误

    maven项目打包测试环境时部署发现是开发环境.确认打包命令无误, 此情况下将target内容全部删除,重新打包即可.是全部删除.