Pipework CoreOS의 작은 버그
Intro
어느 날 사무실에서 전기를 끊고 유지해야 하는데 IT개로서 전기가 끊기기 전에 사무실의 서버를 모두 멈추고 전기가 온 후에 이 서버들을 켜야 한다. 그 중에서 서버가 있는데 달리는 것은 코어OS시스템이고 위에 있는 dockercontainer이다.시스템이 시작된 후에 나는 이 dockercontainer들이 하나도 통하지 않는 것을 발견했다. 분명히 큰 구덩이를 밟았다.
환경
현상
요컨대 넷=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
결과를 보면 다음과 같습니다.
(ip link set "$LOCAL_IFNAME" master "$IFNAME" > /dev/null 2>&1) \
|| (brctl addif "$IFNAME" "$LOCAL_IFNAME")
ip link set "$LOCAL_IFNAME" up
#!/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
chmod +x test.sh #
sudo ./test.sh
brctl show brtest
결론:
제가 테스트한 플랫폼(CoreOS)에서 Pipework에 문제가 있습니다. 이유는 호출된 명령 ip(소프트웨어 패키지 iproute2에서)
한마디 더 하다
이어서 나는 테스트 프로그램을 테스트했다.sh를 CentOS 7로 복사하여 달렸더니 CentOS 7에 문제가 없습니다.
Appendix
일부 온라인 문서를 참조했습니다.
일부 온라인 문서를 참조했습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.