[네떡스터디🔥kans] Cilium CNI 알아보기 - TCX (Next-Gen TC)

CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다.

 

 

 

 

Kubernetes에서 서비스 로드밸런서를 구현하기 위해 iptables를 기본으로 사용한다는 것은 Kubernetes 공식 문서나 조금이라도 공부해본 사람이라면 익히 알고 있을 것입니다. 하지만 Cilium을 기본 CNI로 사용하는 환경에서는 kube-proxy를 사용하지 않을 수 있고, Kubernetes의 네트워크 스택에는 iptables 이전에 tc와 XDP라는 영역이 존재합니다. Cilium은 이 영역에 eBPF 코드를 심어 네트워크 트래픽을 제어합니다.

그러나 tc 레이어에 많은 eBPF 코드를 로드하면서 네트워크 구조가 복잡해지고, 성능 저하 문제가 발생하기 시작했습니다. 이를 해결하기 위해 커널 6.6 버전에 TCX가 도입되었으며, 이번 글에서는 TCX가 어떻게 이러한 문제를 해결하는지 소개하고자 합니다.

 

KubeCon2023의 Turning up Performance to 11: Cilium, NetKit Devices, and Going Big with TCP 발표를 참고하여 작성한 글입니다. 영상바로가기

 

TC: Linux Traffic Control

TC(Traffic Control)는 Linux 커널의 네트워크 트래픽을 제어하는 주요 도구 중 하나입니다. TC는 주로 트래픽을 큐잉하고 필터링하는 데 사용되며, 네트워크 인터페이스별로 다양한 트래픽 제어 규칙을 설정할 수 있습니다. 이를 통해 TC는 다음과 같은 작업을 수행할 수 있습니다.

 

트래픽 셰이핑 (Traffic Shaping)

트래픽 셰이핑은 네트워크 내 특정 트래픽의 대역폭을 조절하여, 더 중요한 트래픽이 안정적으로 흐르도록 관리하는 기술입니다. 예를 들어, 한 서비스에서 대량의 데이터를 전송할 경우 네트워크가 혼잡해지면서 다른 중요한 서비스에 지장을 줄 수 있습니다. 이때 트래픽 셰이핑을 통해 덜 중요한 트래픽의 대역폭을 제한함으로써 중요한 트래픽이 원활하게 흐르도록 할 수 있습니다.

 

대표적인 사례로 대규모 온라인 쇼핑몰을 들 수 있습니다. 결제 트래픽이 최우선인 상황에서, 트래픽 셰이핑을 통해 결제 관련 트래픽에는 충분한 대역폭을 할당하고, 상대적으로 덜 중요한 사용자 리뷰나 비로그인 사용자 검색에는 제한된 대역폭을 할당할 수 있습니다. 이를 통해 결제 서비스가 항상 안정적으로 제공될 수 있습니다.

 

왜 bandwidth를 조절하는것이 shaping인지 이해가 안갔는데 알고보니 대역폭을 늘려서 그래프상에서 튀는 그래프를 누르기 때문이라고.. 오..

 

# eth0 인터페이스에서 대역폭을 10Mbps로 제한
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms

 

큐 관리(QoS)

QoS(서비스 품질)는 여러 요청이 들어왔을 때 중요도가 높은 요청을 우선적으로 처리하여 신속하게 응답할 수 있도록 하는 기술입니다. 이를 통해 다수의 요청이 몰릴 때에도 중요한 고객이나 서비스가 우선적으로 응답을 받을 수 있습니다.

 

예를 들어, 고객 지원 센터에서 VIP 고객의 통화를 우선 처리해야 하는 경우, QoS를 적용하여 VIP 고객의 전화가 항상 먼저 연결되도록 하고, 일반 고객의 전화는 VIP 고객의 대기열이 해소된 후에 처리하도록 설정할 수 있습니다. 이렇게 하면 VIP 고객이 대기 없이 신속하게 지원을 받을 수 있습니다.

 

# eth0 인터페이스에 트래픽 클래스 설정
sudo tc qdisc add dev eth0 root handle 1: htb default 12
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 8mbit ceil 10mbit
sudo tc class add dev eth0 parent 1:1 classid 1:12 htb rate 2mbit ceil 10mbit

 

필터링(Filter)

필터링은 특정 조건에 맞는 트래픽만을 허용하거나 차단하여 네트워크 접근을 제어하는 방식입니다. 특히 보안이 중요한 서비스에서는 특정 위치나 IP에서만 접근하도록 제한하여 불필요하거나 잠재적으로 위험한 트래픽을 차단할 수 있습니다.

 

예를 들어, 회사 네트워크에서는 해외 IP 주소의 접속을 제한하여 보안을 강화할 수 있습니다. 이를 통해 해외에서 무분별하게 접속하려는 시도를 차단하고, 특정 국가에서만 접속이 가능하도록 설정하여 보안이 중요한 시스템을 보다 안전하게 보호할 수 있습니다.

 

# eth0 인터페이스에서 대역폭 제한을 위해 루트 큐디스크 생성
sudo tc qdisc add dev eth0 root handle 1: htb default 30

# 기본 클래스 설정 (최대 100Mbps 허용)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit

# 특정 IP 주소(192.168.1.100)의 트래픽에 대해 대역폭을 1Mbps로 제한하는 필터 및 클래스 생성
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:10

 

 

qdisc와 class 그리고 필터는 이렇게 구성될수 있는 것 같습니다.

 

class에 대한 구조를 나타낸 그림입니다.

Cilium에서의 TC 활용

Cilium은 Kubernetes 환경에서 네트워크 보안을 강화하고, 트래픽 제어를 보다 효율적으로 관리하기 위해 TC BPF 프로그램을 활용합니다. TC BPF 프로그램은 다양한 네트워크 제어 및 모니터링 작업에서 강력하게 사용될 수 있으며, 특히 Cilium과 같은 네트워크 정책 도구에서는 다음과 같은 방식으로 TC를 활용합니다.

 

컨테이너 네트워크 정책 적용

TC BPF 프로그램은 컨테이너 네트워크 정책을 설정하거나 맞춤형 방화벽 규칙을 적용하는 데 매우 유용합니다. Kubernetes의 네트워크 구성에서는 일반적으로 컨테이너가 veth(가상 이더넷 장치)를 통해 연결되는데, 이 veth 장치의 인바운드와 아웃바운드 후크 지점에 TC BPF 프로그램을 연결하여 컨테이너 트래픽을 세밀하게 제어할 수 있습니다.

예를 들어, 특정 네임스페이스에서 발생하는 트래픽을 필터링하거나, 컨테이너 간 통신에서 특정 보안 정책을 적용해 승인된 트래픽만 허용할 수 있습니다. 이를 통해 컨테이너 간 네트워크 통신을 보다 안전하게 관리할 수 있으며, 불필요한 외부 접근을 차단하는 방화벽 역할도 수행할 수 있습니다.

 

트래픽 샘플링 및 모니터링

TC BPF 프로그램은 bpf_skb_event_output() 함수를 통해 네트워크 트래픽을 실시간으로 샘플링하고 모니터링할 수 있습니다.

 

패킷 스케줄러 사전 처리

sch_clsact의 아웃바운드 후크를 사용하면 네트워크 트래픽이 드라이버로 전달되기 전 전송 경로에서 패킷을 분류하고 조작하는 작업을 미리 수행할 수 있습니다. 예를 들어, 트래픽 제어 장치인 sch_htb에 패킷을 전달하기 전에 sch_clsact에서 패킷을 분류해두면, 네트워크 장치에서 패킷을 처리할 때 발생할 수 있는 잠금 경합(lock contention)을 줄이고 성능을 최적화할 수 있습니다.

 

TC의 문제점과 eBPF의 사용

TC는 오랫동안 Linux 네트워크 스택의 핵심 도구로 자리 잡아왔지만, 네트워크 정책을 세분화하고 다양한 트래픽을 관리하려면 여러 필터와 규칙을 조합해야 하므로 복잡성이 증가하고 관리가 어려워지는 단점이 있습니다. 특히, Cilium과 같은 eBPF 기반 네트워크 정책 엔진은 TC 레이어에 다양한 eBPF 프로그램을 추가로 로드하게 됩니다. 또한, Kubernetes와 같은 클라우드 네이티브 환경에서는 여러 네트워크 정책과 로드밸런싱 규칙이 동적으로 추가되고 삭제되면서 TC 레이어에 로드되는 eBPF 프로그램의 수도 크게 증가합니다. 이로 인해 TC의 복잡성이 더욱 가중되고, 각 규칙을 통과하는 과정에서 성능 저하가 발생할 수 있습니다.

 

기존의 tc 구조

위 다이어그램은 기존 TC의 구조를 시각적으로 보여줍니다.

  • Qdisc(sch_clsact): 패킷이 TC에 들어오면 먼저 Qdisc에 도달하며, 여기서 트래픽이 분류되어 처리됩니다.
  • Classifier(cls_bpf): Qdisc는 여러 Classifier에 의해 패킷을 분류하며, 각각의 cls_bpf는 eBPF 프로그램을 로드해 필터링 작업을 수행합니다. 다수의 eBPF 프로그램이 이 레이어에서 실행될 수 있으며, 각 프로그램은 추가적인 CPU와 메모리를 소모합니다.
  • Action(act_xyz): 마지막 단계에서는 특정 Action을 통해 패킷에 대한 최종 처리가 이루어지며, cls_abc와 같은 다른 비-eBPF 클래스가 포함될 수 있습니다.

이 다이어그램은 TC의 구조가 필터와 규칙(클래스)이 복잡하게 중첩되어 있음을 보여줍니다.

 

TCX: Traffic Control X (Next-Gen TC)

TCX는 기존 TC의 성능 문제와 관리 복잡성을 해결하기 위한 새로운 트래픽 제어 모듈입니다. TCX는 특히 eBPF와의 높은 연동성을 염두에 두고 설계되었으며, 다음과 같은 주요 기능과 장점을 가지고 있습니다.

변경 된 구조

바뀐 tcx의 구조

 

위의 다이어그램은 새로운 TCX의 구조를 보여줍니다.

  • bpf_mprog 배열: 패킷은 먼저 bpf_mprog라는 배열로 전달됩니다. 이 배열은 여러 개의 eBPF 프로그램을 동시에 관리하며, 불필요한 필터와 클래스를 제거하여 간소화된 형태로 구성됩니다. 또한, BPF 링크를 통해 프로그램과 커널 객체 간의 연결을 안정적으로 유지하고, 프로그램이 안전하게 실행되도록 보장합니다.
  • BPF 링크(BPF Link): TCX에서는 BPF 링크를 사용하여 eBPF 프로그램을 커널 객체에 안전하게 연결할 수 있습니다. BPF 링크는 프로그램이 의도치 않게 종료되거나 연결이 끊기는 것을 방지하며, 소유 프로세스가 종료될 때 연결을 자동으로 정리하여 자원 낭비를 방지합니다. 다수의 eBPF 프로그램이 있을 때 프로그램 간의 종속성을 안전하게 관리할 수 있는 기능도 제공합니다.
  • BPF 프로그램(BPF prog): 각 패킷은 필요한 경우 eBPF 프로그램으로 전달되어, 특정 트래픽 제어 규칙을 적용받습니다. TCX_NEXT와 TCX_DROP와 같은 명령을 통해, 다음 단계로 진행할지 드롭할지 즉각적으로 결정할 수 있습니다.
  • 룩앤필 (Look and Feel): TCX는 bpf_mprog 프레임워크를 통해 다양한 네트워크 계층(TCX, XDP, cgroups 등)에서 동일한 방식으로 BPF 프로그램을 관리할 수 있도록 합니다. 이를 통해 일관된 사용자 경험을 제공하며, 각 계층에서 동일한 방법으로 BPF 프로그램을 설정하고 관리할 수 있습니다.
  • 간소화된 트래픽 흐름: 기존 TC에서는 여러 필터와 클래스를 거쳤지만, TCX는 bpf_mprog 배열을 통해 단일화된 형태로 패킷을 관리합니다. 이로 인해 패킷 처리 속도가 크게 향상되며, 대기 시간도 줄어듭니다.

 

정리해보면 TC와 TCX의 차이점은

  • 구조의 간소화: 기존 TC는 필터와 클래스의 복잡한 계층 구조를 가지고 있어 관리가 어려웠지만, TCX는 간소화된 구조로 eBPF 프로그램과 직접 연결되어 있습니다.
  • 성능 최적화: TCX는 패킷을 빠르게 처리하기 위해 중간 계층을 줄였으며, TCX_NEXT와 TCX_DROP 같은 명령을 통해 즉각적인 패킷 제어가 가능합니다.
  • 효율적인 리소스 사용: 불필요한 eBPF 프로그램을 제거하고 필요한 경우에만 로드하여 CPU 및 메모리 자원을 절약합니다.
  • BPF 링크 지원: BPF 링크를 통해 eBPF 프로그램의 안전한 연결과 의존성 관리를 지원하여 다중 프로그램 환경에서의 안정성을 보장합니다.

 

마무리

tc레이어에 대해서는 조금 지식이 부족 한 것 같아.. 나중에 tcx와 함께 별도로 알아봐야할 것 같습니다. 참으로 알아야하는 것이 넘쳐나는 군요.

 

1.16.3으로 설치해보니 아무런 설정없이도 Attach Mode가 TCX로 보이는 것 같습니다.

 

커널 버전은 6.10입니다.