Pipework在CoreOS上的一个小bug

Intro

某日办公室要断电维护,作为 IT 狗需要在断电之前把办公室的服务器都停掉,来电后再把这些服务器启起来,其中有台服务器,跑的是 CoreOS 系统,上面一堆的 docker container。系统起来后,我发现这些 docker container,一个都不通,显然,踩着大坑了......

环境

  • CoreOS stable (1185.5.0)
  • 4.7.3-coreos-r3
  • ip utility, iproute2-ss150210
  • Pipework 20150123

现象

简言之,就是用 net=none 启动的 docker 实例,用 Pipework 配置 ip 地址后 ping 不通,用代码表示是这样的:

docker run -i -t -d \
    --name=test \
    -h test \
    --net none \
    centos:6;
sudo pipework br0 \
    -i eth0 \
    test \
    10.0.0.3/24@10.0.0.1;
# br0 是桥,ip 地址是 10.0.0.2
# enp0s25 是直接在 10.0.0.0/24 网段的物理设备
# enp0s25 同时是桥 br0 的一个 interface
# eth0 是 docker 的网卡设备名
# 这个测试 docker 的 ip 地址是 10.0.0.3
# 10.0.0.0/24 的网关是 10.0.0.1

结果 10.0.0.0/24 段的其他机器上 ping 不通 10.0.0.3,

docker exec -it test /bin/bash

进入 docker 实例 test 内部以后也 ping 不通网关 10.0.0.1

原因

最早怀疑是 proxy_arp 的问题,但实际证明不是,最后发现是由于 docker 建立的 veth 设备(宿主机这端的)没有正确添加到桥设备 br0 里去,从而导致怎么都不通。

解决起来也很简单,直接用

sudo brctl addif br0 vethlxxx
# vethlxxx 是这个 docker 实例在宿主机侧的网络设备

然后就通了。

分析问题

找到表面原因容易,可为什么没能正确把 vethlxxx 设备加到桥设备 br0 里去呢?也不是第一次跑 Pipework 了,以前一直是好的。

看了看 Pipework 的代码,并调试执行了几遍,发现这个问题不是百分百出现的,只是有很大一部分概率。

最后大概定位问题在 Pipework 的这几句代码上:

(ip link set "$LOCAL_IFNAME" master "$IFNAME" > /dev/null 2>&1) \
    || (brctl addif "$IFNAME" "$LOCAL_IFNAME")

和后面的

ip link set "$LOCAL_IFNAME" up

为什么这么说呢,因为在附录的那个链接里,有段话说道:

To add an interface (e.g. eth0) into the bridge, its state must be up:

这也就是说将某个 interface 加入到桥设备之前,必须要先保证这个 interface 的状态是 up 的,但显然在 Pipework 这份代码里不是这样的,这里是先加入到 br0,然后再将这个 interface 设置为 up 的。

为了证明这个,写了一段 bash 脚本,来模拟这个情况,具体如下(文件名叫 test.sh):

#!/bin/bash

set -x

IFNAME="brtest"
MTU=1500

(ip link add dev "$IFNAME" type bridge ) \
    || (brctl addbr "$IFNAME")
ip link set "$IFNAME" up
for i in {10..90}; do
    LOCAL_IFNAME="vethltest${i}"
    GUEST_IFNAME="vethgtest${i}"
    ip link add name "$LOCAL_IFNAME" \
        mtu "$MTU" type veth \
        peer name "$GUEST_IFNAME" \
        mtu "$MTU"
#   ip link show "$LOCAL_IFNAME"
    if ((${i}%2)); then
        ip link set "$LOCAL_IFNAME" down
    else
        ip link set "$LOCAL_IFNAME" up
    fi
    (ip link set "$LOCAL_IFNAME" master "$IFNAME") \
        || (brctl addif "$IFNAME" "$LOCAL_IFNAME")
    ip link set "$LOCAL_IFNAME" up
done

在 CoreOS 上执行:

chmod +x test.sh # 这句执行一遍即可
sudo ./test.sh

最后再

brctl show brtest

看结果,发现:

  • vethltest${i}(i 为偶数的设备)都被正确添加到 brtest 里
  • vethltest${i}(i 为奇数的设备)有一些没有被正确添加到 brtest 里

结论:

在我所测试的平台(CoreOS)上,Pipework 是有问题的,原因来自于调用的命令 ip(来自于软件包 iproute2)

多说一句

随后我把测试程序 test.sh 拷贝到一台 CentOS 7 上跑,发现 CentOS 7 没有这个问题。

Appendix

参考了一些网上的文档:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 0×1.帧中继概述Frame Relay,简称FR,可以将它看做X.25协议的简化版本,帧中继网络中不考虑传输差错...
    Zero___阅读 2,277评论 0 2
  • 0 01、网络管理的五大功能(包括每项功能的具体情况) 1.配置管理:ISO定义的管理功能域中,配置管理包括视图管...
    哈熝少主阅读 3,061评论 1 20
  • 本文整理了在实践过程中使用的Linux网络工具,这些工具提供的功能非常强大,我们平时使用的只是冰山一角,比如lso...
    老夫刘某阅读 3,526评论 0 7
  • 很多人说,余生很长,努力去做自己喜欢的事,坚持下去就能得到自己想要的结果。 总说,坚持就是胜利。 也有很多人说,余...
    梦千机阅读 401评论 0 0