Ssoon

[3주차] Pod ↔ Pod 통신 본문

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

[3주차] Pod ↔ Pod 통신

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

 


 Pod 생성 전 Node (k8s-w1) 기본 정보 확인

🧿 tunl0은 터널링(Tunneling) 인터페이스로, IP 패킷을 터널을 통해 다른 네트워크로 전송

  • ipip any remote any local any ttl inherit nopmtudisc: IPIP 터널이 모든 원격 및 로컬 주소를 허용
  • inet 172.16.158.0/32 scope global tunl0: 172.16.158.0이라는 IP 주소가 tunl0 인터페이스에 할당
  • calicb4ed55b4b9, cali2be985c66eb, calia0e6ec9deb6이라는 세 개의 네트워크 인터페이스에 대한 정보를 제공합니다. 각각의 인터페이스는 특정 네트워크 네임스페이스에 속하며, 링크-로컬 IPv6 주소를 가지고 있습니다. 
root@k8s-w1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:61:e5:44:e0:63 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    inet 192.168.10.101/24 metric 100 brd 192.168.10.255 scope global dynamic ens5
       valid_lft 3516sec preferred_lft 3516sec
    inet6 fe80::61:e5ff:fe44:e063/64 scope link
       valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 8981 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
    inet 172.16.158.0/32 scope global tunl0
       valid_lft forever preferred_lft forever
6: calicb4ed55b4b9@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-d93700f6-c577-7867-f375-a357486a62a6
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
7: cali2be985c66eb@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-d18e3294-ab32-7eb5-c9f6-98442e7b0aa9
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
8: calia0e6ec9deb6@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP group default qlen 1000
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-4e0bcb88-8caa-eaba-c794-da08b8a18d84
    inet6 fe80::ecee:eeff:feee:eeee/64 scope link
       valid_lft forever preferred_lft forever
  • 현재 활성화된 네트워크 네임스페이스를 확인합니다.
root@k8s-w1:~# lsns -t net
        NS TYPE NPROCS   PID USER     NETNSID NSFS                                                COMMAND
4026531840 net     136     1 root  unassigned                                                     /sbin/init
4026532280 net       2  4172 65535          2 /run/netns/cni-4e0bcb88-8caa-eaba-c794-da08b8a18d84 /pause
4026532337 net       2  4067 65535          1 /run/netns/cni-d18e3294-ab32-7eb5-c9f6-98442e7b0aa9 /pause
4026532388 net       2  3962 65535          0 /run/netns/cni-d93700f6-c577-7867-f375-a357486a62a6 /pause

 

 

  • 172.16.34.0/24 via 192.168.20.100 dev tunl0 proto bird onlink
    • 172.16.34.0/24 네트워크로 가는 트래픽은 192.168.20.100을 경유해 tunl0 인터페이스를 통해 전달됨.
  • 172.16.116.0/24 via 192.168.10.10 dev tunl0 proto bird onlink
    • 172.16.116.0/24 네트워크로 가는 트래픽은 192.168.10.10을 경유해 tunl0 인터페이스를 통해 전달됨.
  • blackhole 172.16.158.0/24 proto bird
    • 172.16.158.0/24 네트워크로의 모든 트래픽은 무시됨 (블랙홀).
  • 172.16.184.0/24 via 192.168.10.102 dev tunl0 proto bird onlink
    • 172.16.184.0/24 네트워크로 가는 트래픽은 192.168.10.102을 경유해 tunl0 인터페이스를 통해 전달됨.
root@k8s-w1:~# ip -c route | grep bird
172.16.34.0/24 via 192.168.20.100 dev tunl0 proto bird onlink
172.16.116.0/24 via 192.168.10.10 dev tunl0 proto bird onlink
blackhole 172.16.158.0/24 proto bird
172.16.184.0/24 via 192.168.10.102 dev tunl0 proto bird onlink

 

  • 172.16.34.0 192.168.20.100 255.255.255.0 UG 0 0 0 tunl0
    • 172.16.34.0/24 네트워크로의 트래픽은 192.168.20.100을 게이트웨이로 사용하여 tunl0 인터페이스를 통해 전달
  • 172.16.116.0 192.168.10.10 255.255.255.0 UG 0 0 0 tunl0
    • 172.16.116.0/24 네트워크로의 트래픽은 192.168.10.10을 게이트웨이로 사용하여 tunl0 인터페이스를 통해 전달
  • 172.16.158.1 0.0.0.0 255.255.255.255 UH 0 0 0 calicb4ed55b4b9
    • 172.16.158.1 IP 주소는 calicb4ed55b4b9 인터페이스를 통해 직접 연결됨 (특정 호스트용 경로).
  • 172.16.158.2 0.0.0.0 255.255.255.255 UH 0 0 0 cali2be985c66eb
    • 172.16.158.2 IP 주소는 cali2be985c66eb 인터페이스를 통해 직접 연결됨 (특정 호스트용 경로).
  • 172.16.158.3 0.0.0.0 255.255.255.255 UH 0 0 0 calia0e6ec9deb6
    • 172.16.158.3 IP 주소는 calia0e6ec9deb6 인터페이스를 통해 직접 연결됨 (특정 호스트용 경로).
  • 172.16.184.0 192.168.10.102 255.255.255.0 UG 0 0 0 tunl0
    • 172.16.184.0/24 네트워크로의 트래픽은 192.168.10.102을 게이트웨이로 사용하여 tunl0 인터페이스를 통해 전달
root@k8s-w1:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.1    0.0.0.0         UG    100    0        0 ens5
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.158.0    0.0.0.0         255.255.255.0   U     0      0        0 *
172.16.158.1    0.0.0.0         255.255.255.255 UH    0      0        0 calicb4ed55b4b9
172.16.158.2    0.0.0.0         255.255.255.255 UH    0      0        0 cali2be985c66eb
172.16.158.3    0.0.0.0         255.255.255.255 UH    0      0        0 calia0e6ec9deb6
172.16.184.0    192.168.10.102  255.255.255.0   UG    0      0        0 tunl0
192.168.0.2     192.168.10.1    255.255.255.255 UGH   100    0        0 ens5
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens5
192.168.10.1    0.0.0.0         255.255.255.255 UH    100    0        0 ens5

Pod 배포 후 상태 확인

  • Node (k8s-w1)에 파드 2개 생성
(⎈|SsoonLab:N/A) root@k8s-m:~# cat node1-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-w1
  containers:
  - name: pod2
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
  • k8s-w1 노드에서 실행 중인 두 개의 파드(pod1과 pod2)에 대한 네트워크 설정
(⎈|SsoonLab:N/A) root@k8s-m:~# kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          48s   172.16.158.4   k8s-w1   <none>           <none>
pod2   1/1     Running   0          48s   172.16.158.5   k8s-w1   <none>           <none>

(⎈|SsoonLab:N/A) root@k8s-m:~# calicoctl get workloadEndpoint
WORKLOAD   NODE     NETWORKS          INTERFACE
pod1       k8s-w1   172.16.158.4/32   calice0906292e2
pod2       k8s-w1   172.16.158.5/32   calibd2348b4f67
  • Kubernetes 클러스터 내에서 생성된 두 개의 네트워크 인터페이스(calice0906292e2와 calibd2348b4f67)의 상태와 설정을 확인합니다.
  • 두 인터페이스 모두 활성화되어 있으며, 브로드캐스트 및 멀티캐스트를 지원하고, 각 인터페이스는 고유한 네트워크 네임스페이스에 속해 있습니다
root@k8s-w1:~# ip -c link
...
9: calice0906292e2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-4155a966-a6ea-9af1-27af-761cef31e313
10: calibd2348b4f67@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netns cni-b8882b29-e9f4-2b1f-fc53-c4bd9e4c336a
  • 두 개의 네트워크 네임스페이스가 생성되었으며, 각 네임스페이스는 특정 컨테이너(또는 파드)의 네트워크 환경을 관리하고 있습니다. 각 네임스페이스는 독립적으로 네트워크 설정을 갖추고 있으며, 해당 네임스페이스 내에서 pause 프로세스가 실행되고 있습니다.
root@k8s-w1:~# lsns -t net
        NS TYPE NPROCS   PID USER     NETNSID NSFS                                                COMMAND
...
4026532230 net       2 36194 65535          3 /run/netns/cni-4155a966-a6ea-9af1-27af-761cef31e313 /pause
4026532472 net       2 36209 65535          4 /run/netns/cni-b8882b29-e9f4-2b1f-fc53-c4bd9e4c336a /pause

🧿 Pod1 에 접속하여 네트워크 인터페이스 정보를 확인

  • tunl0: 비활성 상태의 IP-in-IP 터널 인터페이스입니다.
  • eth0: 활성화된 네트워크 인터페이스로, 브로드캐스트와 멀티캐스트를 지원하며, IP 주소 172.16.158.4 할당되어 있습니다.
(⎈|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  ~  ip -c addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP group default qlen 1000
    link/ether fe:cd:4a:af:3c:68 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.158.4/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::fccd:4aff:feaf:3c68/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
  • 0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0
    • 모든 트래픽은 169.254.1.1 게이트웨이를 통해 eth0 인터페이스로 전송됩니다.
  • 169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
    • 169.254.1.1 주소로의 트래픽은 eth0 인터페이스를 통해 직접 처리됩니다.
  • 169.254.1.1
    • 링크 로컬 주소의 범위에 속합니다. 이 주소는 일반적으로  APIPA (Automatic Private IP Addressing) 라고도 불리며, 특정 상황에서 자동으로 할당됩니다.
    • 주소 범위: 169.254.0.0부터 169.254.255.255까지
    • 네트워크에서 DHCP 서버가 없거나 IP 주소를 받을 수 없을 때 자동으로 할당되는 주소입니다.
    • 네트워크 장비가 네트워크에 연결되었지만 DHCP 서버로부터 IP 주소를 받지 못했을 때, 장비는 이 링크 로컬 범위의 IP 주소를 자동으로 할당하여 기본적인 통신을 시도합니다.
  • ARP 정보가 없음을 확인합니다.
 pod1  ~  route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         169.254.1.1     0.0.0.0         UG    0      0        0 eth0
169.254.1.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0

 pod1  ~  ip -c neigh

 

🧿 Pod2 에 접속하여 네트워크 인터페이스 정보를 확인

  • tunl0: 비활성 상태의 IP-in-IP 터널 인터페이스입니다.
  • eth0: 활성화된 네트워크 인터페이스로, 브로드캐스트와 멀티캐스트를 지원하며, IP 주소 172.16.158.5 할당되어 있습니다.
(⎈|SsoonLab:N/A) root@k8s-m:~# kubectl exec pod2 -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

 pod2  ~  ip -c addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8981 qdisc noqueue state UP group default qlen 1000
    link/ether 06:04:aa:76:08:73 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.158.5/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::404:aaff:fe76:873/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
  • 모든 트래픽이 169.254.1.1을 게이트웨이로 하여 eth0 인터페이스를 통해 전송됩니다.
  • ARP 정보가 없음을 확인합니다.
 pod2  ~  route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         169.254.1.1     0.0.0.0         UG    0      0        0 eth0
169.254.1.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0

 pod2  ~  ip neighbor show

✅Pod 간 통신 실행 및 확인

  • pod1과 pod2 에 대해 각각의 가상 이더넷 인터페이스 이름을 찾고, 이를 VETH1과 VETH2라는 변수에 저장하여 출력
(⎈|SsoonLab:N/A) root@k8s-m:~# VETH1=$(calicoctl get workloadEndpoint | grep pod1 | awk '{print $4}')
(⎈|SsoonLab:N/A) root@k8s-m:~# echo $VETH1
calice0906292e2
(⎈|SsoonLab:N/A) root@k8s-m:~# VETH2=$(calicoctl get workloadEndpoint | grep pod2 | awk '{print $4}')
(⎈|SsoonLab:N/A) root@k8s-m:~# echo $VETH2
calibd2348b4f67
  • VETH1과 VETH2라는 두 개의 변수를 설정하여, 각각 VETH(가상 이더넷) 인터페이스의 이름을 저장합니다.
root@k8s-w1:~# VETH1=calice0906292e2
root@k8s-w1:~# VETH2=calibd2348b4f67
  • 두 개의 가상 이더넷 인터페이스에 대해 proxy_arp 설정을 확인하는 작업을 수행합니다. 
  • proxy_arp는 ARP 요청에 대한 응답을 제어하는 네트워크 설정입니다.
  • 두 VETH 인터페이스(calice0906292e2 calibd2348b4f67) 모두 proxy_arp활성화(1)되어 있습니다.
  • 이는 이 인터페이스들이 ARP 요청에 대해 다른 네트워크의 주소를 대신 응답할 수 있도록 설정되어 있다는 것을 의미합니다
root@k8s-w1:~# cat /proc/sys/net/ipv4/conf/$VETH1/proxy_arp
1
root@k8s-w1:~# cat /proc/sys/net/ipv4/conf/$VETH2/proxy_arp
1
  •  pod1에서 pod2(172.16.158.5)로 5개의 핑(ping) 요청을 보내고 응답을 확인하는 작업을 수행합니다.
 pod1  ~  ping -c 5 172.16.158.5
PING 172.16.158.5 (172.16.158.5) 56(84) bytes of data.
64 bytes from 172.16.158.5: icmp_seq=1 ttl=63 time=0.149 ms
64 bytes from 172.16.158.5: icmp_seq=2 ttl=63 time=0.100 ms
64 bytes from 172.16.158.5: icmp_seq=3 ttl=63 time=0.106 ms
64 bytes from 172.16.158.5: icmp_seq=4 ttl=63 time=0.084 ms
64 bytes from 172.16.158.5: icmp_seq=5 ttl=63 time=0.078 ms

--- 172.16.158.5 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4080ms
rtt min/avg/max/mdev = 0.078/0.103/0.149/0.024 ms
  • Pod1(172.16.158.4)와 Pod2(172.16.158.5) 간의 핑 통신이 정상적으로 이루어지고 있음을 확인합니다.
root@k8s-w1:~# tcpdump -i $VETH1 -nn
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on calice0906292e2, link-type EN10MB (Ethernet), snapshot length 262144 bytes
12:25:58.270193 ARP, Request who-has 169.254.1.1 tell 172.16.158.4, length 28
12:25:58.270225 ARP, Reply 169.254.1.1 is-at ee:ee:ee:ee:ee:ee, length 28
12:25:58.270228 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 205, seq 1, length 64
12:25:58.270326 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 205, seq 1, length 64
12:25:59.278635 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 205, seq 2, length 64
12:25:59.278712 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 205, seq 2, length 64
12:26:00.302632 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 205, seq 3, length 64
12:26:00.302689 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 205, seq 3, length 64
12:26:01.326587 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 205, seq 4, length 64
12:26:01.326640 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 205, seq 4, length 64
12:26:02.350596 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 205, seq 5, length 64
12:26:02.350650 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 205, seq 5, length 64
12:26:03.342544 ARP, Request who-has 172.16.158.4 tell 192.168.10.101, length 28
12:26:03.342600 ARP, Reply 172.16.158.4 is-at fe:cd:4a:af:3c:68, length 28
  • 169.254.1.1과 192.168.10.101 두 IP 주소에 대해 eth0 인터페이스의 ARP 캐시가 표시되고 있습니다.
 pod1  ~  ip -c -s neigh
169.254.1.1 dev eth0 lladdr ee:ee:ee:ee:ee:ee  used 45/45/13probes 4 STALE
192.168.10.101 dev eth0 lladdr ee:ee:ee:ee:ee:ee  used 40/100/40probes 0 STALE
  • iptables를 사용하여 FORWARD 체인의 규칙을 나열하고, 특정 패턴(cali-FORWARD 또는 pkts)과 일치하는 항목만 필터링하여 출력하는 작업을 수행합니다.
    • cali-FORWARD: Calico 네트워크 플러그인에 의해 설정된 FORWARD 체인 규칙을 나타냅니다. 이 규칙은 패킷이 네트워크를 통해 전달될 때 적용됩니다.
    • pkts bytes 수가 0: 현재까지 이 규칙이 적용된 패킷 수와 바이트 수가 없음을 나타냅니다.
(⎈|SsoonLab:N/A) root@k8s-m:~# iptables -v --numeric --table filter --list FORWARD | egrep '(cali-FORWARD|pkts)'
 pkts bytes target     prot opt in     out     source               destination
    0     0 cali-FORWARD  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* cali:wUHhoiAYhphO9Mso */
  •  ARP, Request who-has 172.16.158.4 tell 192.168.10.101, length 28
    • IP 주소 172.16.158.4의 MAC 주소를 묻는 ARP 요청이 192.168.10.101에서 발생했습니다.
  • ARP, Request who-has 169.254.1.1 tell 172.16.158.4, length 28
    • IP 주소 169.254.1.1의 MAC 주소를 묻는 ARP 요청이 172.16.158.4에서 발생했습니다.
  • ARP, Reply 169.254.1.1 is-at ee:ee:ee:ee:ee:ee, length 28
    • IP 주소 169.254.1.1의 MAC 주소가 ee:ee:ee:ee:ee:ee라는 ARP 응답합니다.
  •  ARP, Reply 172.16.158.4 is-at fe:cd:4a:af:3c:68, length 28
    • IP 주소 172.16.158.4의 MAC 주소가 fe:cd:4a:af:3c:68라는 ARP 응답합니다.
root@k8s-w1:~# tcpdump -i $VETH1 -nn
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on calice0906292e2, link-type EN10MB (Ethernet), snapshot length 262144 bytes
13:16:23.214016 IP 172.16.158.4 > 172.16.158.5: ICMP echo request, id 234, seq 1, length 64
13:16:23.214094 IP 172.16.158.5 > 172.16.158.4: ICMP echo reply, id 234, seq 1, length 64
13:16:28.238538 ARP, Request who-has 172.16.158.4 tell 192.168.10.101, length 28
13:16:28.238573 ARP, Request who-has 169.254.1.1 tell 172.16.158.4, length 28
13:16:28.238611 ARP, Reply 169.254.1.1 is-at ee:ee:ee:ee:ee:ee, length 28
13:16:28.238602 ARP, Reply 172.16.158.4 is-at fe:cd:4a:af:3c:68, length 28

Calico 가상 라우터 Calico 네트워킹에서 각 노드에 배치되는 가상 라우팅 기능을 의미합니다. Kubernetes 클러스터에서 네트워크 트래픽을 효율적으로 관리하고, Pod 간 또는 노드 간 통신을 가능하게 하기 위해 사용됩니다.

Calico는 기본적으로 3계층(Layer 3) 네트워크 모델을 사용하여 Kubernetes의 Pod 간 통신을 처리합니다. 여기서 가상 라우터는 각 노드에 설정되어, Pod 간의 트래픽을 전달하고 라우팅하는 역할을 합니다.

가상 라우터의 역할:

  1. Pod 간 트래픽 라우팅:
    • Kubernetes에서 각 Pod는 고유한 IP 주소를 가지며, 이러한 IP 주소는 다른 Pod와 통신하기 위한 기본 수단입니다. Calico 가상 라우터는 Pod가 서로 다른 노드에 있을 때도 올바르게 통신할 수 있도록 네트워크 경로를 설정합니다.
    • 예를 들어, 노드 A에 있는 Pod가 노드 B에 있는 Pod로 데이터를 보내려면, 각 노드의 가상 라우터가 데이터를 목적지로 라우팅해 줍니다.
  2. BGP (Border Gateway Protocol)를 통한 라우팅:
    • Calico는 BGP라는 라우팅 프로토콜을 사용하여 노드 간 경로 정보를 동적으로 교환합니다. BGP는 인터넷에서 주로 사용하는 프로토콜이지만, Calico에서는 클러스터 내부에서 노드 간 네트워크 경로를 설정하는 데 사용됩니다.
    • 이를 통해 각 노드의 가상 라우터는 클러스터의 다른 노드들로부터 경로 정보를 받고, 트래픽이 최적의 경로로 전달될 수 있도록 돕습니다.
  3. 정책 기반 라우팅:
    • Calico는 **네트워크 정책(Network Policy)**을 통해 특정 트래픽만 허용하거나 차단할 수 있습니다. 가상 라우터는 이러한 정책을 기반으로, 특정 Pod 간의 통신이 허용되는지 여부를 확인하고, 허용된 트래픽만 라우팅합니다.
  4. 인터넷 및 외부 네트워크와의 통신:
    • 클러스터 내부에서만 통신하는 것이 아니라, 클러스터 외부 또는 인터넷과 통신할 때도 가상 라우터는 트래픽을 라우팅할 수 있습니다. 특히 NAT(네트워크 주소 변환) 기능을 통해 내부 Pod가 외부와 안전하게 통신할 수 있도록 돕습니다.

가상 라우터의 구조:

  • 각 노드의 calico-node 데몬은 가상 라우터 역할을 합니다. 이 데몬은 각 노드에 설치되어, 해당 노드에서 실행되는 모든 Pod의 네트워크 트래픽을 처리합니다.
  • 가상 라우터는 Pod 네트워크 인터페이스와 연결되어 있어, Pod로부터 나오는 패킷을 받아 목적지 IP 주소에 맞는 경로로 패킷을 전달합니다.
Comments