본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

MTU 구성으로 네트워크 성능 극대화하기

원문 보기 위키 갱신

Calico 환경의 MTU(최대 전송 단위)를 구성하는 방법을 다룹니다. FelixConfiguration 리소스에서 Calico Open Source의 MTU를 튜닝해 pod 트래픽이 기반 네트워크에 딱 맞게 흐르도록 만들 수 있어요. VXLAN, IP-in-IP, WireGuard의 오버헤드까지 고려한 MTU 계산 방법과 설치 방식별 설정 절차를 소개합니다.

출처: 문서

본문

큰 그림

Calico 환경의 최대 전송 단위(MTU)를 구성해요.

가치

기반 네트워크에 가장 잘 맞도록 Calico에서 MTU를 구성해 워크로드의 네트워크 성능을 최적화해요.

MTU를 늘리면 성능이 좋아질 수 있고, MTU가 너무 클 때는 줄여서 패킷 손실과 단편화 문제를 해결할 수 있어요.

개념

MTU와 Calico 기본값

최대 전송 단위(MTU) 설정은 네트워크를 통해 전송할 수 있는 가장 큰 패킷 크기를 결정해요. MTU는 각 워크로드에 연결된 veth와 터널 장치(IP in IP, VXLAN, WireGuard를 켠 경우)에 구성돼요.

일반적으로 최고 성능은 단편화나 패킷 드롭을 일으키지 않는 경로에서 가장 높은 MTU 값을 쓸 때 얻어져요. 최대 대역폭이 늘어나고 주어진 트래픽 양에서 CPU 소비가 줄어들 수 있어요. 개선 효과는 pod 간 트래픽이 캡슐화될 때(IP in IP, VXLAN, WireGuard)와 그런 트래픽의 분할·결합을 NIC 오프로드로 처리할 수 없을 때 특히 두드러져요.

기본적으로 Calico는 노드 구성과 활성화된 네트워킹 모드를 바탕으로 클러스터에 맞는 올바른 MTU를 자동 감지해요. 이 가이드는 필요하다면 명시적인 값을 제공해 MTU 자동 감지를 재정의하는 방법을 설명해요.

MTU 자동 감지가 올바르게 동작하려면 felix configuration에서 올바른 캡슐화 모드가 설정되어 있어야 해요. 사용하지 않는 캡슐화(vxlanEnabled, ipipEnabled, wireguardEnabled, wireguardEnabledV6)는 felix 구성에서 꺼서 자동 감지가 클러스터에 최적인 MTU를 고를 수 있도록 하세요.

시작하기 전에

IP in IP와/또는 VXLAN 오버레이 사용에 도움이 필요하면 Configure overlay networking을 참고하세요.

WireGuard 암호화 사용에 도움이 필요하면 Configure WireGuard encryption을 참고하세요.

방법

MTU 크기 결정하기

다음 표는 Calico 환경에서 흔히 쓰는 MTU 크기를 정리한 거예요. MTU는 엔드포인트 사이 네트워크 경로의 전역 속성이기 때문에, 패킷이 지나갈 수 있는 경로 중 가장 작은 MTU에 맞춰 설정해야 해요.

일반적인 MTU 크기

네트워크 MTU Calico MTU IP-in-IP 사용 시 Calico MTU (IPv4) VXLAN 사용 시 Calico MTU (IPv4) VXLAN 사용 시 Calico MTU (IPv6) WireGuard 사용 시 Calico MTU (IPv4) WireGuard 사용 시 Calico MTU (IPv6)
1500 1500 1480 1450 1430 1440 1420
9000 9000 8980 8950 8930 8940 8920
1500 (AKS) 1500 1480 1450 1430 1340 1320
1460 (GCE) 1460 1440 1410 1390 1400 1380
9001 (AWS Jumbo) 9001 8981 8951 8931 8941 8921
1450 (OpenStack VXLAN) 1450 1430 1400 1380 1390 1370

오버레이 네트워킹에 권장되는 MTU

IP in IP, VXLAN, WireGuard 프로토콜이 추가하는 오버레이 헤더만큼 최소 MTU가 줄어들어요. (IP in IP는 20바이트 헤더, IPv4 VXLAN은 50바이트 헤더, IPv6 VXLAN은 70바이트 헤더, IPv4 WireGuard는 60바이트 헤더, IPv6 WireGuard는 80바이트 헤더를 사용해요.)

AKS를 사용할 때는 네트워크 인터페이스의 MTU가 1500이더라도 기반 네트워크의 MTU가 1400이에요. WireGuard는 패킷에 Don't Fragment(DF) 비트를 설정하기 때문에, AKS에서 WireGuard의 MTU는 패킷 드롭을 피하려고 기반 네트워크 MTU 1400보다 60바이트(IPv6는 80바이트) 아래로 설정해야 해요.

클러스터에 WireGuard와 IP in IP 또는 VXLAN이 섞여 있다면, MTU는 각 캡슐화 유형 값 중 가장 작은 값으로 구성해야 해요. WireGuard가 양쪽 노드에 모두 켜져 있는 노드 사이에서는 WireGuard 캡슐화만 사용되고, 둘 다 WireGuard가 꺼져 있는 노드 사이에서는 IP in IP나 VXLAN이 사용되기 때문이에요. 예를 들어 노드에 WireGuard를 설치하는 도중이라면 그런 상황이 생길 수 있어요.

따라서 다음을 권장해요.

  • pod 네트워크 어디에서든 IPv4 WireGuard 암호화를 사용한다면 MTU를 "물리 네트워크 MTU - 60"으로 구성하세요.
  • pod 네트워크 어디에서든 IPv6 WireGuard 암호화를 사용한다면 MTU를 "물리 네트워크 MTU - 80"으로 구성하세요.
  • WireGuard를 쓰지 않지만 pod 네트워크 어디에서든 IPv4 VXLAN을 사용한다면 MTU를 "물리 네트워크 MTU - 50"으로 구성하세요.
  • WireGuard를 쓰지 않지만 pod 네트워크 어디에서든 IPv6 VXLAN을 사용한다면 MTU를 "물리 네트워크 MTU - 70"으로 구성하세요.
  • WireGuard를 쓰지 않고 IP in IP만 사용한다면 MTU를 "물리 네트워크 MTU - 20"으로 구성하세요.
  • 워크로드 엔드포인트 MTU와 터널 MTU를 같은 값으로 설정하세요. (모든 경로가 같은 MTU를 갖도록 해요.)

eBPF 모드

NodePort 구현은 노드 사이에서 패킷을 전달할 때 VXLAN 터널을 사용해요. 그래서 VXLAN MTU 설정이 워크로드(veth)의 MTU를 정하는 데 쓰이며, "물리 네트워크 MTU - 50"이어야 해요 (위를 참고하세요).

flannel 네트워킹의 MTU

flannel을 네트워킹에 사용할 때는 네트워크 인터페이스의 MTU가 flannel 인터페이스의 MTU와 일치해야 해요.

  • VXLAN과 함께 flannel을 사용한다면 일반적인 크기는 위 표의 "VXLAN 사용 시 Calico MTU" 열을 사용하세요.

MTU 구성하기

SECONDARY: Calico가 사용하는 갱신된 MTU는 새 워크로드에만 적용돼요.

MTU 구성 절차는 설치 방식에 따라 달라져요.

탭: Operator

Operator 설치라면 Calico operator의 Installation 리소스를 수정해 spec의 calicoNetwork 섹션에 있는 mtu 필드를 설정해요. 예를 들면 이렇게 해요.

kubectl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"mtu":1440}}}'

OpenShift도 마찬가지예요.

oc patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"mtu":1440}}}'

탭: Manifest

매니페스트 기반 설치(즉 operator를 쓰지 않는 설치)라면 calico-config ConfigMap을 수정해요. 예를 들면 이렇게 해요.

kubectl patch configmap/calico-config -n kube-system --type merge \
  -p '{"data":{"veth_mtu": "1440"}}'

ConfigMap을 갱신한 뒤에는 모든 calico/node pod을 롤링 재시작하세요. 예를 들면 이렇게 해요.

kubectl rollout restart daemonset calico-node -n kube-system

현재 터널 MTU 값 보기

현재 터널 크기를 보려면 다음 명령어를 사용해요.

ip link show

IP in IP 터널은 MTU 크기와 함께 tunlx(예: tunl0)로 표시돼요. 예를 들면 이렇게요.

Tunnel MTU

더 알아보기 (Learn more)

MTU는 경로상의 최솟값에 맞추는 것이 핵심이라는 점만 기억하면 계산이 단순해집니다. WireGuard와 다른 캡슐화가 섞여 있다면 가장 작은 값을 고르고, 설정 후에는 새 워크로드에만 적용된다는 점을 잊지 마세요.