Terraform으로 EKS Cluster 프로비전(3) - Cluster 생성

empty·2020년 9월 15일
0

EKS

목록 보기
4/6
post-thumbnail

서론

EKS는 Fully Managed Kubernetes 이다. 즉, Data Plane, Control Plane 관리를 AWS에서 해준다.

EKS 클러스터 구성도 Module로 구성을 하게 되면 EKS -> 클러스터 생성 -> Node Group 생성이 된다.

Node Group 페이지에서 Worker Node를 관리할 수 있다.
본 포스팅은 해당 Node Group에 Worker Node를 추가하는 방법을 사용한다.

EKS Cluster 작업순서

  1. VPC 생성
  2. Bastion Host 생성
  3. EKS Cluster 생성 (Module 사용)

Cluster 생성

이번 포스팅에는 공식적으로 제공하는 terraform-aws-eks 모듈을 사용하고 약간의 커스터마이징을 하여 사용한다.

Bastion Host와 마찬가지로 Github에서 제공하는 input값을 사용하여 커스터마이징을 할 것이고 제공하는 Input 값이 무려 56개가 되니 상세하게 커스터마이징을 할 수 있다.

Usage Sample (Github)

data "aws_eks_cluster" "cluster" {
  name = module.my-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
  name = module.my-cluster.cluster_id
}

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
  token                  = data.aws_eks_cluster_auth.cluster.token
  load_config_file       = false
  version                = "~> 1.9"
}

module "my-cluster" {
  source          = "terraform-aws-modules/eks/aws"
  cluster_name    = "my-cluster"
  cluster_version = "1.18"
  subnets         = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
  vpc_id          = "vpc-1234556abcdef"

  worker_groups = [
    {
      instance_type = "m4.large"
      asg_max_size  = 5
    }
  ]
}

이 모듈을 애초에 Input 값이 56개가 되므로 이 Usage Sample은 정말 다양하게 사용하는 방법 중 하나이다. 또 Bastion Host를 위한 설정도 안되어 있으므로 커스터마이징을 하자

Usage Sample (Customizing)

module "eks" {
  source          = "git::https://github.com/terraform-aws-modules/terraform-aws-eks.git?ref=v12.1.0"
  cluster_name    = local.cluster_name
  vpc_id          = module.vpc.aws_vpc_id
  subnets         = module.vpc.private_subnets
  cluster_version = "1.18"

  node_groups = {
    eks_nodes = {
      desired_capacity = 3
      max_capacity     = 5
      min_capacity     = 3
      key_name         = aws_key_pair.seunghyeon-eks.key_name
      instance_type    = "t3.micro"
      source_security_group_ids = [
        aws_security_group.seunghyeon-bastion-sg.id
      ]
    }
  }
  manage_aws_auth = false
}

############   Local Variable  ######################
locals {
  cluster_name = "seunghyeon-eks-cluster"
  region       = "ap-northeast-2"
}

설명

  • source : 모듈의 위치

  • cluster_name : 생성될 클러스터의 이름을 지정

  • vpc_id : 클러스터, 노드가 생성될 vpc를 지정

  • subnets : 클러스터, 노드가 생성될 서브넷 지정

  • cluster_version : 클러스터의 버전(K8S)을 지정

  • eks_nodes : 노드그룹의 이름을 지정

    • desired_capacity : Autoscaling으로 생성되는 노드의 기본 개수 지정
    • max_capacity : 노드의 최대 개수 지정
    • min_capacity : 노드의 최소 개수 지정
    • key_name : 노드의 키를 지정
    • instance_type : 노드의 인스턴스 타입을 지정 (인스턴스 타입은 제한되어 있으므로 사용 가능한 타입을 확인해야 한다.)
    • source_security_group_ids : Bastion Host의 Security Group을 추가한다. (Bastion Host에서 접속을 하기위함)

결과

EKS에서 kubectl명령어를 사용하려면 IAM을 사용하여 K8S 클러스터에 인증을 제공해주는 파일인 aws-iam-authenticator 설치가 되어있어야 한다. AWS 공식 Docs를 참조하여 설치를 하는데 현재 다운로드 링크가 잘못되어 있어서 해당 다운로드 링크로 설치한다.

0. context 파일 생성

  • 해당 파일의 이름을 'config'로 변경 후 ~/.kube/에 이동시키면 kubectl 명령을 사용 할 수 있다.

1. 클러스터 생성

  • 클러스터 확인
  • 설정된 네트워크 정보

2. 노드그룹 생성

  • 해당 노드그룹은 AWS에서 관리한다.

3. Worker Node EC2 생성

  • Bastion EC2에서 SSH Key를 이용하여 워커노드에 접속할 수 있다.

0개의 댓글