机器环境

两台虚拟机器
node60 eth1 ip 10.5.7.60
node61 eth1 ip 10.5.7.61

vxlan 组播地址:
224.1.1.1

node60 容器网络 10.239.0.0/16 vxlan 连接网桥地址 10.239.0.1
node61 容器网络 10.239.1.0/16 vxlan 连接网桥地址 10.239.1.1

配置步骤

创建 vxlan 网卡和网桥

node60

  1. $ ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.5.7.60 group 224.1.1.1 dev eth1
  2. $ ip link add bridge0 type bridge

node61

  1. $ ip link add vxlan0 type vxlan id 42 dstport 4789 local 10.5.7.61 group 224.1.1.1 dev eth1
  2. $ ip link add bridge0 type bridge

vxlan网卡绑定到网桥上

需要在61和61机器都执行

  1. ip link set vxlan0 master bridge0
  2. ip link set vxlan0 up
  3. ip link set bridge0 up

创建容器网络

以 node60 为例子,创建容器网络过程。创建网络命名空间, 以及一对veth pair, 把 veth pair 一端放到容器网络空间上, 另外一端接到bridge0 上。 容器网络接口配置ip 地址为10.239.0.2

创建container1网络

  • 创建 container1 命名空间

    1. $ ip netns add container1
  • 创建容器网卡

创建veth对veth0-veth1, 把一端 veth1 移动到container1空间上。

  1. // 创建 veth
  2. $ ip link add veth0 type veth peer name veth1
  3. // veth0 接到网桥 bridge0
  4. $ ip link set dev veth0 master bridge0
  5. // 启动 lo 接口, 否则ping 127.0.0.1 / 自己 ip 地址不通
  6. $ ip netns exec container1 ip link set lo up
  7. // 修改接口名字为 eth0
  8. $ ip netns exec container1 ip link set veth1 name eth0
  9. // 配置 eth0 地址
  10. $ ip netns exec container1 ip addr add 10.239.0.2/16 dev eth0
  11. // 启动 eth0
  12. $ ip netns exec container1 ip link set up
  • node62 进行同样的配置 ```bash // 创建 veth 对 $ ip link add veth0 type veth peer name veth1

// veth0 接到网桥 bridge0 上 $ ip link set dev veth0 master bridge0

// 启动 lo 接口, 否则ping 127.0.0.1 / 自己 ip 地址不通 $ ip netns exec container1 ip link set lo up

// 修改接口名字为 eth0 $ ip netns exec container1 ip link set veth1 name eth0

// 配置 eth0 地址 $ ip netns exec container1 ip addr add 10.239.1.2/16 dev eth0

// 启动 eth0 $ ip netns exec container1 ip link set up

  1. <a name="2xRd7"></a>
  2. ## 扩展
  3. <a name="odPXA"></a>
  4. ### 容器允许访问主机网络
  5. 容器 veth 对端接到网桥bridge0上, 可以通过网桥作为路由器访问主机网络, 需要打开linux 路由功能
  6. 需要 bridge0 配置ip地址
  7. ```bash
  8. $ ip addr add 10.239.0.1/24 dev bridge0

在容器配置默认路由为 bridge0

$ ip netns exec container1 ip route add default via 10.239.0.1 dev eth0
$ echo "1" > /proc/sys/net/ipv4/ip_forward

在容器里面 ping 主机网络

$ip netns exec container1 ping 10.5.7.60                              
PING 10.5.7.60 (10.5.7.60) 56(84) bytes of data.
64 bytes from 10.5.7.60: icmp_seq=1 ttl=64 time=0.121 ms
64 bytes from 10.5.7.60: icmp_seq=2 ttl=64 time=0.055 ms

已经ping通了

容器允许访问主机外网络

测试发现容器里面不能 ping 通主机外网络, 例如 10.5.7.61。 容器出去以后,还是10.239 网络, 其他机器返回包不能收到,所有需要在iptable net 给容器网络段 10.239.0.0/16 做地址伪装

$ iptables -t nat -A POSTROUTING -s 10.239.0.0/16 -j MASQUERADE

容器网络出去以后,地址就会替换为主机ip地址,容器网络就可以访问外网了

ip netns exec container1 ping 123.58.180.7
PING 123.58.180.7 (123.58.180.7) 56(84) bytes of data.
64 bytes from 123.58.180.7: icmp_seq=1 ttl=61 time=27.6 ms
64 bytes from 123.58.180.7: icmp_seq=2 ttl=61 time=27.5 ms
64 bytes from 123.58.180.7: icmp_seq=3 ttl=61 time=27.2 ms
64 bytes from 123.58.180.7: icmp_seq=4 ttl=61 time=27.2 ms