美文网首页
记录测试容器通过flannel通信的一个问题

记录测试容器通过flannel通信的一个问题

作者: ljyfree | 来源:发表于2019-03-27 11:04 被阅读0次

测试环境

  • 两台主机A(10.25.151.100)和B(10.25.151.101)可以通信,安装好了docker
# docker -v
Docker version 1.13.1, build b2f74b2/1.13.1
  • 主机A上安装etcd用来同步数据
# etcd -v
2019-03-26 22:46:28.933879 W | pkg/flags: flag "-v" is no longer supported - ignoring.
2019-03-26 22:46:28.934207 I | etcdmain: etcd Version: 3.3.11
2019-03-26 22:46:28.934221 I | etcdmain: Git SHA: 2cf9e51
2019-03-26 22:46:28.934228 I | etcdmain: Go Version: go1.10.3
2019-03-26 22:46:28.934234 I | etcdmain: Go OS/Arch: linux/amd64
2019-03-26 22:46:28.934242 I | etcdmain: setting maximum number of CPUs to 1, total number of available CPUs is 1
2019-03-26 22:46:28.934256 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2019-03-26 22:46:28.938159 C | etcdmain: listen tcp 127.0.0.1:2380: bind: address already in use
  • 安装好flannel,并设置网段
# flanneld -version
0.7.1
# etcdctl mk /atomic.io/network/config '{ "Network": "182.48.0.0/16" }'
{ "Network": "182.48.0.0/16" }
  • 主机A上docker0和flannel0的IP都有了
# ifconfig flannel0 | grep 182
        inet 182.48.56.0  netmask 255.255.0.0  destination 182.48.56.0
# ifconfig docker0 | grep 182
        inet 182.48.56.1  netmask 255.255.255.0  broadcast 0.0.0.0
  • 主机A上使用 docker.io/centos 启动容器 "centos",获取到IP
# ifconfig | grep 182
        inet 182.48.56.2  netmask 255.255.255.0  broadcast 0.0.0.0
  • 主机B上docker0和flannel0的IP都有了
# ifconfig flannel0 | grep 182
        inet 182.48.72.0  netmask 255.255.0.0  destination 182.48.72.0
# ifconfig docker0 | grep 182
        inet 182.48.72.1  netmask 255.255.255.0  broadcast 0.0.0.0
  • 主机B,使用docker.io/centos启动容器"centos",获取到IP
# ifconfig | grep 182
        inet 182.48.72.2  netmask 255.255.255.0  broadcast 0.0.0.0

遇到的问题

一句话概括,就是UDP模式下,通过Flannel跨节点容器IP不通

定位过程

  • Flannel采用默认的UDP模式
  • 在主机A的容器上持续ping主机B上容器的IP地址
[root@976483e7ea80 /]# ping 182.48.72.2
PING 182.48.72.2 (182.48.72.2) 56(84) bytes of data.
  • 在主机A的docker0上抓包,报文还是正确的,源IP是182.48.56.2
# tcpdump -i docker0 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:54:37.359239 02:42:b6:30:38:02 > 02:42:33:38:70:51, ethertype IPv4 (0x0800), length 98: 182.48.56.2 > 182.48.72.2: ICMP echo request, id 18, seq 90, length 64
22:54:38.359238 02:42:b6:30:38:02 > 02:42:33:38:70:51, ethertype IPv4 (0x0800), length 98: 182.48.56.2 > 182.48.72.2: ICMP echo request, id 18, seq 91, length 64
  • 但是,但是,在Flannel上抓包,发现报文的源IP被改为182.48.56.0了!
# tcpdump -i flannel0 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on flannel0, link-type RAW (Raw IP), capture size 262144 bytes
22:57:05.359275 ip: 182.48.56.0 > 182.48.72.2: ICMP echo request, id 18, seq 238, length 64
22:57:06.359272 ip: 182.48.56.0 > 182.48.72.2: ICMP echo request, id 18, seq 239, length 64
  • 在主机B的flannel0上抓包,和上一步得到的报文相同
  • 而在主机B的docker0上抓包,发现ICMP Request已经不见了
  • 当然,主机B上的容器没有收到ICMP Request,当然也不会回复ICMP Reply

One more thing

  • 如果改为在主机A的容器上ping主机B的docker0的IP 182.48.72.1 ,是可以成功的
[root@976483e7ea80 /]# ping 182.48.72.1
PING 182.48.72.1 (182.48.72.1) 56(84) bytes of data.
64 bytes from 182.48.72.1: icmp_seq=1 ttl=61 time=0.539 ms
64 bytes from 182.48.72.1: icmp_seq=2 ttl=61 time=0.708 ms
  • 在主机B的flannel0上抓包,发现源IP也被修改为182.48.56.0
# tcpdump -i flannel0 -enn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on flannel0, link-type RAW (Raw IP), capture size 262144 bytes
23:01:07.454285 ip: 182.48.56.0 > 182.48.72.1: ICMP echo request, id 20, seq 4, length 64
23:01:07.455040 ip: 182.48.72.1 > 182.48.56.0: ICMP echo reply, id 20, seq 4, length 64
  • 在主机B的flannel0上可以抓到和上一步一样的报文
  • 在主机B的docker0上依然是抓不到报文的

相关文章

  • 记录测试容器通过flannel通信的一个问题

    测试环境 两台主机A(10.25.151.100)和B(10.25.151.101)可以通信,安装好了docker...

  • [docker 网络][flannel] 背后操作

    1. 前言 上文 [docker 网络][flannel] 配置安装测试 利用flannel vxlan实现了容器...

  • 配置flannel网络

    节点内的容器跨节点通信ß需要网络插件,当前就用 flannel,需要在所有节点上安装。 安装 flannel 配置...

  • flanneld

    Flannel Flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于Linux TUN/TA...

  • flannel通信方式之UDP

    flannel通信方式 目前比较成熟的flannel网络通信方式有UDP、VXLAN以及host-gw三种方式。 ...

  • Docker 单机测试 MariaDB Galera Clust

    最近工作有mysql集群的需要,做个学习记录。 创建网桥 作用:容器可以直接通过容器名称通信,不用设置IP。 目录...

  • Docker-网络

    网络 容器间通信 容器间可通过IP,Docker DNS Server或joined容器三种方式通信。 容器与外部...

  • Docker 容器之间的通信

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信。 一、 IP 通信 ...

  • k8s 报错总结

    flannel网络插件,跨主机pod无法通信 故障现象 本机实验 k8s版本1.18.3flannel 在pod中...

  • 深入解析容器 夸网络通信

    flannel框架 提供容器网络功能的,是 Flannel 的后端实现后端支持三种网络实现1 UDP2 vxl...

网友评论

      本文标题:记录测试容器通过flannel通信的一个问题

      本文链接:https://www.haomeiwen.com/subject/spiavqtx.html