1 분 소요

새로운 플랫폼이나 오픈 소스를 도입할 때 흔히 공식 문서를 참고하는데요. 하지만 사용하려는 기술의 벤더가 제공하는 공식 문서대로 따라했는데 원하는 방식대로 동작하지 않았던 경험을 다들 한번쯤 겪어보셨을 수도 있습니다.

저는 AWS EKS 클러스터를 공부하던 중 Load Balancer를 배포하기 위해 관련 AWS Documentation들을 참고하여 sample 실습을 해봤는데, AWS에서 직접 제공하는 매뉴얼이라 순서대로 따라하면 그대로 될 줄 알았지만 결과는 그렇지 않았습니다. NLB를 배포하기 위해 Load Balancer Controller를 설치하고 로드밸런서 서비스 매니페스트를 실행했는데 서비스와 NLB 자체는 생성됐으나 서비스 고유의 external-ip 주소가 mapping되지 않았고 대상 그룹에 sample 디플로이먼트 내 파드들 또한 추가되지 않았습니다. 당연히 외부에서 서비스에 접근할 수도 없었죠.

스크린샷 2024-11-18 133938.png

스크린샷 2024-11-18 134433.png

AWS Load Balancer Controller

EKS 클러스터 내 LoadBalancer 서비스를 생성하면 AWS API를 통해 ELB를 생성하고 통합할 수 있도록 지원하는 컨트롤러입니다. 정의된 LoadBalancer 매니페스트 내 Annotations 값을 참조하여 실제 ELB를 생성하는 역할을 합니다.

Network Load Balancer

외부 요청을 L4 기반으로 각 타겟에 분산하는 로드밸런서로, 주로 게임 혹은 미디어 스트리밍 서비스에 사용되고 있습니다. 고정 IP를 갖고 특정한 형식의 도메인과 mapping할 수 있습니다.

원인 분석

공식 문서를 따라했는데도 오류가 발생해서 당황스러웠지만 직접 원인을 분석해보기로 했습니다. 설치한 Load Balancer Controller 파드 로그와 로드밸런서 서비스를 describe했을 때 출력되는 이벤트를 확인한 결과 다음과 같은 메시지를 공통적으로 확인할 수 있었습니다.

kubectl logs -n nlb-sample-app [Load Balancer Controller 파드명]
kubectl describe svc -n nlb-sample-app nlb-sample-service

“is not authorized to perform: elasticloadbalancing:DescribeListenerAttributes because no identity-based policy allows the elasticloadbalancing:DescribeListenerAttributes action”

Load Balancer Controller를 배치하는 과정 첫번째로 NLB를 배포하기 위한 IAM 역할(ServiceAccount)을 생성하게 되는데요. 이 역할에 연결할 정책을 공식 문서에 명시된 레포지토리에서 JSON 파일을 다운로드 받아 생성하게 되는데,

이 정책 파일에 ‘elasticloadbalancing:DescribeListenerAttributes’ 액션이 허용되어 있지 않아 리스너의 정보를 읽어올 수 없다는 메시지였습니다.

해결

20241109_AWSLoadBalancerControllerIAMPolicy_수정.png

AWS 콘솔에서 직접 연결된 IAM 정책에 해당 액션을 추가해주니 정상적으로 external-ip가 mapping되고 리스너가 트래픽을 전달하는 대상 그룹에 sample 파드가 추가되는 것을 확인할 수 있었습니다.

loading-ag-237

스크린샷 2024-11-18 135602.png

결론

공식 문서가 무조건적으로 정답이 아닌 경우도 있을 수 있습니다. Deprecate된 기능에 대한 내용을 여전히 지원하기도 하고 표준으로 여겨지는 내용이다 하더라도 개인 setting 환경에 따라 전혀 다른 결과나 오류가 나기도 합니다. 각자 프로젝트를 진행하는 환경에서 매뉴얼을 정확하게 따라했음에도 불구하고 문제가 발생했을 때 알고 있던 관련 배경 지식이나 공식 문서 상의 다른 페이지, 다른 팀원과의 토의를 통해 해결해 봄으로써 경험치를 쌓을 수 있습니다.

공식 문서

AWS Load Balancer Controller

Network Load Balancing

 

댓글남기기