본문 바로가기
  • lakescript
스터디 이야기/AWS EKS

[AEWS] 1-3. terraform으로 EKS Cluster 배포하기

by lakescript 2024. 3. 7.

들어가며

eks cluster를 배포하는 방법에는 AWS managed console에서 직접 리소스를 클릭하면서 설정하여 배포하는 방법이 있고, eksctl, cloudformation, terraform 등의 방식이 있습니다. 이전 포스트에서 eksctl로 eks cluster를 배포하는 실습을 진행하였는데, 요즘 가장 많이 쓰는 IaC인 terraform을 통해 배포해보자! 싶은 생각이 들어 바로 진행해보았습니다.

 

terraform 설치

먼저 테라폼을 설치해보겠습니다.

 

Amazon Linux라는 전제하의 아래의 명령어로 설치해줍니다. 만약 다른 OS라면 공식문서를 참고해보세요!

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install terraform

 

terraform  버전 확인

terraform -version

 

 

그럼 이제 terraform으로 배포할 EKS Directory를 만들어 줍니다. (보통 terrafrom을 사용하는 이유는 Code로 Infra를 관리하기 위함인데, 그 기반으로 git을 사용합니다. 그렇기에 Directory 구조에 따라 활용성이 달라집니다. 하지만 저는 간단히 eks cluster를 배포하는 실습을 진행하는 것이기 때문에 eks-terraform 라는 directory에서 진행했습니다. )

 

main.tf 파일 작성

가장 중요한 main.tf 파일을 작성해보겠습니다. 이전에 EKS cluster를 배포하기 위해 먼저 배포하였던 AWS resource들은 따로 terraform으로 배포하지 않았습니다. (이것도 다음에 기회가 된다면 같이 해보겠습니다. 실제 업무에선 VPC, subnet, iam 등 AWS 서비스들을 배포하기전 먼저 설정되어있어야 할 리소스들에 대해서 module화 하여 배포하는 방식이 필요합니다.)

 

provider "aws" {
  region = "ap-northeast-2" # AWS 리전 설정
}

# 기존 VPC 참조
data "aws_vpc" "existing" {
  id = "vpc-0c5ba28eaab170b61" # 생성했던 VPC의 ID
}

# 기존 서브넷 참조
data "aws_subnet" "public_a" {
  id = "subnet-0163e311941a3afb3" # 생성했던 az-a의 public subnet ID
}

data "aws_subnet" "public_c" {
  id = "subnet-027a90e714d0e5c88" # 생성했던 az-c의 public subnet ID
}

# EKS 클러스터 생성
module "eks" {
  source          = "terraform-aws-modules/eks/aws"
  version         = "18.30.3"
  cluster_name    = "myeks" # eks cluster 이름
  cluster_version = "1.28" # eks cluster 버전
  vpc_id          = data.aws_vpc.existing.id
  cluster_endpoint_public_access = true # public access 허용
  subnet_ids = [data.aws_subnet.public_a.id, data.aws_subnet.public_c.id]

  eks_managed_node_groups = {
    first = {
      name = "myeks-nodegroup"
      desired_capacity = 2
      max_capacity     = 2
      min_capacity     = 2

      instance_type = "t3.medium" # worker node의 instance type
      subnets = [data.aws_subnet.public_a.id, data.aws_subnet.public_c.id]

    }
  }
}

 

 

terraform 초기화

terraform init
ChatGPT가 알려주는 terraform init
terraform init 명령은 Terraform 프로젝트를 초기화하는 데 사용됩니다.
- 프로바이더 초기화: Terraform 코드에서 사용된 프로바이더(예: AWS, Google Cloud, Azure 등)에 대한 초기 설정을 수행합니다. - - 백엔드 구성: Terraform 상태 파일을 저장할 위치를 설정합니다. 상태 파일은 Terraform이 관리하는 인프라의 현재 상태를 추적하는 데 사용됩니다.
- 모듈 다운로드: Terraform 코드가 참조하는 모든 모듈을 다운로드합니다. 모듈은 재사용 가능한 Terraform 코드 블록으로, 보다 효율적인 인프라 관리를 가능하게 합니다.

 

 

terraform 적용 전 확인

terraform plan
ChatGPT가 알려주는 terraform plan
terraform plan 명령은 Terraform 코드의 실행 계획을 생성하고 출력합니다. 이 명령은 실제로 인프라에 변경을 적용하지 않습니다.
- 구성 검증: Terraform 코드의 구성을 검사하고 문법 오류나 구성 오류가 있는지 확인합니다.
- 실행 계획 생성: 현재 인프라 상태와 Terraform 코드 간의 차이를 분석하여, Terraform이 적용할 변경 사항을 결정합니다.
-변경 사항 미리보기: 계획된 변경 사항을 사용자에게 보여줍니다. 이를 통해 사용자는 변경 사항을 검토하고, 예상되는 결과를 확인할 수 있습니다.

 

 

 

terraform 적용

terraform init -> terraform plan 까지 문제가 없이 잘 진행되었다면 이제 적용해주면 됩니다.

terraform apply

 

terraform apply 명령어 실행 시 쫘르르르~

 

cli 창에서 eks cluster 배포 관련 로그들이 쫘르르륵 수집되는 것을 확인하실 수 있고, 이때 AWS Console의 EKS 메뉴에서 생성중인 상태를 보실 수 있습니다.

 

그렇게 대략 10분~15분 후 완료되었다는 로그를 보실 수 있습니다.

 

배포가 마무리 된 후 AWS Console의 EKS 메뉴를 보면 성공적으로 생성된 것을 확인하실 수 있습니다.

 

 

EKS Cluster 확인

이제 생성이 완료되었으면 잘 배포되었는지 확인을 해야겠죠?

 

aws eks --region ap-northeast-2 update-kubeconfig --name ${my-cluster-name}

 

우선, 위의 명령어로 cluster를 등록해줍니다.

 

 

kubectl 명령어도 성공적으로 실행되는 것을 확인하실 수 있습니다.

 

 

 

여기서 잠깐!!

 

 

이전에 eksctl로 배포한 환경처럼 terraform 으로 배포한 환경 역시 public access로 접근을 허용 시켜놨으니 public endpoint로 한번 접근해봅시다!

 

먼저, AWS console에서 endpoint 를 한번 확인해보겠습니다.

 

 

그 다음 아래의 명령어로 cluster에 요청하여 endpoint를 확인해보겠습니다.

aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint

 

올바르게 출력된 것을 확인하실 수 있습니다. 이제 dig 명령어를 통해 해당 endpoint 호출 시 어떤 값이 반환되는지 확인해보겠습니다.

dig +short ${APIEndPoint}

 

2개의 public ip가 반환되는 것을 확인하실 수 있습니다.

 

curl -k -s https://${IP}/version

 

그렇게 반환된 IP를 갖고 curl 명령어를 통해 version API를 확인해보면 정상적으로 통신이 되는 것을 확인하실 수 있습니다.

 

 

terraform 리소스 삭제

terraform destory
ChatGPT가 설명해주는 terraform destory
terraform destroy 명령은 Terraform을 사용하여 생성된 인프라를 삭제하는 데 사용됩니다. 이 명령은 Terraform 코드에 정의된 모든 리소스를 안전하게 제거하기 위해 설계되었습니다. 
- 현재 인프라 상태 분석: Terraform은 상태 파일(.tfstate)을 참조하여 현재 관리 중인 인프라의 상태를 파악합니다.
- 삭제 계획 생성: 리소스 간의 의존성을 고려하여 Terraform은 의존하는 리소스가 먼저 삭제되지 않도록 순서를 조정합니다.
- 사용자 승인 요청: 사용자가 계획을 승인하면 Terraform은 삭제 작업을 진행합니다.
- 리소스 삭제: 사용자의 승인을 받으면 Terraform은 계획된 순서대로 리소스를 삭제합니다
- 상태 파일 업데이트: 모든 리소스가 성공적으로 삭제되면, Terraform은 상태 파일을 업데이트하여 현재 관리 중인 리소스가 없음을 반영합니다.
특정 리소스만 삭제하고 싶은 경우,  terraform destroy -target=resource_name 옵션을 사용하여 특정 리소스에 대한 삭제 작업을 지정할 수 있습니다

 

 

이제 실습을 마무리하기 위해 생성한 terraform 리소스들을 삭제하도록 하겠습니다. 

 

또 쫘르르르~~

 

 


Reference

- terraform 공식문서

- https://learnk8s.io/terraform-eks

 

Provisioning Kubernetes clusters on AWS with Terraform and EKS

Learn how you can leverage Terraform and EKS to provision identical clusters for development, staging and production environments with a single click.

learnk8s.io