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

서비스에 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를 먼저 늘려 두세요.