Infra
수정·

[Terraform] EKS Cluster 구성하기

by Dohoon Kim · 23년 03월 08일 09:00:00

Terraform 을 이용한 EKS 클러스터 구성

지난 포스트에서 작성했던 vpc.tf 의 내용을 다음과 같이 수정한다.

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = var.vpc_name
  azs = var.availability_zones
  cidr = var.vpc_cidr

  enable_nat_gateway = true
  single_nat_gateway = true

  public_subnets = [for index in range(2) : 
                        cidrsubnet(var.vpc_cidr, 4, index)]
  private_subnets = [for index in range(2) : 
                        cidrsubnet(var.vpc_cidr, 4, index+2)]

  #추가
  vpc_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
  }  # 추가
  public_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb" = "1"
  }
  # 추가
  private_subnet_tags = { 
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb" = "1"
  }
}

또한 variables.tf 와 terraform.auto.tfvars 파일에 cluster 관련 변수를 추가해준다.

# variables.tf

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

variable "availability_zones" {
    description = "AWS AZ info"
    type = list(string)
    default = [ "ap-northeast-2a", "ap-northeast-2c" ]
}

variable vpc_name {
    type = string
}

variable vpc_cidr {
    type = string
}

#추가
variable cluster_name {
    type = string
}

# 추가
variable cluster_version {
    type = string
}
# terraform.auto.tfvars
region = "ap-northeast-2"
vpc_name = "your-vpc-name"
vpc_cidr = "10.244.0.0/16"
cluster_name = "your-cluster-name"
cluster_version = "1.24"

위 내용을 작성했다면 eks cluster 에 대한 terraform 파일을 생성한다.

#eks-cluster.tf

data "aws_caller_identity" "current" {}

locals {
  iam_role_policy_prefix = "arn:aws::${data.aws_caller_identity.current.account_id}:policy"
  terraform_runner_cidr = "your.ip.addr.ipv4/32"  
}

module "eks" {
  source = "terraform-aws-modules/eks/aws"
  cluster_name = var.cluster_name
  cluster_version = var.cluster_version

  cluster_endpoint_private_access = true # vpc 내부에서 접속 가능
  cluster_endpoint_public_access = false # vpc 외부에서 접속 불가능

  cluster_addons = {
    coredns = {
      resolve_conflict = "OVERWRITE"
    }

    kube-proxy = {}
    
    vpc-cni = {
      resolve_conflict = "OVERWRITE"
    }
  }
  
  create_aws_auth_configmap = true 
  manage_aws_auth_configmap = true # 관리형 노드그룹을 사용
  vpc_id = module.vpc.vpc_id
  subnet_ids = module.vpc.private_subnets
  
  # 추가 - 외부 접근 허용
  cluster_security_group_additional_rules = {
    ingress = {
      description = "EKS Cluster allows 443  port."
      type = "ingress"
      from_port = 443
      to_port = 443
      protocol = "TCP"
      cidr_blocks = [local.terraform_runner_cidr]
      source_node_security_group = false
    } 
  }
}

작성이 완료되었다면 인프라를 적용한다.

$ terraform apply

약 15-20분 사이의 시간이 걸리므로 대기 후 coredns addon 을 제외한 다른 모든 리소스가 생성되었으면 새로운 터미널에서 다음 명령어를 입력하여 kubeconfig 을 구성한다.

$ aws eks update-kubeconfig --name your-cluster-name --region ap-northeast-2

kubeconfig 파일은 $HOME/.kube/config 에 저장된다. eks가 구성된 vpc 의 public subnet 대역에 ec2 인스턴스를 생성한 후 kubectl을 이용하여 Cluster API Server 와 통신을 시도해보자.

$ kubectl get nodes
No resources found

정상 동작을 확인하였다.