Bonding 인터페이스에서 Cilium XDP 활성화 하기

네트워크 성능 최적화는 많은 엔지니어들에게 중요한 과제입니다. 특히, 고성능 네트워크 환경에서는 패킷 처리 속도를 높이고 지연 시간을 줄이는 것이 필수적입니다. 이 글에서는 XDP(eXpress Data Path)와 Bonding 인터페이스를 결합하여 네트워크 성능을 최대화하는 방법과 이를 실제로 설정하는 방법을 설명합니다.
 

이 글에서 다루지 않는것

  • Bonding 설정의 기본: Bonding 인터페이스를 어떻게 설정하는지에 대한 기본적인 설명.
  • XDP의 깊은 기술적 내용: XDP의 상세한 내부 동작 방식에 대한 설명.

 

XDP란?

XDP(eXpress Data Path)는 네트워크 패킷이 운영체제에 도달하기 전에 빠르게 처리할 수 있게 해주는 Linux 기능입니다. 이렇게 하면 네트워크 성능을 크게 높이고, 데이터를 주고받는 속도(레이턴시)를 줄일 수 있습니다. XDP는 네트워크 트래픽이 많을 때도 효과적으로 처리할 수 있는 방법을 제공하며, 세 가지 방식으로 동작합니다: Native XDP, Offloaded XDP, Generic XDP입니다.
 

Native XDP

Native XDP는 네트워크 카드(NIC)에서 들어오는 패킷을 운영체제로 보내기 전에 네트워크 드라이버 단계에서 바로 처리하는 방식입니다. 이 방식은 패킷이 네트워크 스택에 도달하기 전에 드라이버에서 처리되므로, 매우 빠른 성능을 제공합니다. 대부분의 10Gbps 이상의 네트워크 카드가 이 방식을 지원하며, 패킷이 CPU에 도달하지 않아 성능 저하를 방지하고 레이턴시를 줄일 수 있습니다.

Offloaded XDP

Offloaded XDP는 스마트NIC과 같은 특수 네트워크 카드가 XDP 프로그램을 CPU 대신 직접 실행하는 방식입니다. 이렇게 되면 패킷이 CPU를 거치지 않고 네트워크 카드 자체에서 처리되므로 성능이 더욱 향상됩니다. CPU의 부담을 줄이면서도 네트워크 성능을 극대화할 수 있어, 고성능 네트워크 환경에서 매우 유용합니다.
 

Generic XDP

Generic XDP는 네트워크 카드에서 XDP를 지원하지 않는 경우에 사용됩니다. 이 방식에서는 XDP 프로그램이 운영체제의 커널에서 소프트웨어적으로 패킷을 처리합니다. 성능은 Native XDPOffloaded XDP에 비해 떨어지지만, 네트워크 드라이버를 수정하지 않고도 XDP를 사용할 수 있다는 장점이 있습니다.
 

(왼) native xdp (오) offload xdp

 
 

Bonding 인터페이스란?

Bonding 인터페이스는 여러 네트워크 연결을 하나로 묶어 성능을 높이고 안정성을 개선하는 기술입니다. 쉽게 말해, 여러 네트워크 케이블을 하나처럼 사용해서 데이터를 더 빠르게 전송할 수 있고, 한 연결이 끊어져도 다른 연결로 자동 전환되어 네트워크가 계속 작동하게 할 수 있습니다.
 
Bonding에는 여러 가지 모드가 있으며, 각각의 모드에 따라 XDP를 사용할 수 있는지 여부가 다릅니다:

  • mode=0 (Round-robin): 패킷을 여러 네트워크 연결로 번갈아 가면서 보냅니다. XDP를 사용할 수 있습니다.
  • mode=1 (Active-backup): 하나의 연결만 사용하다가, 문제가 생기면 다른 연결로 전환됩니다. XDP를 사용할 수 있습니다.
  • mode=2 (XOR): 특정 규칙에 따라 패킷을 나누어 보내는데, 특정 설정에서는 XDP를 사용할 수 없습니다.
  • mode=3 (Broadcast): 모든 네트워크 연결로 동일한 패킷을 전송합니다. XDP를 사용할 수 없습니다.
  • mode=4 (802.3ad, LACP): 여러 네트워크 연결을 하나로 묶어 사용하는 방식으로, Transmit Hash Policy가 'layer2+3'으로 설정되어 있는 경우 XDP가 지원되지 않습니다.
  • mode=5 (TLB, Transmit Load Balancing): 송신 트래픽을 여러 네트워크 연결에 나누어 보내지만, 수신은 하나의 연결에서만 처리합니다. 이 모드에서는 XDP를 사용할 수 없습니다.
  • mode=6 (ALB, Adaptive Load Balancing): 송신과 수신 트래픽을 모두 여러 네트워크 연결에 나누어 처리하지만, 이 모드에서도 XDP는 사용할 수 없습니다.

이처럼 Bonding 모드에 따라 XDP 지원 여부가 다르므로, 올바른 모드를 선택하는 것이 중요합니다.

관련 이슈

 

VLAN 이란

VLAN은 물리적으로 하나의 네트워크 장비에서 여러 개의 논리적 네트워크를 구성할 수 있는 기술입니다. 이를 통해 같은 스위치에 연결된 장치들이라도 서로 다른 네트워크에 속할 수 있게 만들어 보안과 네트워크 관리를 더 쉽게 할 수 있습니다. VLAN을 사용하면 물리적 네트워크를 효율적으로 나눠 관리할 수 있으며, 트래픽을 분리할 수 있어 보안성능 모두에 이점이 있습니다.
 

Access 모드와 Trunk 모드

Access 모드

Access 모드는 한 포트가 하나의 VLAN에 속하며, 주로 단말 장치에 적용됩니다. 이 모드에서는 VLAN 태그 없이(UnTagged) 트래픽이 전달되며, 스위치가 각 포트에 VLAN을 할당하여 관리합니다. 단말 장치들은 VLAN 설정을 신경 쓸 필요가 없습니다.
 

Trunk 모드

Trunk 모드는 여러 VLAN 트래픽을 처리하며 VLAN 태그로 각 패킷의 VLAN을 구분합니다. 이 모드는 주로 스위치 간 연결이나 서버와 스위치 간의 연결에서 사용되며, 동일한 링크를 통해 다수의 VLAN 트래픽을 전송하는 데 유용합니다. 각 장치는 자신의 트래픽에 VLAN 태그를 추가해 스위치로 전송합니다.
 

 
 

XDP와 Bonding, 그리고 VLAN을 함께 설정하기

XDP와 Bonding

XDP(eXpress Data Path)는 네트워크 성능을 크게 향상시킬 수 있는 Linux 기능입니다. 네트워크 인터페이스 카드(NIC)가 패킷을 처리하기 전에, 즉 패킷이 운영체제의 네트워크 스택에 도달하기 전에 트래픽을 매우 빠르게 처리할 수 있습니다. 이로 인해 네트워크 성능이 크게 개선되며, 특히 고성능 네트워크 환경에서 매우 유용합니다.
 
한편, Bonding은 여러 네트워크 인터페이스(NIC)를 하나의 논리적 인터페이스로 묶어 성능을 향상시키고 네트워크 가용성을 높이는 기술입니다. Bonding을 통해 네트워크 장애가 발생해도 하나의 인터페이스로 모든 트래픽이 전환되어 가용성을 유지할 수 있습니다. 이 두 기술을 결합하면, 더 높은 성능과 안정성을 확보할 수 있습니다.
 

VLAN, Bonding, XDP를 설정할 때 고려할 사항

VLAN 드라이버 지원 여부

VLAN을 사용할 때, VLAN 트래픽을 처리하는 드라이버가 XDP를 지원하는지 확인하는 것이 중요합니다. 모든 드라이버가 XDP와 호환되는 것은 아니며, 일부 네트워크 카드나 드라이버는 VLAN 태그가 포함된 트래픽을 올바르게 처리하지 못할 수 있습니다. 따라서 VLAN 사용 시, NIC가 VLAN과 XDP를 모두 지원하는지 확인해야 합니다.
 
VLAN 지원 여부를 확인하려면 ethtool 명령어를 사용해 네트워크 인터페이스의 드라이버 정보를 확인할 수 있습니다.

ethtool -i <interface name>
 

VLAN 태그 처리

Trunk 모드에서는 각 패킷에 VLAN 태그가 포함되므로 XDP 프로그램이 이를 처리할 수 있어야 합니다. Access 모드에서는 VLAN 태그가 없으므로 추가적인 태그 처리가 필요하지 않지만, Trunk 모드에서는 각 패킷에 VLAN 태그가 포함되어 있기 때문에, XDP 프로그램이 이를 처리할 수 있어야 합니다.
 
이를 위해 XDP 프로그램에 VLAN 태그를 처리하는 로직을 추가해야 하며, Cilium과 같은 네트워크 플러그인에서는 --vlan-bpf-bypass 플래그를 사용해 특정 VLAN 태그의 트래픽을 허용할 수 있습니다. 이 플래그는 특정 VLAN ID의 트래픽을 차단하지 않고 통과시킬 수 있도록 설정합니다.
 

 
 
 
 

추가 고려 사항

  • MTU 설정: XDP 활성화 시 NIC가 지원하는 최대 MTU 값까지만 설정할 수 있습니다.

 

Cilium 설치 및 XDP 활성화

환경 정보 확인하기

NIC 드라이버 정보 확인

ethtool -i <interface name>

 
현재 구성되어있는 환경에서는 i40e를 사용중입니다. xdp를 지원하는 nic으로 문제가 없습니다. 

 
cilium에서 정리해둔 xdp를 사용할수있는 nic드라이버 리스트는 아래의 링크에서 확인해볼 수 있습니다. 
https://docs.cilium.io/en/stable/bpf/progtypes/#xdp-drivers
 

Bonding 정보 확인

cat /proc/net/bonding/bond0

 
bonding 모드 확인 결과입니다.
확인 결과로는 802.3 모드를 쓰지만 layer2이기 때문에 문제가 없습니다. 

 
bonding 구성정보도 확인해보겠습니다. 

cat /etc/netplan/50-cloud-init.yaml # 파일명은 다를 수 있음

 
현재 구성되어있는 bonding정보는 vlan이 구성되어있습니다. vlan아이디가 설정되어있어 trunk모드인것을 알 수 있습니다. 

network:
	...
    vlans:
        bond0.184:
            addresses:
            - 10.2.1.44/24
            gateway4: 10.2.1.1
            id: 184
            link: bond0
            mtu: 9000
            nameservers:
                addresses:
                - 123.22.33.1

 
bond인터페이스가 184아이디를 갖고 생성되었기 때문에 해당 vlan의 드라이버를 확인해보겠습니다.

ethtool -i bond0.184

 

Cilium 설치

다음은 cilium을 설치해보도록 하겠습니다. 이미 xdp를 활성화 할수 있는 환경을 구성했기 때문에 xdp활성화에 필요한 설정을 넣어 설치하면 됩니다.
 

cilium cli로 설치하기

vlan의 아이디가 184이기 때문에 아이디값을 명시하였습니다.

cilium install --namespace kube-system \
    --set routingMode=native \
    --set kubeProxyReplacement=true \
    --set loadBalancer.acceleration=native \
    --set loadBalancer.mode=best-effort \
    --set k8sServiceHost=${API_SERVER_IP} \
    --set k8sServicePort=${API_SERVER_PORT} \ 
    --set bpf.vlanBypass=[184] \
    --set devices=bond0.184

 

 

하지만 이렇게 설정하니 에러가 발생했습니다..

 

관련 이슈

https://github.com/cilium/cilium/issues/24768

 

XDP: Failing to attach XDP program to a tagged VLAN interface · Issue #24768 · cilium/cilium

Is there an existing issue for this? I have searched the existing issues What happened? With Cilium 1.13.0, we could successfully enable XDP when a node has a single native VLAN. However, after we ...

github.com

😡 vlan + bonding + xdp 활성화는 Access모드만 가능한 것 같습니다. 

 

Helm으로 설치하기

생략합니다.
 

XDP 활성화 확인

로그 확인하기

cilium의 로그를 확인해보면 다음과 같이 xdp가 활성화 된것을 확인해볼 수 있습니다. 

level=info msg="Program cil_xdp_entry attached using bpf_link" subsys=datapath-loader

 

인터페이스 정보 확인하기

설치 후, 다음 명령어로 Bonding 인터페이스에서 XDP가 제대로 활성화되었는지 확인할 수 있습니다.

ip link show <bond0>

 
인터페이스 정보 옆에 XDP ID가 표시된 것을 확인할 수 있습니다.

 
이외에도 bpftool 명령어를 사용해서 확인할 수 있습니다. 

 

성능 테스트

XDP가 활성화된 후, Cilium의 cilium monitor 명령어를 사용하여 실시간 패킷 흐름을 모니터링하면서 성능이 향상되었는지 확인할 수 있습니다

cilium monitor

 

마무리

Cilium XDP는 Bonding 인터페이스에서 네트워크 성능을 최적화하는 데 매우 유용합니다. 하지만 XDP를 활성화하려면 NIC가 이를 지원해야 하며, Bonding 모드 또한 신중히 선택해야 합니다. 특정 모드에서는 XDP가 지원되지 않으며, VLAN 사용 시에도 추가로 고려해야 할 사항이 있습니다. 올바른 구성을 하고 Cilium을 설치해 XDP를 활성화하면 네트워크 성능을 극대화할 수 있습니다.