지원 버전: Kubernetes 1.31, 1.32, 1.33 마지막 업데이트: 2026년 2월 23일
프로덕션 Terraform 프로젝트 구조
Terraform은 인프라를 코드로 정의하고, 프로비저닝하며, 관리할 수 있는 도구로 EKS 클러스터를 반복 가능하고 버전 관리되는 방식으로 배포할 수 있습니다. 이 가이드에서는 AWS 프로바이더 ~> 6.0과 커뮤니티 EKS 모듈 ~> 21.0을 사용하며, Auto Mode, Hybrid Nodes, Pod Identity, API 기반 Access Entry 등 최신 EKS 기능을 지원합니다.
프로덕션 환경에서 단일 Terraform 디렉토리에 하나의 상태 파일을 사용하면 문제가 발생합니다. VPC 변경이 실수로 클러스터를 삭제할 수 있고, 프로젝트가 커질수록 terraform plan이 느려지며, 서로 다른 팀이 독립적으로 작업할 수 없습니다. 멀티 레이어 아키텍처는 변경 빈도와 소유권에 따라 인프라를 별도의 상태 파일로 분리하여 이러한 문제를 해결합니다.
각 레이어는 자체 S3 상태 파일을 가지며 독립적으로 plan/apply 할 수 있습니다. 03-platform에서 애드온을 변경해도 VPC나 클러스터 자체에 영향을 주지 않습니다.
공유 S3 백엔드
모든 레이어는 DynamoDB 잠금이 있는 단일 S3 버킷을 공유하지만, 각 레이어는 서로 다른 상태 키에 기록합니다:
레이어 간 참조는 terraform_remote_state 데이터 소스를 통해 이루어지며, 이는 다른 레이어의 상태 파일에서 출력을 읽어 Terraform 코드 자체에 대한 의존성 없이 연결합니다.
레이어 1: 네트워크 (01-network)
이 레이어는 VPC, 서브넷, NAT 게이트웨이 및 모든 네트워킹 전제 조건을 프로비저닝합니다. 변경이 드물며 일반적으로 인프라 팀이 소유합니다.
01-network/providers.tf
01-network/backend.tf
01-network/variables.tf
01-network/main.tf
참고: EKS 모듈 ~> 21.0과 AWS Load Balancer Controller를 사용할 때 서브넷에 kubernetes.io/cluster/<cluster-name> 태그는 더 이상 필요하지 않습니다. kubernetes.io/role/elb 및 kubernetes.io/role/internal-elb 태그만으로 서브넷 검색이 가능합니다.
01-network/outputs.tf
레이어 2: EKS 클러스터 (02-cluster)
이 레이어는 EKS 클러스터, 관리형 노드 그룹, 코어 애드온을 프로비저닝합니다. terraform_remote_state를 통해 레이어 1의 네트워크 정보를 읽어옵니다.
02-cluster/providers.tf
02-cluster/backend.tf
02-cluster/data.tf
02-cluster/variables.tf
02-cluster/main.tf
02-cluster/outputs.tf
레이어 3: 플랫폼 구성 (03-platform)
이 레이어는 코어 세트 이외의 애드온, Pod Identity 연결, 액세스 엔트리를 관리합니다. 가장 자주 변경되며 클러스터나 네트워크에 영향을 주지 않고 독립적으로 적용할 수 있습니다.
03-platform/providers.tf
03-platform/backend.tf
03-platform/data.tf
03-platform/variables.tf
03-platform/addons.tf
03-platform/pod-identity.tf
03-platform/access-entries.tf
EKS Pod Identity 구성
EKS Pod Identity는 Kubernetes 워크로드에 AWS 권한을 부여하는 권장 방식입니다. IAM Roles for Service Accounts(IRSA)를 대체하며 OIDC 프로바이더가 필요하지 않습니다.
Pod Identity 동작 방식
eks-pod-identity-agent 애드온이 모든 노드에서 DaemonSet으로 실행됩니다 (레이어 2에서 설치).
Pod Identity 트러스트 정책이 포함된 IAM 역할이 생성됩니다 (레이어 3에서 생성).
aws_eks_pod_identity_association을 통해 IAM 역할이 Kubernetes 서비스 어카운트와 연결됩니다.
해당 서비스 어카운트를 사용하는 파드는 자동으로 임시 AWS 자격 증명을 받습니다.
위의 03-platform/pod-identity.tf에 표시된 Pod Identity 리소스가 이 패턴을 따릅니다. IAM 역할의 트러스트 정책은 pods.eks.amazonaws.com을 보안 주체로 사용하며, sts:TagSession은 클러스터, 네임스페이스, 서비스 어카운트 메타데이터를 사용한 자동 세션 태깅을 활성화합니다.
Pod Identity vs IRSA 비교
기능
Pod Identity
IRSA
OIDC 프로바이더 필요
아니오
예
크로스 어카운트 지원
sts:TagSession으로 내장 지원
어카운트별 OIDC 트러스트 필요
설정 복잡도
낮음 — 단일 연결
보통 — OIDC, 역할, 어노테이션
세션 태그
자동 (클러스터, 네임스페이스, SA)
지원하지 않음
재사용성
동일 역할을 여러 클러스터에서 사용
클러스터 OIDC당 하나의 역할
권장 사항: 모든 새 워크로드에는 Pod Identity를 사용하세요. IRSA는 하위 호환성을 위해 계속 지원됩니다.
EKS Auto Mode 클러스터
EKS Auto Mode는 노드 프로비저닝, 스케일링, OS 관리를 AWS에 완전히 위임합니다. 관리형 노드 그룹을 정의할 필요가 없으며 EKS가 자동으로 컴퓨팅을 프로비저닝하고 관리합니다. Auto Mode를 사용할 때는 표준 02-cluster/main.tf를 다음 변형으로 대체합니다:
핵심 사항
**cluster_compute_config.enabled = true**로 Auto Mode를 활성화합니다.
**node_pools**는 활성화할 내장 노드 풀을 지정합니다 (general-purpose, system).
**bootstrap_self_managed_addons = false**로 충돌을 방지합니다 — Auto Mode가 코어 애드온(CoreDNS, kube-proxy, VPC CNI)을 자동으로 관리합니다.
Auto Mode 사용 시 eks_managed_node_groups를 정의하지 않습니다.
Auto Mode는 노드 풀에서 EC2 인스턴스를 프로비저닝하고 OS 패치, 스케일링, 라이프사이클을 처리합니다.
EKS Hybrid Nodes 구성
EKS Hybrid Nodes를 사용하면 온프레미스 또는 엣지 서버를 EKS 클러스터의 워커 노드로 참여시킬 수 있으며, EKS 컨트롤 플레인은 AWS에 유지됩니다. Hybrid Nodes를 사용할 때는 표준 02-cluster/main.tf를 다음 변형으로 대체합니다:
핵심 사항
**remote_network_config**는 온프레미스 노드와 파드의 CIDR 범위를 정의합니다.
Hybrid 노드는 HYBRID_LINUX 유형의 액세스 엔트리가 있는 IAM 역할을 통해 인증합니다.
보안 그룹 규칙에서 온프레미스 CIDR에서 EKS API 서버(443) 및 kubelet(10250)으로의 트래픽을 허용해야 합니다.
Hybrid 노드에서는 VPC CNI가 사용되지 않으므로 온프레미스 측에서 대체 CNI(예: Cilium)를 구성해야 합니다.
Add-on 관리
EKS 애드온은 클러스터에서 실행되는 관리형 컴포넌트입니다. 멀티 레이어 아키텍처에서 코어 애드온(coredns, vpc-cni, kube-proxy, eks-pod-identity-agent)은 클러스터 동작에 필수적이므로 02-cluster에 정의하고, 추가 애드온(EBS CSI 등)은 03-platform에서 관리합니다.
주요 옵션
옵션
설명
most_recent
클러스터의 Kubernetes 버전과 호환되는 최신 버전을 항상 사용합니다.
before_compute
노드 그룹 프로비저닝 전에 애드온을 설치합니다. vpc-cni와 eks-pod-identity-agent에서 노드가 올바르게 시작되도록 필요합니다.
configuration_values
애드온별 설정의 JSON 문자열입니다 (예: VPC CNI 프리픽스 위임).
service_account_role_arn
AWS API 접근이 필요한 애드온의 IAM 역할 ARN입니다 (예: EBS CSI 드라이버). IRSA와 Pod Identity 모두 지원합니다.
resolve_conflicts_on_create
마이그레이션 중 기존 자체 관리 버전을 교체하려면 "OVERWRITE"로 설정합니다.
resolve_conflicts_on_update
충돌하는 애드온 구성을 강제 업데이트하려면 "OVERWRITE"로 설정합니다.
Add-on의 Pod Identity
일부 애드온은 Pod Identity 연결을 직접 지원합니다. 03-platform/addons.tf의 EBS CSI 드라이버 구성이 pod_identity_association을 사용하는 패턴을 보여줍니다:
Access Entry 기반 접근 제어
EKS는 레거시 aws-auth ConfigMap을 대체하는 Access Entry를 통한 API 기반 인증을 지원합니다. 멀티 레이어 아키텍처에서 초기 클러스터 관리자 접근은 02-cluster에서 (enable_cluster_creator_admin_permissions를 통해) 구성하고, 개발자와 뷰어를 위한 추가 액세스 엔트리는 03-platform/access-entries.tf에서 관리합니다.
인증 모드
모드
설명
API
Access Entry만 사용 (신규 클러스터에 권장).
API_AND_CONFIG_MAP
Access Entry와 aws-auth ConfigMap 모두 사용 (마이그레이션 기간).
# 레이어 1: 네트워크
cd eks-terraform/01-network
terraform init
terraform plan
terraform apply
# 레이어 2: 클러스터
cd ../02-cluster
terraform init
terraform plan
terraform apply
# 레이어 3: 플랫폼
cd ../03-platform
terraform init
terraform plan
terraform apply
# 노드 상태 확인
kubectl get nodes
# 시스템 파드 확인
kubectl get pods -n kube-system
# EKS 애드온 확인
kubectl get daemonsets -n kube-system
NAME STATUS ROLES AGE VERSION
ip-10-0-1-xxx.ap-northeast-2... Ready <none> 5m v1.33.x
ip-10-0-2-xxx.ap-northeast-2... Ready <none> 5m v1.33.x
# 레이어 3: 플랫폼
cd eks-terraform/03-platform
terraform destroy
# 레이어 2: 클러스터
cd ../02-cluster
terraform destroy
# 레이어 1: 네트워크
cd ../01-network
terraform destroy