SK플래닛 ai활용 데이터엔지니어 과정 2기/쿠버네티스

쿠버네티스 - 4

dev-lee 2026. 3. 25. 20:56

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)를 제어할 수 있도록 신분증 발급 체계 구성.

  1. OIDC 제공업체 연결 — 클러스터와 IAM 연동
  2. IAM 정책(Policy) 생성 — 로드밸런서 관리 권한 정의 파일 등록
  3. ServiceAccount 생성 — 쿠버네티스 내부 계정 생성 후 IAM 정책 연결(IRSA)

2단계: 컨트롤러 설치 (AWS Load Balancer Controller)

ALB 생성을 담당하는 컨트롤러 Pod를 클러스터에 배포.

  1. Helm 레포지토리 등록 — EKS 공식 차트 주소 등록
  2. 컨트롤러 배포 — helm installkube-system 네임스페이스에 설치
  3. 동작 확인 — kubectl logs로 에러 유무 모니터링

3단계: 애플리케이션 배포 (Deployment & Service)

실제 서비스할 프로그램과 내부 통로 구성.

  1. Deployment 생성 — 컨테이너 이미지 기반 Pod 실행
  2. Service 생성 — Pod들을 묶어주는 NodePort 또는 ClusterIP 서비스 생성

4단계: 외부 노출 설정 (Ingress)

ALB 실제 생성 및 외부 주소 할당.

  1. Ingress 규칙 정의 — annotations에 ALB 설정 포함한 YAML 작성
  2. Ingress 배포 — kubectl apply 실행 시 컨트롤러가 AWS에 ALB 자동 생성
  3. Address 확인 — kubectl get ing으로 DNS 주소 생성 대기

5단계: 최종 검증 및 접속

  1. 대상 그룹(Target Group) 확인 — AWS 콘솔에서 Pod Healthy 상태 점검
  2. 보안 그룹(SG) 확인 — 80번 포트 외부(0.0.0.0/0) 오픈 여부 점검
  3. 브라우저 접속 — 할당된 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 및 관련 네트워크 리소스 삭제 여부 확인

'SK플래닛 ai활용 데이터엔지니어 과정 2기 > 쿠버네티스' 카테고리의 다른 글

쿠버네티스 - 6  (0) 2026.03.25
쿠버네티스 - 5  (0) 2026.03.25
쿠버네티스 - 3  (0) 2026.03.25
쿠버네티스 - 2  (0) 2026.03.23
쿠버네티스 - 1  (0) 2026.03.23