Ssoon
[2주차] 쿠버네티스에서 파드 간 통신은 어떻게 작동하나요? 본문
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기
https://itnext.io/tracing-pod-to-pod-network-traffic-in-kubernetes-112523a325b2 참조
✅ Pod 를 배포하면 :
- Pod 는 자체 network namespace 를 얻는다.
- IP 주소가 할당된다.
- Pod 의 모든 컨테이너는 동일한 network namespace 를 공유하며 로컬호스트에서 서로를 볼 수 있다.
✅ Pod 가 다른 Pod 에 도달하려면 ?
- Pod 가 다른 Pod 에 도달하려면 먼저 Node 의 root namespace 에 대한 액세스 권한이 있어야 합니다.
- 이는 두 namespace 인 Pod 와 Root 를 연결하는 virtual eth pair 을 사용하여 수행됩니다.
- bridge 는 트래픽이 virtual pairs 사이를 이동하고 공통 루트 root namespace 를 통과할 수 있게 해줍니다.
🧿"Virtual Ethernet Pair" (VETH, 가상 이더넷 쌍)
- 가상 이더넷 쌍은 컴퓨터 시스템 내에서 두 개의 가상 네트워크 인터페이스를 연결하는 가상의 네트워크 케이블과 같은 역할을 합니다.
- 마치 물리적인 이더넷 케이블이 두 장치를 연결하듯이, 가상 환경에서 두 네트워크 인터페이스를 서로 연결하는 것입니다.
🧿Ethernet Bridge
- 여러 네트워크 인터페이스(예: 컨테이너, 가상 머신 등)를 하나의 네트워크로 묶어 주고, 이들이 서로 통신할 수 있게 해줍니다.
- Kubernetes는 CNI(Container Network Interface) 플러그인을 사용해 Pod 간의 네트워킹을 관리합니다. 이 CNI 플러그인이 Ethernet Bridge를 사용해 Pod 간의 트래픽을 관리합니다.
- 작동 방식
- Bridge 생성: 호스트 시스템에서 가상 Ethernet Bridge를 생성하면, 이 Bridge는 여러 네트워크 인터페이스를 연결하는 가상 네트워크 스위치처럼 동작합니다.
- Interface 연결: 각 Pod가 생성되면, Pod의 가상 네트워크 인터페이스(예: veth 인터페이스)가 이 Bridge에 연결됩니다. 이렇게 연결된 인터페이스는 모두 같은 네트워크에 속하게 되며, 서로 통신할 수 있습니다.
🧿 CNI0 인터페이스
- Kubernetes 클러스터에서 Pod 간의 네트워킹을 관리하는 가상 네트워크 브리지(bridge) 인터페이스입니다.
- 파드 네트워크 인터페이스와 호스트 네트워크를 연결해 주며, 파드 간 통신 및 외부 네트워크 접근을 가능하게 합니다.
- Pod 네트워크 연결: cni0 인터페이스는 각 노드(node)에서 실행되는 여러 Pod의 네트워크 인터페이스를 연결합니다. 이렇게 연결된 네트워크를 통해, 같은 노드 내의 Pod들은 서로 통신할 수 있습니다.
- 브리지 역할: cni0는 가상 네트워크 브리지로서, 각 Pod의 네트워크 인터페이스(veth pair의 한쪽 끝)를 하나의 네트워크로 묶어주는 역할을 합니다. 이 브리지를 통해, 한 Pod에서 발생한 네트워크 트래픽이 다른 Pod로 전달될 수 있습니다.
- cni0 브리지는 Kubernetes의 네트워크 플러그인(CNI)을 통해 자동으로 관리되므로, 복잡한 네트워크 설정 없이도 Pod 간의 네트워킹을 쉽게 구성할 수 있습니다
✅Pod-A 가 Pod-B 에게 메시지를 보내려고 하면 어떻게 될까?
- Pod-B 은 Pod-A 의 network namespace 의 컨테이너가 아니므로 Pod-A 는 기본 인터페이스인 eth0 으로 패킷을 전달합니다.
- 이 인터페이스는 veth pair 에 연결되고 패킷은 root network namespace 로 전달합니다.
- root network namespace 로 전달 된 패킷은 virtual switch 역할을 하는 ethernet bridge 로 전달됩니다.
✅ 누가 Pod-B IP 주소를 가지고 있습니까?
- virtual switch 역할을 하는 ethernet bridge 는 destination pod IP (Pod-B) 를 해당 MAC address 로 확인해야 합니다.
- frame 이 bridge 에 도달하면 연결된 모든 장치에 ARP broadcast 가 전송됩니다.
bridge 는 "누가 Pod-B IP 주소를 가지고 있습니까?"라고 외칩니다.
✅ Pod-B MAC address 가 포함된 응답이 수신
- bridge ARP cache (lookup table)에 저장된 Pod-B 를 연결하는 인터페이스의 MAC address 가 포함된 응답이 수신됩니다.
✅ IP 및 MAC 주소 매핑이 저장되면 bridge 는 테이블에서 조회하여 packet 을 올바른 endpoint 로 전달
- packet 은 root namespace 의 Pod-B veth 에 도달하고, Pod-B namespace 내부의 eth0 인터페이스에 도달합니다.
✅ 다른 노드 간에 통신
- 패킷이 목적지에 도달하기 위해 노드 네트워크를 통과해야 하므로 파드가 다른 노드 간에 통신하려면 추가 홉이 필요합니다. 이것은 "plain " 네트워킹 버전입니다.
✅ 오버레이 네트워크를 사용하는 CNI 플러그인을 설치하면 어떻게 달라질까요?
- Flannel은 노드의 eth0과 컨테이너 브리지 cni0 사이에 새로운 인터페이스를 설치합니다.
- 이 인터페이스를 통해 흐르는 모든 트래픽은 캡슐화됩니다(예: VXLAN)
🧿 오버레이 네트워크
- 물리적인 네트워크 위에 추가로 구성된 가상 네트워크
- 이 가상 네트워크는 물리적 네트워크 구조에 관계없이 서로 다른 노드에 있는 Pod들이 마치 같은 네트워크에 있는 것처럼 통신할 수 있게 해줍니다.
- 캡슐화: 오버레이 네트워크에서는 Pod 간의 네트워크 트래픽이 물리적인 네트워크를 통해 전달될 때, 트래픽을 특별한 패킷 형태로 캡슐화합니다. 이 패킷은 물리적인 네트워크를 통해 전달되다가 목적지 노드에 도착하면 다시 원래 형태로 복구됩니다.
- 가상 네트워크: 물리적으로 서로 다른 네트워크에 속한 노드들 사이에 가상 네트워크를 구성하여, Pod들이 서로 쉽게 통신할 수 있게 해줍니다. 오버레이 네트워크는 이 가상 네트워크를 물리적 네트워크 위에 구축합니다.
🧿 Flannel
- Flannel은 Kubernetes에서 사용되는 오버레이 네트워크 플러그인 중 하나입니다.
- Flannel은 각 노드에 가상 네트워크 인터페이스를 생성하고, 이 인터페이스를 통해 노드 간에 트래픽을 주고받습니다.
✅ 새 패킷은 소스 및 대상으로 파드의 IP 주소가 아니라 노드의 IP를 사용
- 따라서 포장 패킷 (Wrapper packet)은 노드에서 빠져나와 대상 노드로 이동합니다.
✅ 반대편에 도착하면 flannel.1 인터페이스는 패킷의 래핑을 풀고 원래의 포드 간 패킷이 목적지에 도달
✅ Flannel은 모든 파드의 위치와 IP 주소를 어떻게 알 수 있나요?
- 각 노드에서 Flannel 데몬은 분산 데이터베이스의 IP 주소 할당을 동기화합니다.
- 다른 인스턴스는 이 데이터베이스를 쿼리하여 해당 패킷을 전송할 위치를 결정할 수 있습니다.
'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글
[2주차] Pause Container 란 ? (1) | 2024.09.04 |
---|---|
[2주차] Container Networking Interface (CNI) & Flannel (0) | 2024.09.03 |
[1주차] Sysbox Container Runtime : Storage/Security (0) | 2024.08.27 |
[1주차] Sysbox Container Runtime : Kubernetes-in-Docker (0) | 2024.08.26 |
[1주차] Sysbox Container Runtime : Docker-in-Docker (0) | 2024.08.26 |
Comments