kubernetes.io/<cluster-name>
shared
kubernetes.io/role/elb
1
kubernetes.io/role/internal-elb
1
하나의 Cluster가 될 VPC를 생성하고 그 VPC안에 3개의 가용영역을 둔다. 그 가용영역 안에는 Public Subnet, Private Subnet이 존재하게 된다. 또 Public Subnet안에는 Bastion Host와 NAT Gateway가 존재한다.
VPC (Cluster)
이 후 추가적으로 Bastion Host 추가, Cluster Scailing 예정
리소스들의 tag설정은 EKS 구성에 필요한 Key + 자신이 식별할 수 있는 aws_default_name
을 변수로 받아와 merge로 합치게 되면서 아래와 같이 리소스를 생성하게 된다.
사용된 리소스
aws_vpc
사용된 옵션
# Create VPC
resource "aws_vpc" "PR-TEST-VPC" {
cidr_block = var.aws_vpc_cidr
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-VPC")
})
}
cidr_block
은 변수로 처리하였고 모듈을 정의하는 곳에서 CIDR을 설정하게 된다. enable_dns_hostnames
와 enable_dns_support
를 활성화 하여 워커노드가 생성되면 DNS 호스트 이름을 받게 설정하여 DNS 통신이 가능하게끔 설정한다.
사용된 리소스
aws_subnet
(private, public)사용되는 옵션
# Setting Subnet
# Create Public Subnet
resource "aws_subnet" "PR-TEST-PUBSUB" {
count = length(var.aws_public_subnets)
cidr_block = var.aws_public_subnets[count.index]
vpc_id = aws_vpc.PR-TEST-VPC.id
# EKS node group에 자동으로 IP 할당을 해주기위함.
map_public_ip_on_launch = true
availability_zone = var.aws_azs[count.index]
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-PUBLIC${count.index + 1}")
"kubernetes.io/role/elb"= 1
})
}
# Create Private Subnet
resource "aws_subnet" "PR-TEST-PRISUB" {
count = length(var.aws_private_subnets)
cidr_block = var.aws_private_subnets[count.index]
vpc_id = aws_vpc.PR-TEST-VPC.id
availability_zone = var.aws_azs[count.index]
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-PRIVATE${count.index + 1}")
"kubernetes.io/role/internal-elb"= 1
})
}
count
는 정의된 변수만큼 count
를 채웠고 그 수만큼 차례대로 cidr_block
에서 ip를 list형식에서 빼와서 부여받기로 정의하였다.
vpc_id
로 서브넷을 vpc로 연결한다.
Public subnet에서는 map_public_ip_on_launch = true
을 설정하여 워커노드가 생성되는 즉시 자동으로 eip를 할당받게 설정하였다.
availability_zone
도 정의된 변수만큼 count를 채웠고 a,b,c의 가용영역에 연결한다.
마찬가지로 태그를 지정한다. "EKS-PRIVATE${count.index + 1}"
부분은 Subnet을 구분하기 위한 설정이다.
ex) EKS-PRIVATE1, EKS-PRIVATE2 ... 처럼 구분하게 하기 위해 count 함수를 사용하였다.
사용되는 리소스
aws_internet_gateway
사용되는 옵션
# Create IGW
resource "aws_internet_gateway" "PR-TEST-IGW" {
vpc_id = aws_vpc.PR-TEST-VPC.id
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-IGW")
})
}
vpc_id
로 연결할 vpc를 정의사용되는 리소스
사용되는 옵션
# Create EIP for Nat Gateway
resource "aws_eip" "EIP" {
vpc = true
}
vpc
를 true로 설정하여 vpc연결을 활성화 한다.사용되는 리소스
aws_nat_gateway
사용되는 옵션
# Create Nat Gateway
resource "aws_nat_gateway" "PR-TEST-NG" {
allocation_id = aws_eip.EIP.id
subnet_id = aws_subnet.PR-TEST-PUBSUB.0.id
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-NATGW")
})
}
allocation_id
로 eip를 할당한다.사용되는 리소스
aws_route_table
사용되는 옵션
# Create Public Route Table
resource "aws_route_table" "PR-TEST-PUBROUTE" {
vpc_id = aws_vpc.PR-TEST-VPC.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.PR-TEST-IGW.id
}
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-PUBLIC-ROUTE")
})
}
vpc_id
로 라우트 테이블을 vpc에 연결한다.route { }
를 사용하여 라우팅을 설정한다.cidr_block
로 대상을 지정하고gateway_id
로 연결할 게이트웨이 id를 지정한다.tags
설정# Create Private Route Table !!!
resource "aws_route_table" "PR-TEST-PRIROUTE" {
vpc_id = aws_vpc.PR-TEST-VPC.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.PR-TEST-NG.id
}
tags = merge(var.global_tags,
{
"Name" = format("%s-%s", var.aws_default_name, "EKS-PRIVATE-ROUTE")
})
}
vpc_id
로 라우트 테이블을 vpc에 연결한다.route {}
를 사용하여 라우팅을 설정한다.cidr_block
로 대상을 지정하고nat_gateway_id
를 설정하여 NAT Gateway를 연결하는데 이 때 count.index
사용하여 Route Table을 생성하여 각각 라우팅 되게 설정한다.
- 따라서 NAT Gateway를 3개를 지정하였으면 3개가 만들어짐
사용되는 리소스
aws_route_table_association
사용되는 옵션
# Create Public Route Table Routing
resource "aws_route_table_association" "PR-TEST-PUBROUTING" {
count = length(var.aws_public_subnets)
route_table_id = aws_route_table.PR-TEST-PUBROUTE.id
subnet_id = aws_subnet.PR-TEST-PUBSUB.*.id[count.index]
}
# Create Private Route Table Routing
resource "aws_route_table_association" "PR-TEST-PRIROUTING" {
count = length(var.aws_private_subnets)
route_table_id = aws_route_table.PR-TEST-PRIROUTE.id
subnet_id = aws_subnet.PR-TEST-PRISUB.*.id[count.index]
}
count
를 Public Subnet의 수만큼 받아온다.route_table_id
로 라우팅할 Public Route Table을 선택한다.subnet_id
로 선택한다.
- 이렇게 설정이됨
variable "aws_vpc_cidr" {
description = "vpc의 cidr을 정의"
}
variable "aws_public_subnets" {
description = "퍼블릭 서브넷들을 정의"
}
variable "aws_private_subnets" {
description = "프라이빗 서브넷들을 정의"
}
variable "aws_region" {
description = "리소스 생성할 지역 정의"
type = string
}
variable "aws_azs" {
description = "가용영역 정의"
}
# Naming
variable "global_tags" {
description = "EKS 생성을 위한 태깅"
type = map(string)
}
variable "aws_default_name" {
type = string
description = "리소스에 붙을 고유한 default 이름을 정의"
}
################### Create VPC ###################
module "vpc" {
source = "git::https://github.com/SeungHyeonShin/terraform.git//modules/eks-vpc?ref=v1.0.1"
aws_vpc_cidr = "192.168.0.0/16"
aws_private_subnets = ["192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24"]
aws_public_subnets = ["192.168.11.0/24", "192.168.12.0/24", "192.168.13.0/24"]
aws_region = local.region
aws_azs = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
aws_default_name = "seunghyeon"
global_tags = {
"kubernetes.io/cluster/${local.cluster_name}" = "shared"
}
}
aws_vpc
aws_subnet
aws_internet_gateway
aws_eip
aws_nat_gateway
aws_route_table
aws_route_table_association
tags를 좀 더 명확하게 알아볼 수 있게