728x90
반응형
개요
AWS Load Balancer Controller는 Kubernetes의 Ingress 리소스를 기반으로 AWS Application Load Balancer(ALB) 또는 Network Load Balancer(NLB)를 자동으로 생성하고 관리하는 컨트롤러
이 컨트롤러는 다음 기능을 제공:
- Kubernetes Ingress 리소스를 기반으로 ALB 자동 생성
- Kubernetes Service 리소스를 기반으로 NLB 자동 생성
- TargetGroup, Listener 등 AWS 리소스를 자동 연결 및 설정
- IAM Role for ServiceAccount(IRSA)를 통해 보안 강화
이 문서는 eksctl과 Helm을 사용하여 EKS 클러스터에 AWS Load Balancer Controller를 설치하고 구성하는 방법을 설명한다.
당연히 eksctl 과 helm은 설치되어 있어야한다. 설치 방법은 문서 참고
설치 스크립트
#!/bin/bash
# 변수 설정
CLUSTER_NAME="mh-eks-cluster" # 실제 클러스터 이름으로 변경 필요
POLICY_NAME="AWSLoadBalancerControllerAdditionalIAMPolicy"
ROLE_NAME="AmazonEKSLoadBalancerControllerRolePark" # 생성할 Role 이름
export AWS_PAGER=""
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "ACCOUNT_ID: $ACCOUNT_ID"
echo "=== AWS Load Balancer Controller 설정 시작 ==="
# 1. Policy 존재 여부 확인 및 생성
if ! aws iam get-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${POLICY_NAME} 2>/dev/null; then
echo "Policy 생성 중..."
curl -o iam_policy.json <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json>
CREATE_POLICY_RESULT=$(aws iam create-policy \\
--policy-name ${POLICY_NAME} \\
--policy-document file://iam_policy.json)
echo "CREATE_POLICY_RESULT: $CREATE_POLICY_RESULT"
fi
# 2. eksctl로 IAM Role과 ServiceAccount 생성
echo "IAM Role과 ServiceAccount 생성 중..."
eksctl create iamserviceaccount \\
--cluster=${CLUSTER_NAME} \\
--namespace=kube-system \\
--name=aws-load-balancer-controller \\
--role-name=${ROLE_NAME} \\
--attach-policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/${POLICY_NAME} \\
--approve
# # 3. Helm repo 추가 및 업데이트
echo "Helm repo 추가 및 업데이트 중..."
helm repo add eks <https://aws.github.io/eks-charts>
helm repo update
# 4. AWS Load Balancer Controller 설치
echo "AWS Load Balancer Controller 설치 중..."
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
# 임시 파일 정리
rm -f iam_policy.json
echo "=== 설치 완료 ==="
echo "설치 상태 확인:"
kubectl get deployment -n kube-system aws-load-balancer-controller
1. 값 설정
CLUSTER_NAME="mh-eks-cluster"
POLICY_NAME="AWSLoadBalancerControllerAdditionalIAMPolicy"
ROLE_NAME="AmazonEKSLoadBalancerControllerRolePark"
- CLUSTER_NAME: 설치 대상 EKS 클러스터 이름
- POLICY_NAME: Load Balancer Controller에 필요한 IAM Policy 이름
- ROLE_NAME: 연결할 IAM Role 이름
- AWS_PROFILE: AWS CLI 인증 프로파일
2. 계정 ID 획득
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
echo "ACCOUNT_ID: $ACCOUNT_ID"
- 현재 인증된 AWS 계정의 ID를 추출하여 나중에 ARN 생성에 사용
3. IAM Policy 여부 확인 및 생성
if ! aws iam get-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${POLICY_NAME}; then
curl -o iam_policy.json <https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json>
aws iam create-policy \\
--policy-name ${POLICY_NAME} \\
--policy-document file://iam_policy.json
fi
- Policy가 없으면 GitHub에서 공식 JSON 파일을 다운로드하고, 새로 생성
- 정책 이름은 사용자 정의 가능하며, 계정 내에서 고유해야 함
4. IAM Role + Kubernetes ServiceAccount 생성
eksctl create iamserviceaccount \\
--cluster=${CLUSTER_NAME} \\
--namespace=kube-system \\
--name=aws-load-balancer-controller \\
--role-name=${ROLE_NAME} \\
--attach-policy-arn=arn:aws:iam::${ACCOUNT_ID}:policy/${POLICY_NAME} \\
--approve
- kube-system 네임스페이스에 ServiceAccount 생성
- 위에서 만든 Policy와 연결된 IAM Role을 생성하고 연결
- -approve 플래그를 통해 자동 승인 처리
5. Helm Chart 추가 및 업데이트
helm repo add eks <https://aws.github.io/eks-charts>
helm repo update
- AWS 공식 Helm 차트 저장소 추가 및 최신 정보 갱신
6. Helm을 이용한 Controller 설치
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
- 이미 eksctl로 만든 ServiceAccount를 사용하기 위해 create=false 설정
- 클러스터 이름을 명시적으로 설정하여 Helm 차트가 이를 참조
7. 임시 파일 지우기 & 설치 결과 확인
rm -f iam_policy.json
kubectl get deployment -n kube-system aws-load-balancer-controller
- 임시로 다운로드한 정책 파일 삭제
- Controller가 정상적으로 배포되었는지 Deployment 상태 확인
예시 애플리케이션 배포 (ALB 연동)
다음은 AWS Load Balancer Controller가 정상적으로 설치된 후, 실제 애플리케이션을 배포하고 ALB를 통해 외부에 노출하는 예시
1. Deployment: S3 테스트 서버 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: s3-test-not
spec:
selector:
matchLabels:
app.kubernetes.io/name: s3-test-not
replicas: 5
template:
metadata:
labels:
app.kubernetes.io/name: s3-test-not
spec:
containers:
- image: 178339389771.dkr.ecr.ap-northeast-2.amazonaws.com/sa:s3-pod
imagePullPolicy: Always
name: s3-test-not
ports:
- containerPort: 8080
2. Service: ClusterIP 타입
apiVersion: v1
kind: Service
metadata:
name: s3-test-not
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: ClusterIP
selector:
app.kubernetes.io/name: s3-test-not
3. Ingress: ALB 생성 YAML
apiVersion: networking.k8s.io/v1 # Kubernetes Ingress 최신 API 버전
kind: Ingress
metadata:
name: s3-test-not # Ingress 리소스 이름
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
# ALB의 접근 방식 설정
# - "internet-facing": 퍼블릭 ALB로 생성되어 외부 인터넷 접근 허용
# - "internal": 내부 전용 ALB 생성 (VPC 내부에서만 접근 가능)
alb.ingress.kubernetes.io/target-type: ip
# ALB가 트래픽을 전달할 타겟의 타입
# - "ip": Pod의 IP를 직접 타겟으로 설정 (대부분의 EKS 사용자가 이 방식 사용)
# - "instance": EC2 인스턴스를 타겟으로 사용 (노드 포트 기반, Fargate에서는 지원 안 함)
spec:
ingressClassName: alb
# 이 Ingress를 처리할 Ingress Controller 명시
# "alb"는 AWS Load Balancer Controller가 처리하게 만듦
# 예전 방식은: annotations: kubernetes.io/ingress.class: alb (현재는 deprecated)
rules:
- http:
paths:
- path: /
pathType: Prefix
# "Prefix"는 경로가 "/"로 시작하면 모두 일치
# 예: "/", "/hello", "/hello/world" 등 모두 이 backend로 라우팅됨
backend:
service:
name: s3-test-not
port:
number: 80
# Service 이름과 포트
# ALB가 이 서비스의 80포트로 트래픽을 전달
# Service 내부적으로는 targetPort: 8080 등을 통해 컨테이너에 전달
4. 사용 방법 요약
- 위의 Deployment, Service, Ingress 리소스를 모두 kubectl apply -f로 배포
- Ingress 리소스를 통해 ALB가 생성되고, 퍼블릭 도메인이 할당
- 다음 명령어로 ALB 주소 확인:
kubectl get ingress s3-test-not
5. ALB ingress 사용시 자주쓰는 옵션 어노테이션
Annotation 설명
alb.ingress.kubernetes.io/healthcheck-path | ALB의 헬스체크 경로 지정 (기본: /) |
alb.ingress.kubernetes.io/listen-ports | ALB의 리스너 포트 JSON 형식 (기본: 80) |
alb.ingress.kubernetes.io/certificate-arn | HTTPS(443) 리스너 사용 시 ACM 인증서 ARN |
alb.ingress.kubernetes.io/load-balancer-name | 생성되는 ALB의 이름 지정 (없으면 자동 생성됨) |
참고
728x90
반응형
'DevOps > K8s' 카테고리의 다른 글
[EKS] Pod Identity 활성화 및 적용 (1) | 2025.04.17 |
---|---|
[K8s] 쿠버네티스 livenessProbe로 파드 헬스 체크 (0) | 2023.02.14 |
[K8s] 쿠버네티스 Service 개념 (0) | 2022.12.30 |
[K8s] 쿠버네티스 Deployment를 이용한 RollingUpdate (0) | 2022.12.27 |
[K8s] 쿠버네티스 Deployment의 개념 (2) | 2022.12.22 |