[Terraform] 테라폼으로 EKS 프로비저닝

2023. 12. 14. 02:13·Terraform
반응형


 

main.tf

# AWS 프로바이더 설정: AWS 리소스를 관리하기 위해 지정된 리전을 설정합니다.
provider "aws" {
  region = var.region
}

# 사용 가능한 가용 영역을 필터링합니다. 이는 관리형 노드 그룹에서 현재 지원되지 않는 로컬 존을 제외하기 위한 것입니다.
data "aws_availability_zones" "available" {
  filter {
    name   = "opt-in-status"
    values = ["opt-in-not-required"]
  }
}

# 클러스터 이름을 지정하는 로컬 변수를 설정합니다. 여기서는 랜덤 문자열을 포함하여 고유한 이름을 생성합니다.
locals {
  cluster_name = "dohyung-eks-${random_string.suffix.result}"
}

# 랜덤 문자열 리소스를 생성합니다. 이는 클러스터 이름에 사용됩니다.
resource "random_string" "suffix" {
  length  = 8
  special = false
}

# VPC 모듈을 사용하여 가상 프라이빗 클라우드를 생성합니다. 이는 EKS 클러스터에 필요한 네트워크 환경을 설정합니다.
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "education-vpc"

  cidr = "10.0.0.0/16"
  azs  = slice(data.aws_availability_zones.available.names, 0, 3)

  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"]

  enable_nat_gateway   = true
  single_nat_gateway   = true
  enable_dns_hostnames = true

  # 퍼블릭 서브넷에 태그를 지정하여 이들이 EKS 클러스터에 사용될 수 있도록 합니다.
  public_subnet_tags = {
    "kubernetes.io/cluster/${local.cluster_name}" = "shared"
    "kubernetes.io/role/elb"                      = 1
  }

  # 프라이빗 서브넷에 태그를 지정하여 이들이 내부적으로 사용될 수 있도록 합니다.
  private_subnet_tags = {
    "kubernetes.io/cluster/${local.cluster_name}" = "shared"
    "kubernetes.io/role/internal-elb"             = 1
  }
}

# EKS 모듈을 사용하여 EKS 클러스터를 생성합니다. 여기에는 클러스터 이름, 버전, 사용할 VPC 및 서브넷이 포함됩니다.
module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "19.15.3"

  cluster_name    = local.cluster_name
  cluster_version = "1.27"

  vpc_id                         = module.vpc.vpc_id
  subnet_ids                     = module.vpc.private_subnets
  cluster_endpoint_public_access = true

  # 관리형 노드 그룹의 기본 설정입니다.
  eks_managed_node_group_defaults = {
    ami_type = "AL2_x86_64"
  }

  # 두 개의 관리형 노드 그룹을 정의합니다.
  eks_managed_node_groups = {
    one = {
      name = "node-group-1"

      instance_types = ["t3.small"]

      min_size     = 1
      max_size     = 3
      desired_size = 2
    }

    two = {
      name = "node-group-2"

      instance_types = ["t3.small"]

      min_size     = 1
      max_size     = 2
      desired_size = 1
    }
  }
}

# AWS EBS CSI 드라이버에 대한 IAM 정책을 데이터 소스로 가져옵니다. 이는 EBS 볼륨을 관리하기 위한 권한을 설정하는 데 사용됩니다.
data "aws_iam_policy" "ebs_csi_policy" {
  arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy"
}

# EBS CSI 드라이버에 사용할 IAM 역할을 생성합니다. OIDC를 사용하여 EKS 클러스터와 통합합니다.
module "irsa-ebs-csi" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
  version = "4.7.0"

  create_role                   = true
  role_name                     = "AmazonEKSTFEBSCSIRole-${module.eks.cluster_name}"
  provider_url                  = module.eks.oidc_provider
  role_policy_arns              = [data.aws_iam_policy.ebs_csi_policy.arn]
  oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"]
}

# EBS CSI 드라이버를 EKS 클러스터에 애드온으로 추가합니다. 이는 EKS 클러스터에서 EBS 볼륨을 관리하는 데 사용됩니다.
resource "aws_eks_addon" "ebs-csi" {
  cluster_name             = module.eks.cluster_name
  addon_name               = "aws-ebs-csi-driver"
  addon_version            = "v1.20.0-eksbuild.1"
  service_account_role_arn = module.irsa-ebs-csi.iam_role_arn
  tags = {
    "eks_addon" = "ebs-csi"
    "terraform" = "true"
  }
}

 

outputs.tf

# 이 코드는 Terraform을 사용하여 AWS EKS 클러스터를 구성한 후
# 구성된 클러스터의 중요한 정보를 출력하는 부분입니다.
# 코드의 각 항목은 다음과 같은 정보를 출력하도록 설정되어 있습니다.


# EKS 컨트롤 플레인의 엔드포인트를 출력합니다. 이는 클러스터에 접근하기 위한 주소입니다.
output "cluster_endpoint" {
  description = "Endpoint for EKS control plane"
  value       = module.eks.cluster_endpoint
}

# 클러스터 컨트롤 플레인에 연결된 보안 그룹 ID를 출력합니다. 이 보안 그룹은 클러스터의 네트워크 액세스를 제어하는 데 사용됩니다.
output "cluster_security_group_id" {
  description = "Security group ids attached to the cluster control plane"
  value       = module.eks.cluster_security_group_id
}

# 사용된 AWS 리전을 출력합니다. 이는 클러스터가 구성된 지리적 위치를 나타냅니다.
output "region" {
  description = "AWS region"
  value       = var.region
}

# Kubernetes 클러스터의 이름을 출력합니다. 이 이름은 클러스터를 식별하는 데 사용됩니다.
output "cluster_name" {
  description = "Kubernetes Cluster Name"
  value       = module.eks.cluster_name
}

 

terraform.tf

# 이 코드는 Terraform 구성의 일부로,
# Terraform 클라우드 작업 공간 설정, 필요한 프로바이더의 정의, 그리고 사용되는 Terraform 버전에 대한 요구 사항을 지정합니다.


# Terraform 클라우드 설정: 이는 Terraform 클라우드에서 관리되는 작업 공간을 지정합니다.
terraform {
  cloud {
    organization = "dohyung-awscloudschool" 

    workspaces {
      name = "dohyung-eks"
    }
  }

  # 필요한 프로바이더를 지정합니다. 프로바이더는 Terraform이 리소스를 관리하기 위해 사용하는 플러그인입니다.
  required_providers {
    # AWS 프로바이더: AWS 리소스를 관리하기 위해 사용됩니다. 특정 버전을 지정하여 호환성을 유지합니다.
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.7.0"
    }

    # Random 프로바이더: 랜덤 값 생성에 사용됩니다. 예를 들어, 리소스 이름에 랜덤 문자열을 추가하는 데 사용할 수 있습니다.
    random = {
      source  = "hashicorp/random"
      version = "~> 3.5.1"
    }

    # TLS 프로바이더: TLS(Transport Layer Security) 관련 리소스 생성에 사용됩니다.
    tls = {
      source  = "hashicorp/tls"
      version = "~> 4.0.4"
    }

    # Cloudinit 프로바이더: 클라우드 초기화 구성을 관리하기 위해 사용됩니다. 이는 클라우드 인스턴스의 초기 설정을 정의하는 데 사용될 수 있습니다.
    cloudinit = {
      source  = "hashicorp/cloudinit"
      version = "~> 2.3.2"
    }
  }

  # 사용되는 Terraform 버전을 지정합니다. 이는 해당 버전이나 이후 호환되는 버전을 사용하도록 보장합니다.
  required_version = "~> 1.3"
}

 

 

variables.tf

variable "region" {
  description = "AWS region"
  type        = string
  default     = "ap-northeast-2"
}

 

 

 

 

리소스 삭제

terraform destroy

반응형
저작자표시 (새창열림)

'Terraform' 카테고리의 다른 글

[Terraform] 테라폼으로 AWS EC2 프로비저닝 실습(예제)  (3) 2023.12.13
'Terraform' 카테고리의 다른 글
  • [Terraform] 테라폼으로 AWS EC2 프로비저닝 실습(예제)
운덩하는 개발자
운덩하는 개발자
    반응형
  • 운덩하는 개발자
    ddo_hyung_
    운덩하는 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기
      • EKS
      • Container
      • Python
      • AI
      • Java
      • 자기개발, 일기
      • AWS
      • Algorithm
      • Spring Boot
      • Kubernetes
      • Github Action
      • CS
      • Network
      • Etc
      • Linux
      • Terraform
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    테라폼 AWS
    쿠버네티스 로드밸런서
    쿠버네티스 파드 실습
    쿠버네티스 셀렉터
    메트릭서버
    쿠버네티스 ExternalName
    kubernetes pod example
    테라폼 실습
    쿠버네티스 cluster ip
    쿠버네티스 도메인 쿼리 질의
    테라폼
    쿠버네티스 Headless Service
    쿠버네티스 dns
    ca와kapenter비교
    에프큐디엔
    쿠버네티스 파드 예시
    컨테이너
    쿠버네티스 서비스 쓰는 이유
    인터넷 접속 과정
    쿠버네티스 파드
    AWS
    Network
    테라폼 예시
    Container
    karpenter
    테라폼 프로비저닝 예시
    쿠버네티스 셀렉터 실습
    DNS
    Kubernetes
    쿠버네티스 도메인
    network 과정
    코어디엔에스
    클러스터오토스케일링
    네트워크
    배포
    쿠버네티스 node port
    테라폼 프로비저닝 예제
    테라폼 EC2
    쿠버네티스 셀렉터 예시
    metricserver
    테라폼 프로비저닝 실습
    카펜터
    docker
    youtube 접속 과정
    쿠버네티스 셀렉터 사용사례
    clusterautoscaler
    쿠버네티스 서비스 종류
    terraform
    쿠버네티스
    테라폼 예제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
운덩하는 개발자
[Terraform] 테라폼으로 EKS 프로비저닝
상단으로

티스토리툴바