AWS

AWS - EKS AWS LoadBalancer Controller 설치 및 Ingress 설치

rygus 2026. 2. 1. 22:54
728x90

안녕하세요. 

오늘은 EKS에서 AWS LoadBalancer Controller를 통해 Ingress를 배포하겠습니다. 

 

# AWS LoadBalancer Controller 란?

AWS LoadBalancer Controller는 EKS 내에서 AWS의 Elastic Load Balancing(ELB) 리소스를 관리하는 컨트롤러입니다.

특정 리소스 이벤트가 발생하면 AWS API를 호출하여 로드 밸런서를 프로비저닝하거나 구성합니다.

 

기존 Ingress Controller와의 차이

 

1. Nginx Ingress Controller

  • 트래픽 처리 : 로드 밸런서가 클러스터 내부의 Pod(Nginx)로 트래픽을 보내고, Nginx Pod가 다시 애플리케이션 Pod로 라우팅 (Hop이 한 번 더 발생)
  • LoadBalancer 타입 서비스가 생성되면 EKS에 내장된 Cloud Provider 모듈이 "어? LoadBalancer 타입 서비스네?" 하고 CLB(Classic)나 NLB를 자동으로 생성하여 Nginx Pod가 떠 있는 노드에 연결

2. AWS LoadBalancer Controller

  • 트래픽 처리 : AWS 인프라(ALB/NLB)가 직접 트래픽을 처리하여 Pod로 라우
  • AWS의 개입: AWS LoadBalancer Controller가 설정을 읽고 즉시 ELB를 생성

 

# 사전 설정

 

eksctl 설치

# 컴퓨터의 cpu 아키텍쳐 정보를 기입 대부분은 amd64입니다.
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH

# 환경에 맞는 파일 설치
curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"

# 파일 압축 해제
tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz

# 명령어 변수 지정 및 임시 파일 삭제
sudo install -m 0755 /tmp/eksctl /usr/local/bin && rm /tmp/eksctl

 

설치 완료 후 eksctl version 명령어시 정상적으로 나오면 설치된 것입니다. 

 

aws cli 설치 및 인증

# cli 압축 파일 다운 
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# 압축 해제를 위한 unzip 설치 
sudo apt install unzip

# 다운 받은 zip 파일 
unzip awscliv2.zip

# install 파일 실행
sudo ./aws/install

# 설치 후 적용되었나 버전 확인
aws --version

 

aws --version 명령어 시 아래와 같이 나오면 설치 성공입니다.

 

aws cli 로그인하기

 

이제 로그인을 위해 aws configure 실행하여 생성한 iam user의 액세스 키와 시크릿 키를 입력합니다. 

아래와 같이 각 정보를 입력합니다.

 

aws sts get-caller-identity 명령어 시 아래와 같이 나오면 로그인이 완료된 것입니다.

 

 

eksctl 명령어로 eks 클러스터 배포하기

eksctl create cluster \
--name demo-eks \
--region ap-northeast-2 \
--with-oidc \
--nodegroup-name demo-ng \
--zones ap-northeast-2a,ap-northeast-2c \
--nodes 2 \
--node-type t3.medium \
--node-volume-size=20 \
--managed

 

 

Helm 설치

# Helm 설치 스크립트를 다운로드
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

# 다운로드한 스크립트에 실행 권한 부여
chmod 700 get_helm.sh

# Helm 설치 스크립트 실행 (Helm 설치됨)
./get_helm.sh

 

`helm version` 명령어를 통해 확인이 가능합니다.

# 배포

OIDC를 IAM 제공 업체 등록 ➡️  IAM Policy 배포 ➡️ IAM Role과 SA를 매핑 (IRSA) ➡️ LoadBalancer Controller 배포

 

 

1. OIDC를 IAM 제공 업체 등록

IAM은 같은 AWS 서비스라 할지라도 보안을 위해 아무에게나 권한을 열어주지 않습니다.
그래서 AWS IAM에게 "이 EKS 클러스터는 내가 믿을 수 있는 안전한 친구야"라고 공식적으로 등록해 주는 과정이 필요합니다.

이를
OIDC(OpenID Connect) 자격 증명 공급자 등록이라고 합니다.

eksctl utils associate-iam-oidc-provider \
--region=ap-northeast-2 \
--cluster=<EKS Name> \
--approve

 

IAM ➡️ 액세스 관리 ➡️ ID 제공업체 에 등록된 OIDC와 EKS에 나와있는 OIDC가 같은 것을 확인 가능합니다.

 

 

 

2. IAM Policy 배포

Kubernetes 클러스터는 기본적으로 AWS 외부 리소스를 제어할 권한이 없습니다.

따라서 AWS LoadBalancer Controller라는 '대리인'이 필요합니다.

이 컨트롤러는 단순한 소프트웨어를 넘어, 사용자를 대신해 실제 AWS 인프라(ALB/NLB)를 생성하고

관리하는 핵심 역할을 수행합니다.

이를 위해 먼저 컨트롤러가 AWS API를 호출할 수 있도록 할당할 IAM Policy를 배포하겠습니다. 

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/install/iam_policy.json

aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json

 

 

AWS 콘솔에서 정상적으로 생성된 것을 확인 가능합니다. 

3. IAM Role 생성 및 IAM Role과 SA를 매핑 (IRSA)

Kubernetes의 Service Account (SA)와 AWS의 IAM Role은 서로 다른 개념입니다.

이 다른 두 개념을 이어줘야하고 이 과정을 IRSA라 합니다.

 

아래 명령어를 통해 IAM Role 생성 및 IAM Role과 SA 매핑을 진행합니다. 

# service account와 iam 매핑
eksctl create iamserviceaccount \
--cluster=<EKS Name> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=<Policy ARN> \
--override-existing-serviceaccounts \
--region ap-northeast-2 \
--approve

 

 

 

`kubectl describe sa aws-load-balancer-controller -n kube-system` 명령어로 배포된 SA를 확인 가능하며 저희가 등록한 IAM ARN이 정상적으로 등록되어 있습니다.

 

4. LoadBalancer Controller 배포

 

이제 본격적으로 AWS LoadBalancer Controller 를 Helm으로 배포하겠습니다. 

 

# eks-charts 차트 Helm 리포지토리를 추가
helm repo add eks https://aws.github.io/eks-charts

# 최신 차트가 적용되도록 로컬 리포지토리를 업데이트
helm repo update eks

# AWS Load Balancer Controller 배포
helm install -i aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=<EKS Name> \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set vpcId=<vpc-id> \
--set region=ap-northeast-2

 

참고로 VPC-ID는 EKS의 네트워킹에서 쉽게 확인 가능합니다.

kubectl 명령어로 aws-load-balancer-controller를 확인 가능합니다.

 

# 테스트

NLB 배포 테스트

 

먼저 테스트 workload가 생성될 네임스페이스를 생성합니다.

# namespace 생성
kubectl create namespace nlb-sample-app

 

하기 yaml 파일을 `kubectl apply -f sample-deployment.yaml` 명령어로 배포합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nlb-sample-app
  namespace: nlb-sample-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: public.ecr.aws/nginx/nginx:1.23
          ports:
            - name: tcp
              containerPort: 80

 

하기 yaml 파일을 `kubectl apply -f sample-service.yaml` 명령어로 배포합니다.

apiVersion: v1
kind: Service
metadata:
  name: nlb-sample-service
  namespace: nlb-sample-app
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app: nginx

 

`kubectl get svc nlb-sample-service -n nlb-sample-app` 정상적으로 서비스가 배포되었는지 확인합니다.

 

이제 Console에서 확인해보겠습니다.

network 타입의 Load Balancer가 배포되었습니다.

 

NLB 주소로 홈페이지 접근이 가능합니다.

 

 

ALB 배포 테스트

 

아래 명령어를 통해 간단히 Pod, Service 까지 모두 생성가능합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/examples/2048/2048_full.yaml

 

 

ALB도 콘솔에서 확인 가능합니다.

 

연결 후 2048 게임을 할 수 있습니다.

(키보드로 숫자를 막 합쳐서 2048을 만들면 이기는 게임입니다.)

 

감사합니다. 

 

*출처

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/lbc-helm.html

 

Helm을 사용하여 AWS Load Balancer Controller 설치 - Amazon EKS

AWS Management 콘솔에서 정책을 보는 경우 콘솔에 ELB 서비스에 대한 경고는 표시되지만 ELB v2 서비스에 대한 경고는 표시되지 않습니다. 이는 정책의 작업 중 일부가 ELB v2에는 있지만 ELB에는 없기

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/network-load-balancing.html

 

Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅 - Amazon EKS

이전 버전과의 호환성을 위해 service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip" 주석이 여전히 지원됩니다. 그러나 service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip" 대신 새 로드 밸런서에 이전 주석을

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html