기본 인터페이스 구성
Calico Open Source VPP 데이터 플레인에서 호스트의 기본(primary) 인터페이스를 사용하는 방법을 정리한 참고 문서예요. 성능과 설정의 단순함 사이 트레이드오프가 있어서 여러 가지 방식을 선택할 수 있어요. virtio, AVF, af_packet, af_xdp, dpdk 등 지원되는 주요 구성을 하나씩 짚어 보게 됩니다.
출처: 문서
본문
VPP와 함께 호스트의 기본 인터페이스를 사용하는 방법은 여러 가지를 선택할 수 있어요. 보통 성능과 구성의 단순함 사이에 트레이드오프가 있죠. 주요 지원 구성은 다음과 같아요.
virtio인터페이스를 네이티브 VPP 드라이버로 사용해요. 성능이 좋고 설정이 간단하지만 virtio 인터페이스만 지원해요.avf가상 함수를 만들어 네이티브 VPP 드라이버로 사용해요. 성능이 좋고 설정이 간단하지만 intel AVF 인터페이스만 지원해요.af_packet인터페이스가 Linux에 남아 패킷을 VPP로 넘겨줘요. 성능은 낮지만 어떤 인터페이스든 바로 동작해요.af_xdp패킷이 eBPF를 통해 전달돼요.>=5.4커널이 필요하지만 별도 설정 없이 좋은 성능으로 동작해요.dpdk인터페이스를 Linux에서 제거하고 dpdk 라이브러리로 사용해요. 성능과 지원은 좋지만 설정이 복잡할 수 있어요.- 그 외 네이티브 VPP 드라이버는
dpdk보다 좋은 성능을 내지만 복잡한 수동 설정이 필요해요.
일반적인 동작 방식
매니페스트 파일의 calico-vpp-config ConfigMap 섹션에는 CALICOVPP_INTERFACES 키가 들어 있어요. Calico VPP에서 인터페이스 관련 파라미터를 담은 딕셔너리예요:
# Configures parameters for calicovpp agent and vpp manager
CALICOVPP_INTERFACES: |-
{
"maxPodIfSpec": {
"rx": 10, "tx": 10, "rxqsz": 1024, "txqsz": 1024
},
"defaultPodIfSpec": {
"rx": 1, "tx":1, "isl3": true
},
"vppHostTapSpec": {
"rx": 1, "tx":1, "rxqsz": 1024, "txqsz": 1024, "isl3": false
},
"uplinkInterfaces": [
{
"interfaceName": "eth1",
"vppDriver": "af_packet"
}
]
}
uplinkInterfaces 필드는 인터페이스와 그 구성의 목록을 담고 있고, 첫 번째 요소가 기본/메인 인터페이스, 나머지(있다면)는 보조 호스트 인터페이스예요. 기본 인터페이스가 어떻게 구성되는지는 uplinkInterfaces[0]의 vppDriver 필드가 결정해요. vppDriver 필드를 비워 두면(또는 지정하지 않으면) 여러분 환경에서 지원되는 모든 드라이버를 성능이 좋은 것부터 시도해요(dpdk만은 명시적으로 지정해야 해요). 예를 들어 virtio가 동작하길 원한다면 hugepages를 할당해야 하는 건 여전히 필요해요.
SECONDARY: 사용할 드라이버를 지정하는
CALICOVPP_NATIVE_DRIVER방식도 여전히 지원돼요. Getting Started의 Legacy options 하위 섹션을 참고하세요.
네이티브 Virtio 드라이버 사용하기
기본 인터페이스가 virtio라면 이 드라이버를 사용할 수 있어요 (realpath /sys/bus/pci/devices/<PCI_ID>/driver가 .../virtio-net을 반환)
- 시스템에 hugepages가 있는지 확인해요 (
sysctl -w vm.nr_hugepages=512) vfio-pci가 로드됐는지 확인해요 (sudo modprobe vfio-pci)- 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "virtio"로 설정해요 - 그리고 vpp 구성에
dpdk스탠자가 없고 그 플러그인이 비활성화돼 있는지 확인해요
선택 사항으로 rx 큐의 개수/크기를 설정하고 싶다면 Getting Started의 UplinkInterfaceSpec 하위 섹션을 참고하세요.
네이티브 AVF 드라이버 사용하기
기본 인터페이스가 AVF가 지원하는 것이라면 이 드라이버를 사용할 수 있어요 (realpath /sys/bus/pci/devices/<PCI_ID>/driver가 .../i40e를 반환)
vfio-pci가 로드됐는지 확인해요 (sudo modprobe vfio-pci)- 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "avf"로 설정해요 - 그리고 vpp 구성에
dpdk스탠자가 없고 그 플러그인이 비활성화돼 있는지 확인해요
선택 사항으로 rx 큐의 개수/크기를 설정하고 싶다면 Getting Started의 UplinkInterfaceSpec 하위 섹션을 참고하세요.
AF_XDP 사용하기
경고:
uname -r로 커널이 최소5.4인지 확인하세요
- 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "af_xdp"로 설정해요 - 그리고 vpp 구성에
dpdk스탠자가 없고 그 플러그인이 비활성화돼 있는지 확인해요 - 마지막으로
calico-node컨테이너에서FELIX_XDPENABLED를false로 설정해야 해요. 그렇지 않으면 felix가 주기적으로 VPP 구성을 정리해버려요--- kind: DaemonSet apiVersion: apps/v1 metadata: name: calico-node namespace: kube-system spec: template: spec: containers: - name: calico-node env: - name: FELIX_XDPENABLED value: 'false'
kustomize를 사용한다면 kubectl kustomize ./yaml/overlays/af-xdp | kubectl apply -f -로 해요.
선택 사항으로 rx 큐의 개수/크기를 설정하거나, 인터페이스를 busy-poll할지(polling), 인터럽트로만 깨울지(interrupt), 부하에 따라 둘 사이를 전환할지(adaptive) 지정하고 싶다면 Getting Started의 UplinkInterfaceSpec 하위 섹션을 참고하세요.
참고 사항
- AF_XDP는
buffers { buffers-per-numa }를 너무 크게 지정하면 시작하지 않아요 (65536이면 동작해요)
AF_PACKET 사용하기
- 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "af_packet"으로 설정해요 - 그리고 vpp 구성에
dpdk스탠자가 없고 dpdk 플러그인이 비활성화돼 있는지 확인해요
kubectl kustomize ./yaml/overlays/af-packet | kubectl apply -f -를 사용할 수도 있어요
DPDK 사용하기
- 시스템에 hugepages가 있는지 확인해요 (
sysctl -w vm.nr_hugepages=512) - 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "dpdk"로 설정해요
vpp CLI로 네이티브 드라이버 사용하기
꽤 고급/실험적인 설정이에요. 여기서는 vpp cli를 사용하는 AVF 드라이버를 예로 들지만, 어떤 vpp 드라이버든 사용할 수 있어요. 이 방식으로 다른 인터페이스 타입도 효율적으로 지원할 수 있어요.
- 기본 인터페이스인
uplinkInterfaces[0]의vppDriver를 "none"으로 설정해요 - vpp 구성에
dpdk스탠자가 없고 dpdk 플러그인이 비활성화돼 있는지 확인해요 unix { .. }안에exec /etc/vpp/startup.exec항목이 있는지 확인해요CALICOVPP_CONFIG_TEMPLATE: |- unix { nodaemon full-coredump log /var/run/vpp/vpp.log cli-listen /var/run/vpp/cli.sock exec /etc/vpp/startup.exec } ... # removed dpdk { ... } ... plugins { plugin default { enable } plugin calico_plugin.so { enable } plugin dpdk_plugin.so { disable } }CALICOVPP_CONFIG_EXEC_TEMPLATE환경 변수를 업데이트해서 인터페이스 생성 cli 명령을 전달해요.kind: DaemonSet apiVersion: apps/v1 metadata: name: calico-vpp-node namespace: calico-vpp-dataplane spec: template: spec: containers: - name: vpp env: - name: CALICOVPP_CONFIG_EXEC_TEMPLATE value: 'create interface avf 0000:ab:cd.1 num-rx-queues 1'
AVF 드라이버의 경우 PCI id는 avf.sh 스크립트로 만들 수 있는 VF에 속해야 해요. 드라이버마다 요구 사항이 달라요.
더 알아보기 (Learn more)
드라이버 선택 요령은 "virtio/AVF는 성능과 단순함의 균형, af_packet은 무난하지만 느림, af_xdp는 5.4+ 커널에서 성능, dpdk는 최고 성능이지만 설정이 복잡"이에요. uplinkInterfaces[0]의 vppDriver가 핵심 설정점이라는 점만 기억하면 돼요. 큐 개수·폴링 모드 등 세부 옵션은 Getting Started의 UplinkInterfaceSpec 섹션을 참고하세요.