Gom3rye
팀 프로젝트) Terraform EKS - 3개 클러스터 통합 관리 (VPC 공유) 본문
1. 테라폼(Terraform)이란?
테라폼은 "코드로 인프라를 관리(Infrastructure as Code, IaC)"하게 해주는 도구이다.
- 선언형 언어: eksctl처럼 "클러스터를 만들어 줘"라는 명령을 내리는 것이 아니라, "나는 VPC 1개, 서브넷 3개, EKS 클러스터 1개가 필요해."라고 원하는 상태를 코드(.tf 파일)로 선언한다.
- 실행 계획: terraform plan 명령을 실행하면, 테라폼이 현재 인프라 상태와 코드를 비교해서 "VPC를 새로 만들어야겠네. 서브넷도 3개 만들어야겠다."처럼 변경 계획을 보여준다.
- 상태 관리: terraform apply로 계획을 실행하면, 테라폼이 실제로 AWS에 리소스를 생성하고, 생성된 리소스의 정보를 terraform.tfstate라는 파일에 저장한다. 이 덕분에 나중에 코드를 변경해도 무엇이 바뀌어야 하는지 정확히 알 수 있다.
eksctl이나 CloudFormation과 비교하면, 테라폼은 AWS뿐만 아니라 GCP, Azure 등 다양한 클라우드 제공자를 하나의 언어로 관리할 수 있고, 코드를 재사용하거나 모듈화하기에 더 유용하다.
2. 테라폼 설치
- 다운로드: HashiCorp 공식 다운로드 페이지에서 본인 OS(Windows, macOS, Linux)에 맞는 파일을 다운로드한다.
- 설치:
- 다운로드한 파일은 .zip 압축 파일이다.
- 압축을 풀면 terraform.exe (Windows) 또는 terraform (macOS/Linux) 실행 파일 하나가 나온다.
- eksctl을 설치하고 **환경 변수(Path)**에 경로를 추가했던 것과 똑같이, 이 파일을 원하는 폴더(예: C:\Terraform)에 옮기고 해당 폴더 경로를 시스템 환경 변수 Path에 추가한다.
- 설치 확인: 터미널(CMD 또는 PowerShell)을 새로 열고 아래 명령어를 입력한다. 버전 정보가 나오면 성공이다.
c:\Terraform>terraform --version
Terraform v1.13.4
on windows_386
3. 사전 준비 (AWS 자격증명)
(1) IAM 사용자 생성 및 액세스키 발급
IAM 정책(all) 생성
IAM - 정책 - 정책 생성 - JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect" : "Allow",
"Action": [
"*"
],
"Resource": [
"*"
]
}
]
}
IAM 사용자에 정책연결
권한 설정 : 직접 정책 연결 이전에 만든 all 권한을 설정해준다.
사용자에게 액세스키 발급
사용자 JWON - 보안자격 증명 - 액세스 키 만들기 - AWS 외부에서 실행되는 애플리케이션 - 액세스키 만들기
액세스 키가 만들어지면 따로 저장해놓아야 한다.
(2) AWS CLI
AWS 리소스를 관리하기 위한 명령줄 도구이다.
- 설치 확인:
-
c:\Terraform>aws --version aws-cli/2.27.58 Python/3.13.4 Windows/11 exe/AMD64
-
- aws configure
- IAM의 사용자의 access-key 와 secret access-key를 설정해야 한다.
- aws configure --profile=JWON
- 사용자 생성 시 발급받은 액세스 키를 넣어주면 된다.
AWS Access Key ID [None] : ...
AWS Secret Access Key [None] : ...
Default region name [None] : ap-northeast-2
Default output format [None] : json
- 프로필 확인 : aws configure list-profiles
- JWON 로 생성된 것을 확인 가능하다.
(3) kubectl
쿠버네티스 클러스터와 통신하기 위한 명령줄 도구이다.
- 다운로드: curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.31.0/2024-09- 12/bin/darwin/amd64/kubectl
- 설치 확인: kubectl version --client
4. 🚀 프로젝트 구조: 3개 EKS 클러스터 통합 관리
이전에는 3개의 클러스터(datacenter, kafka, monitoring)를 생성하기 위해 3개의 개별 폴더에서 각각 terraform apply를 실행하는 방식을 사용했다.
이번에 수정된 구조(solog-terraform-unified)는 단일 테라폼 프로젝트에서 3개의 EKS 클러스터를 동시에 관리하는 방식이다.
- VPC 공유 (비용 절감): vpc.tf 파일 하나가 1개의 VPC와 2개의 공용 서브넷을 생성한다. 3개의 모든 클러스터가 이 공유된 네트워크 자원을 함께 사용한다.
- 파일 분리 (가독성): 각 클러스터에 필요한 EKS, IAM 리소스는 eks_datacenter.tf, iam_datacenter.tf처럼 기능별/클러스터별 파일로 분리하여 관리가 용이하다.
- 통합 실행 (효율성): terraform apply 단 한 번의 실행으로 3개 클러스터와 모든 부속 자원(VPC, IAM 역할 등)이 동시에 생성, 수정, 삭제된다.
5. 테라폼 코드로 EKS 클러스터 3개 동시 구축하기
solog-terraform-unified 폴더 내의 각 파일은 다음과 같은 역할을 수행한다.
(1) provider.tf : 테라폼 설정 (AWS + Kubernetes)
테라폼이 AWS와 통신하고, 추가로 생성될 EKS 클러스터 내부(aws-auth 수정)와도 통신할 수 있도록 설정한다.
- kubernetes 프로바이더: aws-auth.tf에서 클러스터 내부의 ConfigMap을 수정하기 위해 필요하다.
- alias (별명): 3개의 클러스터에 각각 접속해야 하므로, datacenter, kafka, monitoring이라는 별명을 부여하여 테라폼이 어떤 클러스터에 명령을 내려야 할지 구분할 수 있게 한다.
# provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.20"
}
}
}
# AWS 프로바이더 설정
provider "aws" {
region = "ap-northeast-2"
profile = "JWON"
}
# 2. Kubernetes 프로바이더 (클러스터 "내부" 관리용)
# --- 3개 클러스터에 대한 접속 정보를 각각 정의 ---
# 2-1. DataCenter 클러스터 접속 정보
data "aws_eks_cluster" "datacenter" {
name = aws_eks_cluster.datacenter_cluster.name
}
data "aws_eks_cluster_auth" "datacenter" {
name = aws_eks_cluster.datacenter_cluster.name
}
provider "kubernetes" {
alias = "datacenter" # "datacenter" 라는 별명 부여
host = data.aws_eks_cluster.datacenter.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.datacenter.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.datacenter.token
}
# 2-2. Kafka 클러스터 접속 정보
data "aws_eks_cluster" "kafka" {
name = aws_eks_cluster.kafka_cluster.name
}
data "aws_eks_cluster_auth" "kafka" {
name = aws_eks_cluster.kafka_cluster.name
}
provider "kubernetes" {
alias = "kafka"
host = data.aws_eks_cluster.kafka.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.kafka.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.kafka.token
}
# 2-3. Monitoring 클러스터 접속 정보
data "aws_eks_cluster" "monitoring" {
name = aws_eks_cluster.monitoring_cluster.name
}
data "aws_eks_cluster_auth" "monitoring" {
name = aws_eks_cluster.monitoring_cluster.name
}
provider "kubernetes" {
alias = "monitoring"
host = data.aws_eks_cluster.monitoring.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.monitoring.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.monitoring.token
}
(2) vpc.tf : 공유 VPC 및 서브넷
3개의 클러스터가 공동으로 사용할 단일 VPC와 서브넷 2개(가용 영역 2a, 2c)를 생성한다.
- kubernetes.io/cluster/... 태그: EKS가 이 서브넷들을 컨트롤 플레인(ELB 등)이나 워커 노드용으로 인식할 수 있도록 3개 클러스터의 이름을 모두 shared로 태그하는 것이 매우 중요하다.
# vpc.tf
# [비용 절감형] 1개 VPC, 2개 AZ, 2개 서브넷으로 3개 클러스터 모두 공유
# 1. VPC 생성
resource "aws_vpc" "solog_vpc" {
cidr_block = "192.168.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "solog-unified-vpc"
}
}
# 2. 퍼블릭 서브넷 "2개" 생성 (2개 AZ)
resource "aws_subnet" "solog_public_subnets" {
count = 2
vpc_id = aws_vpc.solog_vpc.id
availability_zone = ["ap-northeast-2a", "ap-northeast-2c"][count.index]
cidr_block = "192.168.${count.index}.0/24"
map_public_ip_on_launch = true
tags = {
Name = "solog-unified-public-subnet-${count.index + 1}"
# 3개 클러스터 이름을 모두 태그
"kubernetes.io/cluster/eks-datacenter-cluster" = "shared"
"kubernetes.io/cluster/eks-kafka-cluster" = "shared"
"kubernetes.io/cluster/eks-monitoring-cluster" = "shared"
}
}
# 3. 인터넷 게이트웨이 생성
resource "aws_internet_gateway" "solog_igw" {
vpc_id = aws_vpc.solog_vpc.id
tags = {
Name = "solog-unified-igw"
}
}
# 4. 라우트 테이블 (Public) 생성
resource "aws_route_table" "solog_public_rt" {
vpc_id = aws_vpc.solog_vpc.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.solog_igw.id
}
tags = {
Name = "solog-unified-public-rt"
}
}
# 5. 서브넷 2개를 라우트 테이블에 연결
resource "aws_route_table_association" "solog_public_rta" {
count = 2
subnet_id = aws_subnet.solog_public_subnets[count.index].id
route_table_id = aws_route_table.solog_public_rt.id
}
(3) iam_*.tf : 클러스터별 IAM 역할
3개의 클러스터는 VPC를 공유하더라도, 각자 고유한 IAM 역할(클러스터용, 노드용)이 필요하다. iam_datacenter.tf, iam_kafka.tf, iam_monitoring.tf 3개 파일로 분리하여 각 클러스터에 필요한 역할을 정의한다.
(예시: iam_datacenter.tf - kafka, monitoring 파일도 동일한 구조로 이름만 변경)
# iam_datacenter.tf
# 1. DataCenter EKS 클러스터(컨트롤 플레인)를 위한 IAM 역할
resource "aws_iam_role" "eks_datacenter_cluster_role" {
name = "eks-datacenter-cluster-role" # 고유 이름
# EKS 서비스가 이 역할을 맡을 수 있도록 허용
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = { Service = "eks.amazonaws.com" },
Action = "sts:AssumeRole"
}
]
})
}
# EKS 클러스터 역할에 필요한 정책 연결
resource "aws_iam_role_policy_attachment" "cluster_policy_attachment_datacenter" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
role = aws_iam_role.eks_datacenter_cluster_role.name
}
# 2. DataCenter 워커 노드(EC2 인스턴스)를 위한 IAM 역할
resource "aws_iam_role" "eks_datacenter_node_role" {
name = "eks-datacenter-node-role" # 고유 이름
# EC2 인스턴스가 이 역할을 맡을 수 있도록 허용
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = { Service = "ec2.amazonaws.com" },
Action = "sts:AssumeRole"
}
]
})
}
# 워커 노드 역할에 필요한 3가지 기본 정책 연결
resource "aws_iam_role_policy_attachment" "node_policy_attachment_worker_datacenter" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
role = aws_iam_role.eks_datacenter_node_role.name
}
resource "aws_iam_role_policy_attachment" "node_policy_attachment_cni_datacenter" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
role = aws_iam_role.eks_datacenter_node_role.name
}
resource "aws_iam_role_policy_attachment" "node_policy_attachment_ecr_datacenter" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
role = aws_iam_role.eks_datacenter_node_role.name
}
(4) eks_*.tf : 클러스터별 EKS 정의
각 클러스터의 컨트롤 플레인(aws_eks_cluster)과 노드 그룹(aws_eks_node_group)을 정의한다. role_arn은 iam_*.tf에서 만든 고유한 역할을, subnet_ids는 vpc.tf에서 만든 공유 서브넷을 참조한다.
(예시: eks_datacenter.tf - eks_kafka.tf, eks_monitoring.tf 파일도 동일한 패턴으로 생성한다.)
# eks_datacenter.tf
# 1. EKS 클러스터(컨트롤 플레인) 생성
resource "aws_eks_cluster" "datacenter_cluster" {
name = "eks-datacenter-cluster"
version = "1.30"
role_arn = aws_iam_role.eks_datacenter_cluster_role.arn
# 클러스터가 사용할 VPC 및 서브넷 정보 (공유 서브넷 참조)
vpc_config {
subnet_ids = [for s in aws_subnet.solog_public_subnets : s.id]
}
depends_on = [
aws_iam_role_policy_attachment.cluster_policy_attachment_datacenter,
aws_vpc.solog_vpc,
]
}
# 2. EKS 노드 그룹 생성
resource "aws_eks_node_group" "datacenter_nodegroup" {
cluster_name = aws_eks_cluster.datacenter_cluster.name
node_group_name = "eks-datacenter-nodegroup"
node_role_arn = aws_iam_role.eks_datacenter_node_role.arn
subnet_ids = [for s in aws_subnet.solog_public_subnets : s.id]
instance_types = ["t3.medium"]
scaling_config {
desired_size = 2
min_size = 2
max_size = 5
}
depends_on = [
aws_iam_role_policy_attachment.node_policy_attachment_worker_datacenter,
aws_iam_role_policy_attachment.node_policy_attachment_cni_datacenter,
aws_iam_role_policy_attachment.node_policy_attachment_ecr_datacenter,
]
}
(5) aws-auth.tf : 3개 클러스터 팀원 권한 동시 설정
EKS 클러스터 생성자 외의 다른 팀원(IAM 사용자)이 kubectl로 클러스터에 접속할 수 있도록 aws-auth ConfigMap에 등록해주는 파일이다.
- locals: 권한을 부여할 팀원 목록을 정의한다. 이 목록은 3개 클러스터가 공유한다.
- provider = kubernetes.*: provider.tf에서 정의한 **별명(alias)**을 사용하여, 테라폼이 어떤 클러스터의 aws-auth를 수정할지 정확히 지정한다. (예: provider = kubernetes.datacenter)
# aws-auth.tf
# 1. 팀원 목록을 정의합니다. (이 목록은 3개 클러스터가 공유)
locals {
map_users = [
{
userarn = "arn:aws:iam::484400672545:user/MJ"
username = "MJ"
groups = ["system:masters"] # 관리자 권한
},
{
userarn = "arn:aws:iam::484400672545:user/JWOO"
username = "JWOO"
groups = ["system:masters"]
},
{
userarn = "arn:aws:iam::484400672545:user/JJ"
username = "JJ"
groups = ["system:masters"]
}
# ... 팀원 추가 ...
]
}
# --- 2. DataCenter 클러스터 권한 설정 ---
# 2-1. DataCenter 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data "kubernetes_config_map" "aws_auth_datacenter" {
provider = kubernetes.datacenter # DataCenter 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
}
# 2-2. DataCenter 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource "kubernetes_config_map_v1_data" "aws_auth_patch_datacenter" {
provider = kubernetes.datacenter # DataCenter 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
"mapUsers" = yamlencode(concat(
try(yamldecode(data.kubernetes_config_map.aws_auth_datacenter.data.mapUsers), []),
local.map_users
))
}
depends_on = [
aws_eks_node_group.datacenter_nodegroup
]
}
# --- 3. Kafka 클러스터 권한 설정 ---
# 3-1. Kafka 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data "kubernetes_config_map" "aws_auth_kafka" {
provider = kubernetes.kafka # Kafka 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
}
# 3-2. Kafka 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource "kubernetes_config_map_v1_data" "aws_auth_patch_kafka" {
provider = kubernetes.kafka # Kafka 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
"mapUsers" = yamlencode(concat(
try(yamldecode(data.kubernetes_config_map.aws_auth_kafka.data.mapUsers), []),
local.map_users
))
}
depends_on = [
aws_eks_node_group.kafka_nodegroup
]
}
# --- 4. Monitoring 클러스터 권한 설정 ---
# 4-1. Monitoring 클러스터의 'aws-auth' ConfigMap을 읽어옵니다.
data "kubernetes_config_map" "aws_auth_monitoring" {
provider = kubernetes.monitoring # Monitoring 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
}
# 4-2. Monitoring 클러스터의 'aws-auth'를 수정(Patch)합니다.
resource "kubernetes_config_map_v1_data" "aws_auth_patch_monitoring" {
provider = kubernetes.monitoring # Monitoring 클러스터에 접속
metadata {
name = "aws-auth"
namespace = "kube-system"
}
data = {
"mapUsers" = yamlencode(concat(
try(yamldecode(data.kubernetes_config_map.aws_auth_monitoring.data.mapUsers), []),
local.map_users
))
}
depends_on = [
aws_eks_node_group.monitoring_nodegroup
]
}
(6) outputs.tf : 3개 클러스터 접속 정보 출력
terraform apply 완료 후, 터미널에 3개 클러스터 각각의 이름, 엔드포인트, kubeconfig 업데이트 명령어를 출력한다.
# outputs.tf
# --- 1. DataCenter 클러스터 ---
output "datacenter_cluster_name" {
description = "DataCenter EKS 클러스터 이름"
value = aws_eks_cluster.datacenter_cluster.name
}
output "datacenter_cluster_endpoint" {
description = "DataCenter EKS 클러스터 엔드포인트 URL"
value = aws_eks_cluster.datacenter_cluster.endpoint
}
output "datacenter_kubeconfig_command" {
description = "DataCenter 클러스터 접속을 위한 kubeconfig 업데이트 명령어"
value = "aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.datacenter_cluster.name} --profile JWON"
}
# --- 2. Kafka 클러스터 ---
output "kafka_cluster_name" {
description = "Kafka EKS 클러스터 이름"
value = aws_eks_cluster.kafka_cluster.name
}
output "kafka_cluster_endpoint" {
description = "Kafka EKS 클러스터 엔드포인트 URL"
value = aws_eks_cluster.kafka_cluster.endpoint
}
output "kafka_kubeconfig_command" {
description = "Kafka 클러스터 접속을 위한 kubeconfig 업데이트 명령어"
value = "aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.kafka_cluster.name} --profile JWON"
}
# --- 3. Monitoring 클러스터 ---
output "monitoring_cluster_name" {
description = "Monitoring EKS 클러스터 이름"
value = aws_eks_cluster.monitoring_cluster.name
}
output "monitoring_cluster_endpoint" {
description = "Monitoring EKS 클러스터 엔드포인트 URL"
value = aws_eks_cluster.monitoring_cluster.endpoint
}
output "monitoring_kubeconfig_command" {
description = "Monitoring 클러스터 접속을 위한 kubeconfig 업데이트 명령어"
value = "aws eks update-kubeconfig --region ap-northeast-2 --name ${aws_eks_cluster.monitoring_cluster.name} --profile JWON"
}
6. 테라폼 실행 (클러스터 3개 동시 생성)
solog-terraform-unified 폴더의 터미널에서 아래 명령어들을 차례로 실행한다.
- terraform init (초기화) 테라폼이 provider.tf 파일을 읽고 필요한 aws 프로바이더와 kubernetes 프로바이더 플러그인을 다운로드한다. (폴더당 최초 1회만 실행)
📌 [중요] 처음 테라폼 실행 시 aws-auth.tf 파일은 빼주어야 한다. 아직 접속할 클러스터가 없기 때문에 kubernetes 프로바이더가 인증을 시도하다 에러가 발생하기 때문이다.
- aws-auth.tf 파일명을 aws-auth.tf.bak 등으로 임시 변경한다.
- terraform init, plan, apply를 진행하여 EKS 클러스터를 생성한다.
- apply 완료 후 7. 클러스터 접속을 진행하여 kubeconfig에 클러스터 정보를 등록한다. (이 과정이 있어야 kubernetes 프로바이더가 정상 동작한다.)
- aws-auth.tf.bak 파일명을 다시 aws-auth.tf로 변경한다.
- terraform apply를 한 번 더 실행하면 aws-auth 관련 변경 사항(팀원 권한)만 추가로 반영된다.
$ terraform init
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Finding hashicorp/kubernetes versions matching "~> 2.20"...
...
Terraform has been successfully initialized!
2. terraform plan (실행 계획) 테라폼이 모든 .tf 코드를 읽고 AWS에 "무엇을" 만들지 미리보기로 보여준다. (실제 생성 X) 공유 VPC 관련 리소스 + 3개 클러스터의 IAM 역할 + 3개 EKS 클러스터 + 3개 노드 그룹 등 수십 개의 리소스가 목록에 나타난다.
$ terraform plan
...
Plan: 50 to add, 0 to change, 0 to destroy. # (리소스 개수는 예시)
...
3. terraform apply (적용) 실행 계획을 확인한 후, 실제로 모든 리소스를 생성한다. 3개의 클러스터가 동시에 생성되므로 15~20분 이상 소요될 수 있다.
$ terraform apply
...
Plan: 50 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Only 'yes' will be accepted to approve.
Enter a value: yes <-- "yes"를 직접 입력하고 엔터
...
aws_eks_cluster.datacenter_cluster: Creating...
aws_eks_cluster.kafka_cluster: Creating...
aws_eks_cluster.monitoring_cluster: Creating...
...
Apply complete! Resources: 50 added, 0 changed, 0 destroyed.
Outputs:
datacenter_cluster_endpoint = "https://<...>.eks.amazonaws.com"
datacenter_cluster_name = "eks-datacenter-cluster"
datacenter_kubeconfig_command = "aws eks update-kubeconfig ... --name eks-datacenter-cluster --profile JWON"
kafka_cluster_endpoint = "https://<...>.eks.amazonaws.com"
kafka_cluster_name = "eks-kafka-cluster"
kafka_kubeconfig_command = "aws eks update-kubeconfig ... --name eks-kafka-cluster --profile JWON"
monitoring_cluster_endpoint = "https://<...>.eks.amazonaws.com"
monitoring_cluster_name = "eks-monitoring-cluster"
monitoring_kubeconfig_command = "aws eks update-kubeconfig ... --name eks-monitoring-cluster --profile JWON"
7. 클러스터 접속 (kubeconfig 설정)
테라폼은 ~/.kube/config 파일을 자동으로 업데이트하지 않는다.
terraform apply 완료 후 출력(Outputs)된 3개의 kubeconfig_command 값을 복사해서 터미널에 각각 붙여넣고 실행해야 한다.
# 1. DataCenter 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-datacenter-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-datacenter-cluster to C:\Users\...\.kube\config
# 2. Kafka 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-kafka-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-kafka-cluster to C:\Users\...\.kube\config
# 3. Monitoring 클러스터 접속 정보 추가
$ aws eks update-kubeconfig --region ap-northeast-2 --name eks-monitoring-cluster --profile JWON
Added new context arn:aws:eks:ap-northeast-2:ACCOUNT_ID:cluster/eks-monitoring-cluster to C:\Users\...\.kube\config
이제 kubectl로 3개 클러스터에 모두 접속되는지 확인한다.
# 1. 컨텍스트 목록 확인 (3개 클러스터가 모두 보여야 함)
$ kubectl config get-contexts
CURRENT NAME CLUSTER ...
arn:aws:eks:...:cluster/eks-datacenter-cluster arn:aws:eks:...:cluster/eks-datacenter-cluster
arn:aws:eks:...:cluster/eks-kafka-cluster arn:aws:eks:...:cluster/eks-kafka-cluster
* arn:aws:eks:...:cluster/eks-monitoring-cluster arn:aws:eks:...:cluster/eks-monitoring-cluster
# 2. 현재 활성 클러스터(monitoring) 노드 조회
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-0-10.ap-northeast-2.compute.internal Ready <none> 2m v1.30...
ip-192-168-1-20.ap-northeast-2.compute.internal Ready <none> 2m v1.30...
# 3. 다른 클러스터(예: kafka)로 컨텍스트 변경
$ kubectl config use-context arn:aws:eks:...:cluster/eks-kafka-cluster
Switched to context "arn:aws:eks:...:cluster/eks-kafka-cluster".
# 4. Kafka 클러스터 노드 조회
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-0-30.ap-northeast-2.compute.internal Ready <none> 3m v1.30...
ip-192-168-1-40.ap-northeast-2.compute.internal Ready <none> 3m v1.30...
팀원들이 해야 할 일 (권한 부여 후)
관리자가 aws-auth.tf를 포함하여 terraform apply를 완료했다면, 팀원들은 각자 PC에서 다음을 수행해야 한다.
- AWS CLI 설치 및 본인 IAM 사용자로 aws configure --profile [본인프로필] 설정.
- kubectl 설치.
- (중요) 관리자에게 3개 클러스터의 update-kubeconfig 명령어를 받아서 3개 모두 실행한다. (위 7번 항목과 동일)
default 에 액세스 키 넣어놨으면 --profile [각자 프로필] 이 부분 빼고 쳐도 돼요
aws eks update-kubeconfig --region ap-northeast-2 --name eks-datacenter-cluster --profile [각자 프로필]
aws eks update-kubeconfig --region ap-northeast-2 --name eks-kafka-cluster --profile [각자 프로필]
aws eks update-kubeconfig --region ap-northeast-2 --name eks-monitoring-cluster --profile [각자 프로필]
이제 팀원들도 kubectl로 3개 클러스터에 모두 접속할 수 있다.
8. 클러스터 삭제 (정리)
단일 프로젝트로 통합 관리할 때의 가장 큰 장점이다. terraform destroy 단 하나의 명령어로 3개의 EKS 클러스터, 3개의 노드 그룹, 공유 VPC, 모든 IAM 역할 등 생성했던 모든 리소스(50+개)를 한 번에 삭제한다.
$ terraform destroy
...
Plan: 0 to add, 0 to change, 50 to destroy.
...
Do you really want to destroy all resources?
Only 'yes' will be accepted to approve.
Enter a value: yes <-- "yes" 입력
...
aws_eks_node_group.datacenter_nodegroup: Destroying...
aws_eks_node_group.kafka_nodegroup: Destroying...
aws_eks_node_group.monitoring_nodegroup: Destroying...
...
Destroy complete! Resources: 50 destroyed.
kubectl config get-contexts 로 쓸데 없는 context 뜰 때 아래 명령어로 정리해주기
원래는 eks-datacenter-cluster, eks-kafka-cluster, eks-monitoring-cluster 3개만 있으면 됨
# 1. datacenter 컨텍스트 삭제
kubectl config delete-context arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter
# 2. datacenter 클러스터 정보 삭제
kubectl config delete-cluster arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter
# 3. datacenter 사용자 정보 삭제
kubectl config delete-user arn:aws:eks:ap-northeast-2:484400672545:cluster/datacenter
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
| 팀 프로젝트) (topic생성) MSK 테스트를 위한 bastion host EC2 만들기 (0) | 2025.11.11 |
|---|---|
| 팀 프로젝트) AWS MSK 구축하기 (feat. Terraform) (0) | 2025.11.11 |
| 팀 프로젝트) Grafana를 위한 AWS API Gateway, Lambda, SNS 설정 (0) | 2025.11.11 |
| 팀 프로젝트) Elastalert2를 위한 AWS API Gateway, Lambda, SNS 설정 (0) | 2025.11.11 |
| 팀 프로젝트) AWS Lambda 함수 (1) | 2025.11.11 |
