Ssoon

[3주차] 다른 Node 에서 Pod ↔ Pod 간 통신 본문

쿠버네티스 네트워크 스터디 3기

[3주차] 다른 Node 에서 Pod ↔ Pod 간 통신

구구달스 2024. 9. 13. 16:42
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

Pod 배포 전 기본 상태 확인

🧿 Node 간 BGP 로 Pod 대역 정보 전파 확인

[ k8s-m ]

  • route | head -2: IP 라우팅 테이블의 헤더를 보여줍니다.
  • route -n | grep tunl0: tunl0 인터페이스를 사용하는 네트워크의 라우팅 정보를 보여줍니다. 
    • tunl0 인터페이스를 통해 172.16.34.0, 172.16.158.0, 172.16.184.0 네트워크로의 패킷이 전달됩니다.
(⎈|SsoonLab:N/A) root@k8s-m:~# route | head -2 ; route -n | grep tunl0
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.34.0     192.168.20.100  255.255.255.0   UG    0      0        0 tunl0
172.16.158.0    192.168.10.101  255.255.255.0   UG    0      0        0 tunl0
172.16.184.0    192.168.10.102  255.255.255.0   UG    0      0        0 tunl0

 

[ k8s-w1 ]

  • route -n | grep tunl0: tunl0 인터페이스를 사용하는 네트워크의 라우팅 정보를 보여줍니다.
  • 이 인터페이스를 통해 172.16.34.0, 172.16.116.0, 172.16.184.0 네트워크로의 패킷이 각각 192.168.20.100, 192.168.10.10, 192.168.10.102 를 통해 전달됩니다
root@k8s-w1:~# route | head -2 ; route -n | grep tunl0
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.34.0     192.168.20.100  255.255.255.0   UG    0      0        0 tunl0
172.16.116.0    192.168.10.10   255.255.255.0   UG    0      0        0 tunl0
172.16.184.0    192.168.10.102  255.255.255.0   UG    0      0        0 tunl0
  • k8s-w1 , k8s-w2 의 tunl0 정보 확인
root@k8s-w1:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP>  mtu 8981
        inet 172.16.158.0  netmask 255.255.255.255
        tunnel   txqueuelen 1000  (IPIP Tunnel)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@k8s-w2:~# ifconfig tunl0
tunl0: flags=193<UP,RUNNING,NOARP>  mtu 8981
        inet 172.16.184.0  netmask 255.255.255.255
        tunnel   txqueuelen 1000  (IPIP Tunnel)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

🧿  k8s-w1 과 k8s-w2 에 각각 Pod 1개씩 생성

(⎈|SsoonLab:N/A) root@k8s-m:~# cat node2-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  nodeName: k8s-w1
  containers:
  - name: pod1
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  nodeName: k8s-w2
  containers:
  - name: pod2
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
  
(⎈|SsoonLab:N/A) root@k8s-m:~# kubectl apply -f node2-pod2.yaml
pod/pod1 created
pod/pod2 created

(⎈|SsoonLab:N/A) root@k8s-m:~# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          34s
pod2   1/1     Running   0          34s
  • pod1은 k8s-w1 노드에서 172.16.158.7 IP 주소와 calice0906292e2 인터페이스를 사용하며, 
  • pod2는 k8s-w2 노드에서 172.16.184.1 IP 주소와 calibd2348b4f67 인터페이스를 사용합니다
(⎈|SsoonLab:N/A) root@k8s-m:~# calicoctl get workloadendpoints
WORKLOAD   NODE     NETWORKS          INTERFACE
pod1       k8s-w1   172.16.158.7/32   calice0906292e2
pod2       k8s-w2   172.16.184.1/32   calibd2348b4f67

 

[ k8s-w1 ]

🧿 pod2(172.16.184.0/24) 로 가는 패킷은 k8s-w2(192.168.10.102) 게이트웨이를 통해 tunl0 인터페이스를 사용합니다.

root@k8s-w1:~# route -n | head -2 ; route -n | grep 172.16.
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
172.16.184.0    192.168.10.102  255.255.255.0   UG    0      0        0 tunl0

 

[ k8s-w2]

🧿 pod1(172.16.158.0/24) 로 가는 패킷은 k8s-w1(192.168.10.101) 게이트웨이를 통해 tunl0 인터페이스를 사용합니다.

root@k8s-w2:~# route -n | head -2 ; route -n | grep 172.16.
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
172.16.158.0    192.168.10.101  255.255.255.0   UG    0      0        0 tunl0

 

[ k8s-w1 ]

  •  tunl0 인터페이스 TX/RX 패킷 카운트 확인합니다. 
    • tunl0 인터페이스는 현재 활성화되어 있고 작동 중이지만, 데이터를 송수신하지 않고 있는 상태입니다.
root@k8s-w1:~# ifconfig tunl0 | head -2 ; ifconfig tunl0 | grep bytes
tunl0: flags=193<UP,RUNNING,NOARP>  mtu 8981
        inet 172.16.158.0  netmask 255.255.255.255
        RX packets 0  bytes 0 (0.0 B)
        TX packets 0  bytes 0 (0.0 B)

 

[ pod1 ]

  • pod1 Shell 접속하고 pod1 에서 pod2 로 핑 통신을 확인합니다.
(⎈|SsoonLab:N/A) root@k8s-m:~# kubectl exec pod1 -it -- zsh
                    dP            dP                           dP
                    88            88                           88
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P
88'  `88 88ooood8   88   Y8ooooo. 88'  `88 88'  `88 88'  `88   88
88    88 88.  ...   88         88 88    88 88.  .88 88.  .88   88
dP    dP `88888P'   dP   `88888P' dP    dP `88888P' `88888P'   dP

Welcome to Netshoot! (github.com/nicolaka/netshoot)
Version: 0.13

 pod1  ~  ping -c 1 172.16.184.1
PING 172.16.184.1 (172.16.184.1) 56(84) bytes of data.
64 bytes from 172.16.184.1: icmp_seq=1 ttl=62 time=9.33 ms

--- 172.16.184.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 9.331/9.331/9.331/0.000 ms

 

[ k8s-w1 ]

🧿 tcpdump를 사용하여 tunl0 인터페이스에서 전송되는 네트워크 패킷을 캡처합니다.

  • pod1 (172.16.158.7) 에서 pod2 (172.16.184.1) 로 ICMP 요청 패킷 전송됩니다.
  • pod2 (172.16.184.1) 에서 pod1 pod1 (172.16.158.7)  로 ICMP 응답 패킷 전송됩니다
root@k8s-w1:~# tcpdump -i tunl0 -nn
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tunl0, link-type RAW (Raw IP), snapshot length 262144 bytes
16:17:33.272831 IP 172.16.158.7 > 172.16.184.1: ICMP echo request, id 79, seq 1, length 64
16:17:33.282009 IP 172.16.184.1 > 172.16.158.7: ICMP echo reply, id 79, seq 1, length 64

🧿 tunl0 인터페이스 TX/RX 패킷 카운트 확인합니다.

  • tunl0 인터페이스는 수신과 전송 각각 1개의 패킷과 84 바이트의 데이터를 처리했습니다.
root@k8s-w1:~# ifconfig tunl0 | head -2 ; ifconfig tunl0 | grep bytes
tunl0: flags=193<UP,RUNNING,NOARP>  mtu 8981
        inet 172.16.158.0  netmask 255.255.255.255
        RX packets 1  bytes 84 (84.0 B)
        TX packets 1  bytes 84 (84.0 B)

 

[ k8s-w2 ]

🧿 네트워크 인터페이스 ens5 에서 IPv4 패킷을 확인합니다.

  • 패킷 전송: 192.168.10.101에서 192.168.10.102로 전송됨.
  • 내부 데이터 전송: 172.16.158.7에서 172.16.184.1로 이동.
  • 192.168.10.101에서 192.168.10.102로 가는 패킷 내부의 데이터가 172.16.158.7 172.16.184.1 사이에서 이동하고 있다는 것을 의미합니다.
root@k8s-w2:~# tcpdump -i ens5 -nn proto 4
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
16:29:49.218181 IP 192.168.10.101 > 192.168.10.102: IP 172.16.158.7 > 172.16.184.1: ICMP echo request, id 87, seq 1, length 64
16:29:49.218292 IP 192.168.10.102 > 192.168.10.101: IP 172.16.184.1 > 172.16.158.7: ICMP echo reply, id 87, seq 1, length 64
  • 패킷 정보 확인

Comments