AWS EKS ALB(Application Load Balancer) 컨트롤러 가이드 요약
1. EKS ALB 컨트롤러란?
AWS Load Balancer Controller는 쿠버네티스 클러스터 내에서 AWS의 로드 밸런서(ALB 및 NLB)를 자동으로 관리해주는 오픈소스 컨트롤러.
Ingress 또는 Service 리소스를 생성하면 컨트롤러가 AWS API를 호출하여 실제 ALB 또는 NLB를 자동 생성·설정.
주요 기능
| 기능 | 설명 |
|---|---|
| Ingress 지원 (ALB 생성) | Ingress 리소스 감지 후 AWS에 ALB 자동 생성. HTTP/HTTPS 경로 기반 라우팅 처리 |
| Service 지원 (NLB 생성) | type: LoadBalancer 서비스에 NLB 생성 가능 |
| 대상 그룹 자동 관리 | Pod 생성·삭제 시 ALB 대상 그룹에 IP 자동 등록·제거 |
도입 이유
- 자동화: YAML 파일 하나로 AWS 로드 밸런서 인프라까지 관리(IaC)
- 비용 절감: Ingress Group 기능으로 여러 서비스를 하나의 ALB에 통합
- 성능: IP 모드 지원으로 NodePort 등 중간 단계 없이 Pod에 직접 트래픽 전달
설치 전 필수 조건
- IAM OIDC 제공업체: EKS 클러스터와 AWS IAM 간의 신뢰 관계 설정
- IAM 정책 및 역할: 컨트롤러가 ALB를 생성할 수 있는 권한 부여
2. EKS ALB 컨트롤러 설치 순서
1단계: 기반 권한 설정 (IAM & OIDC)
EKS Pod가 AWS 리소스(ALB)를 제어할 수 있도록 신분증 발급 체계 구성.
- OIDC 제공업체 연결 — 클러스터와 IAM 연동
- IAM 정책(Policy) 생성 — 로드밸런서 관리 권한 정의 파일 등록
- ServiceAccount 생성 — 쿠버네티스 내부 계정 생성 후 IAM 정책 연결(IRSA)
2단계: 컨트롤러 설치 (AWS Load Balancer Controller)
ALB 생성을 담당하는 컨트롤러 Pod를 클러스터에 배포.
- Helm 레포지토리 등록 — EKS 공식 차트 주소 등록
- 컨트롤러 배포 —
helm install로kube-system네임스페이스에 설치 - 동작 확인 —
kubectl logs로 에러 유무 모니터링
3단계: 애플리케이션 배포 (Deployment & Service)
실제 서비스할 프로그램과 내부 통로 구성.
- Deployment 생성 — 컨테이너 이미지 기반 Pod 실행
- Service 생성 — Pod들을 묶어주는 NodePort 또는 ClusterIP 서비스 생성
4단계: 외부 노출 설정 (Ingress)
ALB 실제 생성 및 외부 주소 할당.
- Ingress 규칙 정의 — annotations에 ALB 설정 포함한 YAML 작성
- Ingress 배포 —
kubectl apply실행 시 컨트롤러가 AWS에 ALB 자동 생성 - Address 확인 —
kubectl get ing으로 DNS 주소 생성 대기
5단계: 최종 검증 및 접속
- 대상 그룹(Target Group) 확인 — AWS 콘솔에서 Pod Healthy 상태 점검
- 보안 그룹(SG) 확인 — 80번 포트 외부(0.0.0.0/0) 오픈 여부 점검
- 브라우저 접속 — 할당된 DNS 주소로 서비스 작동 확인
3. 전체 실습 명령어
환경 변수 설정
export CLUSTER_NAME="free-vpc-cluster"
export AWS_REGION="ap-northeast-2"
export AWS_ACCOUNT_ID="588752323301"
export POLICY_ARN="arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy"
IAM 정책 생성
# 정책 파일 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
# IAM 정책 생성
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
OIDC 제공업체 연결
eksctl utils associate-iam-oidc-provider \
--region=${AWS_REGION} \
--cluster=${CLUSTER_NAME} \
--approve
IAM ServiceAccount 생성
eksctl create iamserviceaccount \
--cluster=${CLUSTER_NAME} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=${POLICY_ARN} \
--approve \
--region ${AWS_REGION}
Helm으로 컨트롤러 설치
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=${CLUSTER_NAME} \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
서브넷 태그 설정 (ALB 생성에 필수)
export ALL_SUBNETS=$(aws eks describe-cluster --name $CLUSTER_NAME \
--query "cluster.resourcesVpcConfig.subnetIds" --output text)
aws ec2 create-tags \
--resources $ALL_SUBNETS \
--tags Key=kubernetes.io/role/elb,Value=1 \
Key=kubernetes.io/cluster/$CLUSTER_NAME,Value=shared
4. 디플로이먼트 배포 (2048 게임 예시)
Deployment & Service 배포
# game-2048.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2048
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: game-2048
template:
metadata:
labels:
app: game-2048
spec:
containers:
- name: app-2048
image: public.ecr.aws/l6m2t8p7/docker-2048:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: service-2048
namespace: default
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: game-2048
kubectl apply -f game-2048.yaml
Ingress 배포 (ALB 자동 생성)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-alb
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
kubectl apply -f ingress-test.yaml
# DNS 주소 확인 (약 5분 대기)
kubectl get ingress test-alb
5. 트러블슈팅 명령어
# 권한 문제 확인
kubectl describe sa aws-load-balancer-controller -n kube-system
# 컨트롤러 에러 로그 확인
kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller -f
# ALB 생성 실패 원인 확인
kubectl describe ingress test-alb
6. 삭제 순서
⚠️ 삭제 순서 준수 필수 — Ingress를 가장 먼저 삭제해야 AWS의 실제 ALB가 안전하게 제거됨.
# 1. Ingress 삭제 (ALB 제거)
kubectl delete ingress test-alb
# 2. 애플리케이션 리소스 삭제
kubectl delete -f game-2048.yaml
# 3. ALB 컨트롤러 삭제 (Helm)
helm uninstall aws-load-balancer-controller -n kube-system
# 4. IAM ServiceAccount 및 Role 삭제
eksctl delete iamserviceaccount \
--cluster=${CLUSTER_NAME} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--region ${AWS_REGION}
# 5. IAM 정책 삭제
aws iam delete-policy --policy-arn ${POLICY_ARN}
# 6. EKS 클러스터 삭제 (약 5분 소요)
eksctl delete cluster --name ${CLUSTER_NAME} --region ${AWS_REGION}
삭제 후 AWS 콘솔 최종 확인 항목
| 항목 | 확인 내용 |
|---|---|
| EC2 > 로드밸런서 | 생성된 ALB 목록에서 삭제 여부 확인 |
| EC2 > 대상 그룹 | ALB 연결 Target Group 삭제 여부 확인 |
| CloudFormation | eksctl 생성 스택 DELETE_COMPLETE 상태 확인 |
| VPC | VPC 및 관련 네트워크 리소스 삭제 여부 확인 |