서비스에 Maglev 로드 밸런싱 추가하기
서비스로 들어오는 외부 트래픽에 Maglev 로드 밸런싱을 활성화하는 방법을 안내해요. 노드 장애 시에도 연결이 다른 로드 밸런싱 노드로 넘어갈 수 있게 해 주는 기능이에요. ECMP 경로의 넥스트홉(nexthop)으로 Calico 노드를 쓰고 싶다면 특히 유용해요.
출처: 문서
본문
이 가이드는 서비스로 들어오는 외부 트래픽에 Maglev 로드 밸런싱을 활성화하는 방법을 보여 줘요.
Maglev 로드 밸런싱을 사용하면 Calico를 외부 연결을 위한 분산형 수평 확장 로드 밸런서로 쓸 수 있고, 노드 장애가 발생했을 때 외부 연결이 한 로드 밸런싱 노드에서 다른 노드로 넘어갈 수 있어요.
서비스에 Maglev를 활성화하면 좋은 한 가지 사례는, 서비스 IP를 더 넓은 네트워크에 ECMP 경로로 광고하고 싶을 때예요. Calico 노드를 이런 경로의 넥스트홉으로 쓸 수 있어요. 이 넥스트홉 덕분에 노드를 유지보수로 내려야 하는 상황 같은 경우에도, 그 서비스로 들어오는 외부 연결이 넥스트홉 다운타임과 변동을 견뎌낼 수 있어요. 정상 경로가 동작을 멈추면 트래픽이 다른 경로로 넘어갈(failover) 수 있기 때문이에요.
제한 사항
Maglev 로드 밸런싱은 다음과 함께 사용할 수 없어요:
- 내부 (파드-서비스) 트래픽.
- NodePort - NodePort 연결은 항상 단일 노드에 묶이고 다른 노드로 넘어갈 수 없어요.
- Kubernetes External Traffic Policy. Maglev는 백엔드 선택 시 모든 유효한 백엔드의 룩업 테이블에서 선택해요.
필수 조건
- 클러스터가 direct server return 모드를 갖춘 eBPF 데이터 플레인을 사용해요.
- 모든 노드가 Linux에서 실행돼요.
- VIP/External-IP를 가진 서비스가 있고(가능하다면 Calico LB IPAM이 할당), 클러스터 밖으로 광고하고 있어요.
서비스에 Maglev 로드 밸런싱 활성화하기
서비스에 Maglev 로드 밸런싱을 활성화하려면 다음 애노테이션을 추가해요:
lb.projectcalico.org/external-traffic-strategy: "maglev"
또는 기존 서비스에 다음처럼 애노테이션을 붙여요:
kubectl -n <namespace> annotate service <service> 'lb.projectcalico.org/external-traffic-strategy=maglev'
다음을 바꾸세요:
<namespace>: 서비스가 속한 네임스페이스.<service>: 서비스의 이름.
Calico가 서비스에 Maglev 로드 밸런싱을 구성했는지 확인하기
서비스에 애노테이션을 붙인 뒤, 아무 calico-node 컨테이너에서나 "maglev" 플래그가 붙은 항목이 Calico eBPF NAT 테이블에 있는지 확인해요.
NAT 테이블 덤프 예제
kubectl -n calico-system exec <pod-name> -- calico-node -bpf nat dump
<pod-name>은 아무 calico-node 파드의 이름으로 바꾸세요.
명령 출력에서 서비스의 IP가 들어간 항목과, 같은 줄에 언급된 "maglev" 플래그를 확인해요:
10.101.205.28 port 80 proto 6 id 7 count 4 local 1 flags maglev
7:0 192.168.95.210:9000
7:1 192.168.163.6:9000
7:2 192.168.221.69:9000
7:3 192.168.28.136:9000
추가 노트
대규모 배포를 위한 BPF 맵 크기
트래픽을 고르게 분산하려면 Maglev 같은 consistent-hash 기반 로드 밸런싱 알고리즘이 큰 룩업 테이블(LUT)을 할당해야 해서, 랜덤 선택이나 라운드 로빈 같은 기본 알고리즘보다 메모리 사용량이 커져요. 이런 이유로 이 기능은 모든 서비스에 전역 적용하는 대신 서비스 단위로 활성화돼요.
Calico는 이런 LUT를 최대 크기까지 커질 수 있는 맵으로 eBPF 데이터 플레인에 프로그래밍해요. 100개 이상의 서비스를 프로비저닝할 계획이거나, 하나의 서비스가 100개 이상의 엔드포인트를 가질 계획이라면 Calico FelixConfiguration을 그에 맞게 업데이트해야 해요:
추가 리소스
더 알아보기 (Learn more)
Maglev는 노드 장애 시에도 외부 연결을 살려 주는 consistent-hash 로드 밸런싱이지만, NodePort나 내부 파드-서비스 트래픽에는 쓸 수 없다는 점을 기억하세요. 서비스 수나 엔드포인트 수가 100을 넘을 것 같다면 FelixConfiguration의 BPFMaglevMaxServices, BPFMaglevMaxEndpointsPerService를 먼저 늘려 두세요.