Gom3rye

팀 프로젝트) Terraform EKS - 3개 클러스터 통합 관리 (VPC 공유) 본문

현대 오토에버 클라우드 스쿨

팀 프로젝트) Terraform EKS - 3개 클러스터 통합 관리 (VPC 공유)

Gom3rye 2025. 11. 11. 10:02
728x90
반응형

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. 테라폼 설치

  1. 다운로드: HashiCorp 공식 다운로드 페이지에서 본인 OS(Windows, macOS, Linux)에 맞는 파일을 다운로드한다.
  2. 설치:
    • 다운로드한 파일은 .zip 압축 파일이다.
    • 압축을 풀면 terraform.exe (Windows) 또는 terraform (macOS/Linux) 실행 파일 하나가 나온다.
    • eksctl을 설치하고 **환경 변수(Path)**에 경로를 추가했던 것과 똑같이, 이 파일을 원하는 폴더(예: C:\Terraform)에 옮기고 해당 폴더 경로를 시스템 환경 변수 Path에 추가한다.
  3. 설치 확인: 터미널(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

쿠버네티스 클러스터와 통신하기 위한 명령줄 도구이다.


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_arniam_*.tf에서 만든 고유한 역할을, subnet_idsvpc.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 폴더의 터미널에서 아래 명령어들을 차례로 실행한다.

  1. terraform init (초기화) 테라폼이 provider.tf 파일을 읽고 필요한 aws 프로바이더와 kubernetes 프로바이더 플러그인을 다운로드한다. (폴더당 최초 1회만 실행)

📌 [중요] 처음 테라폼 실행 시 aws-auth.tf 파일은 빼주어야 한다. 아직 접속할 클러스터가 없기 때문에 kubernetes 프로바이더가 인증을 시도하다 에러가 발생하기 때문이다.

  1. aws-auth.tf 파일명을 aws-auth.tf.bak 등으로 임시 변경한다.
  2. terraform init, plan, apply를 진행하여 EKS 클러스터를 생성한다.
  3. apply 완료 후 7. 클러스터 접속을 진행하여 kubeconfig에 클러스터 정보를 등록한다. (이 과정이 있어야 kubernetes 프로바이더가 정상 동작한다.)
  4. aws-auth.tf.bak 파일명을 다시 aws-auth.tf로 변경한다.
  5. 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에서 다음을 수행해야 한다.

  1. AWS CLI 설치 및 본인 IAM 사용자로 aws configure --profile [본인프로필] 설정.
  2. kubectl 설치.
  3. (중요) 관리자에게 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
 
728x90
반응형