Pipework CoreOS의 작은 버그

3411 단어

Intro


어느 날 사무실에서 전기를 끊고 유지해야 하는데 IT개로서 전기가 끊기기 전에 사무실의 서버를 모두 멈추고 전기가 온 후에 이 서버들을 켜야 한다. 그 중에서 서버가 있는데 달리는 것은 코어OS시스템이고 위에 있는 dockercontainer이다.시스템이 시작된 후에 나는 이 dockercontainer들이 하나도 통하지 않는 것을 발견했다. 분명히 큰 구덩이를 밟았다.

환경

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

  • 현상


    요컨대 넷=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/[email protected];
    # 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단의 다른 기계에서는 핑이 10.0.0.3으로 통하지 않았다.
    docker exec -it test /bin/bash
    

    docker 실례 테스트 내부에 들어간 후에도 ping은 스위치를 통하지 않습니다. 10.0.1

    원인


    최초 의심은 프록시_pp의 문제는 아니지만 실제적으로 증명된 것은 아니다. 마지막으로docker가 구축한veth설비(숙주 호스트 이쪽)에 다리 설비 br0에 정확하게 첨가되지 않아 도무지 통하지 않는다는 것을 발견했다.
    해결 도 간단하다
    sudo brctl addif br0 vethlxxx
    # vethlxxx   docker  
    

    그리고 통했어.

    문제를 분석하다


    표면적인 원인을 찾기는 쉬운데, 왜vethlxx설비를 다리설비 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:
    즉, 어떤 인터페이스를 브리지 장치에 추가하기 전에 이 인터페이스의 상태가 up이라는 것을 보증해야 하지만, 분명히 Pipework 이 코드에서는 그렇지 않습니다. 여기는 BR0에 먼저 가입한 다음에 이 인터페이스를 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에서)

    한마디 더 하다


    이어서 나는 테스트 프로그램을 테스트했다.sh를 CentOS 7로 복사하여 달렸더니 CentOS 7에 문제가 없습니다.

    Appendix


    일부 온라인 문서를 참조했습니다.
  • Network bridge
  • 좋은 웹페이지 즐겨찾기