LabHub
배우기 러닝패스 코스

Networking Fundamentals

Read Your Own Pod's Network

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

네트워크를 그림으로 배우면 잘 안 남습니다. 지금 여러분이 쓰고 있는 이 파드의 네트워크를 직접 읽어 봅니다.

교재용으로 만든 예제가 아니라 실제 운영 클러스터라서, 책에 안 나오는 것들이 그대로 나옵니다 — /32 주소, 인터페이스와 다른 경로 MTU, search 도메인.

볼 곳

ip -4 addr show eth0        # 내 주소
ip route                    # 어디로 나가나
ip route get 1.1.1.1        # 이 목적지로는 어떻게 가나
cat /sys/class/net/eth0/mtu # 인터페이스 MTU
cat /etc/resolv.conf        # 이름을 어떻게 푸나
ss -tan                     # 지금 연결 상태

실험용 서버

python3 -m http.server 8080 --bind 127.0.0.1 &

단계

  1. 주소와 넷마스크 → 01-addr.txt
  2. 라우팅 → 02-route.txt
  3. MTU → 03-mtu.txt
  4. DNS → 04-dns.txt
  5. 포트 충돌 → 05-port.txt
  6. 손으로 친 HTTP → 06-http.txt
  7. 연결 상태 → 07-states.txt
  8. 정리 → 08-notes.md

참고

이 파드는 바깥 인터넷으로 못 나갑니다. DNS 조회만 열려 있습니다. 그래서 실험은 전부 이 파드 안의 서버로 합니다 — 배울 것은 다 배웁니다.

내 주소와 넷마스크

이 파드의 IP 와 넷마스크를 확인해 01-addr.txt 에 남기고, 그 넷마스크가 무슨 뜻인지 한 줄 적으세요.

ip -4 addr show eth0. /32 가 나올 겁니다.

/32이 네트워크에 나 혼자라는 뜻입니다. 보통은 /24 처럼 같은 대역에 이웃이 있는데, 여기는 없습니다. 그러면 바깥으로 어떻게 나가는지가 다음 단계입니다.

그런데 어떻게 나가나

라우팅 테이블을 뽑아 02-route.txt 에 남기고, /32 인데도 게이트웨이에 닿을 수 있는 이유를 적으세요.

ip route. 두 줄이 보일 겁니다 — default via <게이트웨이><게이트웨이> dev eth0 scope link.

두 번째 줄이 답입니다. 그 주소는 라우팅 없이 바로 닿는다(on-link) 고 커널에 알려 주는 것입니다. 넷마스크로는 같은 대역이 아니지만, 이 경로가 있어서 게이트웨이에 닿습니다.

인터페이스와 경로의 MTU 가 다르다

eth0 의 MTU 와 기본 경로의 MTU 를 각각 확인해 03-mtu.txt 에 남기세요. 다르다면 왜 다른지도 적으세요.

인터페이스는 cat /sys/class/net/eth0/mtu, 경로는 ip route get 1.1.1.1.

인터페이스는 1500 인데 경로는 더 작을 겁니다. 터널이 헤더를 덧붙이기 때문입니다 — 이 클러스터는 노드 사이를 암호화 터널로 잇고, 그만큼 실을 수 있는 크기가 줄어듭니다.

MTU 를 잘못 잡으면 작은 요청은 되는데 큰 응답만 멈추는 증상이 납니다. 원인을 찾기 가장 어려운 부류입니다.

짧은 이름이 어떻게 풀리나

/etc/resolv.conf 를 보고, 짧은 이름 하나를 실제로 조회해 04-dns.txt 에 남기세요.

cat /etc/resolv.confnameserversearch 가 있습니다. getent hosts kubernetes.default 처럼 짧은 이름을 조회해 보세요.

search 에 적힌 도메인들이 순서대로 붙어서 시도됩니다. kubernetes.defaultkubernetes.default.<네임스페이스>.svc.cluster.local → … 이렇게요. 그래서 짧게 써도 찾아집니다.

포트 하나에 프로그램 하나

포트 8080 에 서버를 띄운 뒤 같은 포트에 하나 더 띄워 보고, 그때 나오는 오류를 05-port.txt 에 남기세요.

python3 -m http.server 8080 --bind 127.0.0.1 & 로 하나 띄우고, 파이썬으로 같은 주소에 bind 를 시도하세요.

[Errno 98] Address already in use 가 나옵니다. 주소+포트 조합은 한 프로그램만 가질 수 있습니다. '포트가 이미 사용 중' 오류의 정체입니다.

HTTP 를 손으로 친다

라이브러리 없이 TCP 연결에 직접 HTTP 요청 문자열을 써서 응답을 받아 06-http.txt 에 남기세요.

bash 만으로 됩니다.

exec 3<>/dev/tcp/127.0.0.1/8080
printf 'GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3
timeout 3 head -8 <&3

줄 끝은 반드시 \r\n 이고, 헤더 끝에 빈 줄이 하나 더 있어야 합니다. HTTP 는 그냥 TCP 위에 약속된 글자를 주고받는 것뿐입니다.

연결에는 상태가 있다

연결을 만들고 닫으면서 ss 로 상태가 어떻게 바뀌는지 보고 07-states.txt 에 남기세요. TIME-WAIT 이 보여야 합니다.

ss -tan 으로 봅니다. 연결 중에는 ESTAB, 닫은 뒤에는 TIME-WAIT 이 한동안 남습니다.

TIME-WAIT 은 버그가 아닙니다. 늦게 도착한 패킷이 다음 연결에 섞이지 않게 잠시 자리를 잡아 두는 것입니다. 짧은 연결을 많이 만드는 서버에서 이게 쌓이면 포트가 마릅니다 — 그래서 연결을 재사용(keep-alive)합니다.

세 가지를 정리한다

08-notes.md 에 세 줄 이상. /32 인데 통신이 되는 이유, MTU 가 어긋나면 나는 증상, TIME-WAIT 이 있는 이유.

본문에 경로, MTU, TIME-WAIT 이 들어가야 합니다.