Aws loadbalancer ingress traffic mode변경을 통해 EKS 내 네트워크 홉을 줄여보자

Hoonkii·2024년 6월 26일
0
post-custom-banner

개요

EKS 에서 Nginx Ingress Controller를 도입하면서 Loadbalancer는 Aws loadbalancer controller를 add on 으로 추가하여 자동 프로비져닝 하였다. Aws Loadbalancer 설정 중 Ingress traffic mode 설정 에 대해 알게 되었고, 이를 통해 EKS + AWS VPC CNI 환경에서 네트워크 홉을 줄일 수 있어서 해당 내용을 정리하고자 한다.

Aws loadbalacner controller의 ingress traffic 모드

k8s에서 Loadbalancer 타입의 서비스는 Nodeport 위에서 동작하며, EKS에서는 Aws의 ELB를 프로비저닝 하여 사용할 수 있다. ELB는 VPC 밖에 위치하며 ELB는 Nodeport로 트래픽을 라우팅한다. 이게 기본 설정인 instance mode 이다.

그러나 EKS에서 AWS VPC CNI를 사용하고 있다면 ALB의 ingress traffic mode 를 ip mode로 변경하여 로드밸런서가 Nodeport로 트래픽을 라우팅하는게 아니라 pod 의 ip 주소로 트래픽을 직접적으로 라우팅하게 할 수 있다.

위 그림을 보면 직관적으로 이해할 수 있다. instance 모드는 Nodeport로 트래픽을 라우팅하기 때문에 네트워크 홉이 늘어날 수 있다. PodA에 대한 트래픽이 1번 노드로 전달되더라도 쿠버네티스에서는 PodA로 라우팅되는 것이 아니라, iptables를 거쳐 PodA가 있는 다른 노드로 트래픽이 전달될 수 있다.

설정은 LoadBalancer 타입의 서비스 annotation 에 service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip 를 추가하면 된다. 우리의 경우 ingress nginx controller 를 Loadbalancer 서비스로 노출하고 있어서, helm chart에 어노테이션을 추가해주었다. Aws Loadbalancer Controller가 알아서 변경사항을 감지하고 로드밸런서 설정을 변경해준다.

annotations:
	service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
	service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
	service.beta.kubernetes.io/aws-load-balancer-type: nlb
	service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing" # public
	service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip # ip mode 설정 default 는 instance

Aws console에 들어가서 프로비저닝 된 로드밸런서의 target group이 어떻게 바뀌었는지 살펴보자.

ip 모드 설정하기 전 target group은 다음 사진과 같이 클러스터 내 모든 노드였다.

ip 모드 설정 후 ingress nginx controller pod의 ip만 target 으로 남게 되었다.

따라서 노드 포트를 거치는게 아니라 로드 밸런서가 ingress nginx controller pod 으로 직접 트래픽을 라우팅할 수 있게 되어 홉이 줄어들었다.

Reference

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/how-it-works/

profile
개발 공부 내용 정리
post-custom-banner

0개의 댓글