본문 바로가기

Cloud

SkyDive 핥아먹기

Kubevirt 공부를 하다가 Kubevirt Network Deep Dive 글을 보게 되었는데 너무 신기하고 잘 알려지지 않은 툴같아서 오랜만에 포스팅해본다. 코로나 덕에 회사 일이 여유롭기도 하고 발표할 때도 유용하게 쓰일 것 같아서 별 공부를 다하게 된다. (팀장님에겐 비밀임)

 공식 홈은 여기이다. Skydive는 오픈소스 프로젝트이며 네트워크 인프라에서 발생하는 상황을 보여주는 분석기이다. 홈페이지에 이것저것 글을 많이 써놨는데 네알못이라서 잘 이해는 못하겠고 조금씩 읽어봐야겠다. 포스팅 내용은 Skydive에서 제공하는 tutorial이다.

1. 시작

curl을 이용해 최신 바이너리를 받아주고, Skydive를 실행해준다.

curl -Lo - https://github.com/skydive-project/skydive-binaries/raw/jenkins-builds/skydive-latest.gz | gzip -d > skydive && chmod +x skydive && sudo mv skydive /usr/local/bin/

SKYDIVE_ETCD_DATA_DIR=/tmp sudo -E /usr/local/bin/skydive allinone

기본적으로는 루프백 주소로 돌기 때문에 나는 Kubernetes를 VM에 구성한 상태여서 주소를 바꿔주었다.

SKYDIVE_ANALYZER_LISTEN=0.0.0.0:8082 SKYDIVE_ETCD_DATA_DIR=/tmp sudo -E /usr/local/bin/skydive allinone

이렇게 하고 IP:8082에 들어가면 그림과 같은 내용이 나타난다.

서버 그림에 인터페이스가 달려있는데 실제로 서버에서 조회한 값과 같았다. 여기서부터 벌써 신기했다.

root@k-1:~# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

tunl0: flags=193<UP,RUNNING,NOARP>  mtu 1440

(스크롤이 너무 길어서 상세정보는 지움)

2. Traffic capture

Skydive는 트래픽 캡쳐기능을 제공한다. 우측의 CAPTURE를 클릭한다.

그리고 CREATE를 눌러 새로운 캡처를 생성한다.

Target을 지정하고 Start를 누르면 선택한 인터페이스 옆에 빨간점이 생긴다.

3. 다중 인터페이스의 트래픽 캡쳐

여러 개의 인터페이스의 흐름을 파악하기 위한 캡쳐 기능을 사용해본다. 환경에 네트워크 네임스페이스를 2개 추가해준다.

sudo ip netns add ns1
sudo ip link add ns1-eth0 type veth peer name eth0 netns ns1
sudo ip link set ns1-eth0 up
sudo ip netns exec ns1 ip link set eth0 up
sudo ip netns exec ns1 ip address add 10.0.0.1/24 dev eth0

sudo ip netns add ns2
sudo ip link add ns2-eth0 type veth peer name eth0 netns ns2
sudo ip link set ns2-eth0 up
sudo ip netns exec ns2 ip link set eth0 up
sudo ip netns exec ns2 ip address add 10.0.0.2/24 dev eth0

sudo ip link add name br0 type bridge
sudo ip link set dev br0 up
sudo ip link set dev ns1-eth0 master br0
sudo ip link set dev ns2-eth0 master br0

화면이 아래와 같이 변하는 것을 볼 수 있다.

+버튼이 있는 오브젝트는 더블클릭을 통해 내용물을 볼 수 있다.

새로운 캡처를 생성하여 ns1의 eth0과 ns2의 eth1을 각각 클릭하여준다.

--- 여기까지 했는데 VM에서 브릿지가 생성이 잘 안됐다. ㅠㅠ 그래서 도커 브릿지에 연결함.. 너무 야맨가...

어쨌든 핑 찍어보면 ICMP4가 오고가는 것을 볼 수 있다.

4. Packet Injector

 Skydive는 패킷을 생성해서 보내고 경로를 캡쳐하여 트래픽의 상황을 확인하는 기능을 제공한다. 앞전에 ping을 통해 확인을 했다면 지금은 패킷 인젝터를 통해 핑을 생성한다.

Generator을 클릭해 출발지/목적지 선택 이후 패킷을 넣어준다. 그 이후 FLOW를 확인해보면 패킷이 늘어난 것을 볼 수 있다.

이러한 과정을 통해 이슈가 나는 상황을 재현해보고 테스트할 수 있다. iptables에 규칙을 추가해본다.

sudo iptables -t filter -A FORWARD -i br0 -o br0 -m physdev --physdev-is-bridged -j DROP

패킷을 보내보면 브릿지에서 막히는 것을 볼 수 있다.

너무 길어서 2편으로 계쏙

~~미리 보는 2편 내용~~

5. Multi-node and tunneling

6. API/CLI tour

7. Advanced capture options

8. Skydive as Grafana datasource