Ssoon
[8주차] Istio Traffic Flow : IPtables 로 트래픽 가로채기 문제점 & 최적화 방안 본문
CloudNet@ 가시다님이 진행하는 Istio Hands-on Study [1기]
https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/#iptables-manipulation-analysis
의 내용을 정리
🚦 IPtables 로 트래픽 가로채기 문제점 쉽게 이해하기
🌐 IPtables 의 주요 문제점
1. conntrack 모듈 사용으로 인한 부하
- iptables는 connection tracking(연결 추적)을 위해 conntrack 모듈을 사용합니다. 연결 수가 많아지면 메모리와 CPU를 많이 소비할 수 있고, 심지어 track table이 가득 차는 문제가 발생할 수 있습니다. 이를 방지하기 위해 업계에서는 conntrack를 끄는 방법을 사용하기도 합니다.
conntrack 모듈은
연결이 많을 때 부하를 일으킬 수 있습니다.
2. 전역 효과와 제어성 부족
- iptables는 시스템 전반에 영향을 미치는 공통 모듈입니다. 특정 변경을 명확히 금지하거나 제어하기 어렵습니다. 이는 네트워크 설정을 세밀하게 관리하려는 환경에서 불편할 수 있습니다.
iptables는
전역적으로 작동해 세밀한 제어가 어렵습니다.
3. 루프백을 통한 성능 저하
- iptables는 트래픽을 리다이렉트할 때 loopback(루프백) 경로를 사용합니다. 아웃바운드 트래픽은 프로토콜 스택을 두 번 지나야 하며, 동시 연결 수가 많을 때 성능이 떨어질 수 있습니다.
루프백 사용은
아웃바운드 성능을 떨어뜨릴 수 있습니다.
한계 상황 고려
- 위 문제들은 모든 상황에서 발생하지 않습니다. 연결 수가 적고 NAT 테이블을 사용하지 않는 경우, iptables는 간단하고 효과적인 해결책이 될 수 있습니다. 하지만 더 다양한 시나리오에 대응하려면 이 세 가지 문제를 모두 해결해야 합니다.
iptables는 간단한 경우 유용하지만,
한계가 있어 최적화가 필요합니다.
⚙️ 투명 가로채기 최적화 방안
🔧 eBPF와 Merbridge로 트래픽 가로채기
Merbridge란?
- Merbridge는 2022년 초 DaoCloud에서 공개한 오픈소스 플러그인으로, eBPF 기술을 활용해 Istio의 네트워크 성능을 개선합니다. eBPF는 리눅스 커널에서 실행되는 강력한 도구로, 네트워크 패킷을 효율적으로 처리할 수 있습니다.
- Merbridge는 eBPF의 sockops와 redir 기능을 사용해 패킷을 인바운드 소켓에서 아웃바운드 소켓으로 직접 전달합니다. 또한 bpf_msg_redirect_hash 함수를 통해 애플리케이션 패킷을 바로 포워딩합니다.
Merbridge는
eBPF로 패킷 전달을 최적화해 성능을 개선합니다.
📥 tproxy로 인바운드 트래픽 처리
tproxy란?
- tproxy는 인바운드(들어오는) 트래픽을 처리하는 방법으로, 패킷의 목적지 IP나 포트를 변경하지 않고 리다이렉트합니다. 기존 iptables 방식은 conntrack 모듈을 사용해 연결을 추적하지만, tproxy는 이런 추적 없이 동작합니다. 따라서 연결이 많을 때 발생하는 부하 문제가 없습니다.
- 다만, tproxy는 커널 버전 제한 때문에 아웃바운드 트래픽에는 적용하기 어렵습니다. 현재 Istio는 인바운드 트래픽에만 tproxy를 지원합니다. 비유하자면, tproxy는 편지를 열지 않고 바로 배달하는 방식입니다. 중간 과정을 줄여 더 빠르게 처리
tproxy는
인바운드 트래픽을 효율적으로 리다이렉트합니다.
📤 hook connect로 아웃바운드 트래픽 처리
hook connect란?
- hook connect는 아웃바운드(나가는) 트래픽을 처리하기 위해 설계된 방식입니다. 다양한 애플리케이션 시나리오에 적응하기 위해 사용됩니다. hook connect는 애플리케이션이 소켓 연결을 시도할 때 이를 가로채서 트래픽을 Sidecar로 전달합니다.
- 이 방식은 목적지 IP와 포트를 알아내는 과정을 포함하며, tproxy와 비슷한 방식으로 정보를 읽습니다. 또한, sockmap을 활용하면 패킷 경로를 단축해 성능을 높일 수 있습니다. 단, 커널 버전이 4.16 이상이어야 합니다. 비유하자면, hook connect는 편지를 보내기 전에 주소를 확인하고 바로 배달 경로를 설정하는 과정입니다. 불필요한 단계를 줄여 속도를 높입니다.
hook connect는
아웃바운드 트래픽을 효율적으로 처리합니다.
📌 핵심 요약
- iptables 문제점: conntrack 부하, 제어성 부족, 루프백 성능 저하가 주요 문제입니다.
- 적합성: 연결 수가 적고 NAT을 사용하지 않는 경우 iptables가 유용하지만, 한계가 있습니다.
- 최적화 방안:
- Merbridge: eBPF로 패킷 전달을 최적화합니다.
- tproxy: 인바운드 트래픽을 효율적으로 리다이렉트합니다.
- hook connect: 아웃바운드 트래픽을 개선하며, sockmap으로 성능을 높입니다.
🔌 Istio에서 Hook Connect 다이어그램 쉽게 이해하기
🌐 Hook Connect란?
Hook Connect는 Istio에서 아웃바운드 트래픽(나가는 요청)을 처리하기 위해 사용하는 기술입니다. 다이어그램은 애플리케이션이 요청을 보내는 과정에서 Hook Connect가 어떻게 작동하는지 보여줍니다. 이 방식은 iptables 대신 더 효율적으로 트래픽을 관리하려는 목적으로 설계되었습니다.
비유하자면, Hook Connect는 우체국에서 편지를 보내기 전에 주소를 확인하고 바로 배달 경로를 설정하는 직원과 같습니다. 불필요한 단계를 줄여 더 빠르게 처리할 수 있죠.
핵심 내용: Hook Connect는 아웃바운드 트래픽을 효율적으로 처리하는 기술입니다.
🔍 다이어그램 단계별 설명
1. Application에서 요청 시작
다이어그램은 "Application" 블록에서 시작됩니다. 이는 Pod 내 애플리케이션 컨테이너가 외부로 요청(예: 다른 서비스 호출)을 보내는 상황을 나타냅니다. 예를 들어, reviews 서비스가 ratings 서비스로 HTTP 요청을 보낸다고 가정해 봅시다.
이 요청은 네트워크 소켓을 통해 전달되며, Hook Connect가 이를 가로챕니다.
핵심 내용: Application은 외부로 요청을 보내는 출발점입니다.
2. Hook Connect로 소켓 연결 가로채기
다이어그램에서 "Hook Connect" 블록은 애플리케이션이 소켓 연결을 시도할 때 이를 가로채는 과정을 보여줍니다. 일반적으로 애플리케이션은 connect()라는 시스템 호출을 사용해 네트워크 연결을 시작합니다. Hook Connect는 이 호출을 후킹(hooking)해 중간에서 개입합니다.
이 단계에서는 요청의 실제 목적지 IP와 포트(예: ratings 서비스의 IP와 포트 9080)를 알아냅니다. Hook Connect는 tproxy와 비슷한 방식으로 목적지 정보를 읽습니다.
핵심 내용: Hook Connect는 connect() 호출을 가로채 목적지 정보를 읽습니다.
3. sockmap으로 경로 최적화
다이어그램에서 "sockmap" 블록은 패킷 경로를 단축하는 역할을 합니다. sockmap은 eBPF 기술을 활용해 인바운드 소켓에서 아웃바운드 소켓으로 패킷을 직접 전달합니다. 이를 통해 트래픽이 프로토콜 스택을 여러 번 거치는 문제를 줄이고 성능을 개선합니다.
단, sockmap은 커널 버전 4.16 이상에서만 지원됩니다. 이 조건을 만족하면 패킷이 더 빠르게 목적지로 전달됩니다.
핵심 내용: sockmap은 패킷 경로를 단축해 성능을 높입니다.
4. Sidecar로 트래픽 전달
다이어그램에서 "Sidecar" 블록은 Hook Connect가 가로챈 트래픽을 Envoy 프록시로 전달하는 과정을 나타냅니다. Sidecar는 이 트래픽을 Outbound Handler로 보내고, 최종적으로 목적지(예: ratings 서비스)로 라우팅합니다.
Sidecar는 마치 우체국 직원이 편지를 받아 최종 배달지로 보내는 역할을 합니다. Hook Connect는 이 과정에서 불필요한 단계를 줄여줍니다.
핵심 내용: Sidecar는 Hook Connect가 처리한 트래픽을 목적지로 라우팅합니다.
🧠 초보자를 위한 비유
Hook Connect를 이해하기 쉽게 비유하자면, 편지를 보내는 과정을 생각해 봅시다. Application은 편지를 쓰는 사람, Hook Connect는 편지 주소를 확인하고 바로 배달 경로를 설정하는 우체국 직원입니다. sockmap은 편지를 더 빠르게 전달하기 위해 중간 단계를 줄이는 시스템이고, Sidecar는 최종적으로 편지를 목적지로 배달하는 배달원입니다.
이 과정을 단계별로 따라가다 보면, Istio가 네트워크 성능을 어떻게 개선하는지 자연스럽게 익숙해질 거예요.
핵심 내용: Hook Connect는 우체국 배달 과정을 효율적으로 만드는 방법입니다.
📌 핵심 요약
- Hook Connect 역할: 아웃바운드 트래픽을 효율적으로 처리하는 기술입니다.
- Application 요청: 애플리케이션이 외부 요청을 보내는 출발점입니다.
- Hook Connect 가로채기: connect() 호출을 후킹해 목적지 정보를 읽습니다.
- sockmap 최적화: 패킷 경로를 단축해 성능을 개선합니다.
- Sidecar 라우팅: 트래픽을 목적지로 최종 전달합니다.
- 비유: Hook Connect는 우체국 배달 과정을 효율적으로 만드는 방법입니다.