본문 바로가기

Terraform

[테라폼] EKS 배포 및 Add on 설치

반응형

1.  EKS 란?

  • EKS는 Elastic Kuberneetes Service의 약자로 AWS에서 제공하는 관리형 서비스이며, 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 Kubernetes 실행 및 사용이 가능하다.
  • EKS를 사용하면 컨트롤 플레인을 따로 구성하지 않아도 AWS에서 관리해주기 때문에 간편하게 이용 가능하다.
  • 여러 AWS 가용 영역에 걸쳐 컨트롤 플레인을 실행하고 크기를 조정하여 높은 가용성을 보장한다.
  • 지원 버전 : 보통 4개의 마이너 버전 지원(현재 1.22~1.26), 평균 3개월마다 새 버전 제공, 각 버전은 12개월 정도 지원
    v1.24.2 → Major.Minor.Patch ⇒ Major(Breaking Changes) . Minor(New Features) . Patch(Bug fixes Security)

 

2.  EKS Cluster & Node Group 생성 (w. Terraform)

  • EKS를 구축하기 위해서는 EKS Cluster 와 Node Group을 생성하여야 한다.
  • EKS 클러스터 생성을 위한 VPC 고려 사항
    - VPC는 DNS hostnames와 DNS resolution을 모두 지원하여야 한다. 그렇지 않을 경우 Node Group의 Worker Node가 Cluster에 등록X

 

 Terraform EKS Public module을 사용하여 EKS 구성

  • 코드 구성은 EKS를 생성하기 위해 VPC 및 Subnet 등을 생성하기 위한 Network Module, EKS를 생성하기 위한 EKS Module 로 구성되어 있다.

 

2-1) EKS 생성을 위한 VPC 및 네트워크 생성 (Network Module)

코드 참고) https://github.com/junho102/DOIK-Study/blob/main/Network/README.md

  • 해당 Network Module 은 3-tier achitecture로 구성되어 있으며, 다음과 같은 code로 해당 모듈 사용이 가능하다.
  • 모듈을 실행하고 나면 VPC, Subnet, igw, nat gw, routing 이 생성한다.
module "network" {
  source       = "./modules/Network"
  project_name = "eks"
  subnet_name  = "sbn"
  env          = "dev"
  vpc_name     = "vpc"
  igw_name     = "igw"
  natgw_name   = "nat"
  rt_name      = "rt"
  vpc_cidr     = "10.0.0.0/16"
  pub_cidr     = ["10.0.1.0/24", "10.0.2.0/24"]
  pri_cidr     = ["10.0.3.0/24", "10.0.4.0/24"]
  db_cidr      = ["10.0.5.0/24", "10.0.6.0/24"]
}

 

2-2) EKS 생성 (EKS Module)

코드 참고) https://github.com/junho102/DOIK-Study/blob/main/EKS/README.md

  • 해당 EKS Module 은 EKS 및 EKS를 접속할 수 있는 bastion server, EKS Add on을 생성한다. (EKS Add on 아래에 설명)
  • 다음과 같은 code로 해당 모듈 사용이 가능하다.
module "eks" {
  source                      = "./modules/EKS"
  eks_cluster_name            = "eks_cluster"
  eks_cluster_node_group_name = "eks_cluster-nodegroup"
  eks_cluster_version         = "1.24"
  ec2_key_pair                = "my_aws_key"
  worker_node_instance_type   = ["m5.xlarge"]
  worker_node_max_size        = 4
  worker_node_desired_size    = 2
  worker_node_min_size        = 2
  aws_region                  = "ap-northeast-2"
  var_subnet_1_az             = "ap-northeast-2a"
  var_subnet_2_az             = "ap-northeast-2c"
  vpc_id                      = module.network.vpc_id
  pri_subnets_ids             = module.network.pri_subnet.*.id
  pub_subnets_ids             = module.network.pub_subnet.*.id
}
  • 해당 코드를 실행하여 EKS를 생성하였다면 bastion에 접속하여 다음 명령어를 통해 EKS에 접근하여 Kubernetes를 사용할 수 있다.
aws eks --region $AWS_DEFAULT_REGION update-kubeconfig --name $CLUSTER_NAME --kubeconfig ~/.kube/config

 

 

3.  EKS Add on 생성 - ebs csi driver & loadbalancer controller (w. Terraform)

3-1) Helm 이란?

  • 쿠버네티스 오픈 소스 패키지 매니저로, k8s용으로 구축된 소프트웨어를 제공, 공유 및 사용할 수 있는 기능을 제공한다.
  • Helm 은 리소스 집합을 설명하는 파일 모음인 chart라는 패키지 형식을 사용한다.

3-2) Terraform Helm Provider 란?

  • IaC 도구인 Terraform은 인프라스트럭처 리소스를 선언할 수 있는 도구로서 다양한 서비스들을 지원하고 있는데 이를 Provider라고 부르며, Helm provider를 사용하면 Kubernetes에 소프트웨어 패키지를 배포하는데 사용할 수 있다.

3-3) ebs csi driver 란?

  • EKS Add on 기능으로 AWS EKS 클러스터가 영구 볼륨을 위해 Amazon EBS 볼륨의 수명 주기를 관리할 수 있게 한다.
  • 해당 기능을 사용할 수 있는 방안은 2가지이며, EKS Add on 또는 자체 관리형 Add on 으로 EBS CSI Driver를 설치해야 한다.

 

provider "helm" {
  kubernetes {
    host                   = module.eks.cluster_endpoint
    cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
    token                  = data.aws_eks_cluster_auth.eks_cluster.token
  }
}

locals {
  values_aws-ebs-csi-driver = <<VALUES
    controller:
      extraCreateMetadata: true
      serviceAccount:
        name: "ebs-csi-driver"
        annotations:
          eks.amazonaws.com/role-arn: ${module.ebs_csi_driver_controller_iam_role.iam_role_arn}
VALUES
}

resource "helm_release" "ebs_csi_driver" {
  count = var.ebs_csi_driver ? 1 : 0

  name       = "ebs-csi-driver"
  namespace  = "kube-system"
  chart      = "aws-ebs-csi-driver"
  repository = "https://kubernetes-sigs.github.io/aws-ebs-csi-driver"

  values = [
    local.values_aws-ebs-csi-driver
  ]
}

-> 위와 같이 provider helm 블럭을 통해 helm을 사용하며 helm_release 블럭을 통해 ebs csi driver 공식 helm chart로 설치한다.

 

provider "kubernetes" {
  host                   = module.eks.cluster_endpoint
  cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
  token                  = data.aws_eks_cluster_auth.eks_cluster.token
}

resource "kubernetes_storage_class" "aws-ebs-csi-driver-sc-gp3" {
  count = var.ebs_csi_drivce_sc_gp3 ? 1 : 0
  metadata {
    name = "gp3"
  }
  storage_provisioner    = "ebs.csi.aws.com"
  volume_binding_mode    = "WaitForFirstConsumer"
  allow_volume_expansion = true

  parameters = merge(
    {
      type                       = "gp3"
      allowAutoIOPSPerGBIncrease = "true"
      encrypted                  = "true"
    }
  )
}

-> 위와 같이 provider kubernetes 블럭을 사용하여 terraform code를 통해 k8s에서 지원하는 리소스를 컨트롤 가능하다.

-> kubernetes_storage_class 리소스 블럭을 사용하기 위해서는 provider kubernetes 블럭이 필요하다.

-> kubernetes_storage_class 리소스 블럭을 통해 gp3 타입의 storageClass를 생성한다.

 

3-4) 생성된 ebs csi driver 및 StorageClass 확인

 

3-5) Loadbalancer Controller란?

resource "helm_release" "helm_AWSLoadBalancerController" {
  depends_on = [module.eks]
  name       = "aws-load-balancer-controller"

  repository = "https://aws.github.io/eks-charts"
  chart      = "aws-load-balancer-controller"
  namespace = "kube-system"

  set {
    name  = "image.repository"
    value = "602401143452.dkr.ecr.us-east-1.amazonaws.com/amazon/aws-load-balancer-controller"
  }
  set {
    name  = "serviceAccount.create"
    value = "true"
  }
  set {
    name  = "serviceAccount.name"
    value = "aws-load-balancer-controller"
  }
  set {
    name  = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
    value = aws_iam_role.AWSLoadBalancerController_iam_role.arn
  }
  set {
    name  = "vpcId"
    value = local.vpc_id
  }
  set {
    name  = "region"
    value = local.aws_region
  }
  set {
    name  = "clusterName"
    value = local.eks_cluster_name
  }
}

-> 위와 같이 helm_release 리소스 블럭을 통해 aws loadbalancer controller 공식 helm chart로 설치한다.

 

 

3-6) 생성된 Load balacer Controller 확인

반응형