먼저 자신의 컴퓨터 운영체제에 맞는 테라폼을 설치합니다.
https://developer.hashicorp.com/terraform/install
1. ncp cli 연결
우선 내 계정과 ncp cli를 연결합니다.
ncloud configure
명령어 입력해서 잘 실행되는지 확인
ncloud vserver getRegionList
안되는 경우)
https://hgk5722.tistory.com/562
2. VPC, Subnet 1개씩 생성
필요한 파일은 3개입니다.
main.tf
variables.tf
versions.tf
첫 번째로 main.tf에 들어갈 코드입니다.
provider "ncloud" {
support_vpc = true
region = "KR"
access_key = var.access_key
secret_key = var.secret_key
}
resource "ncloud_login_key" "key_scn_01" {
key_name = var.name_vpc
}
resource "ncloud_vpc" "vpc_vpc" {
name = var.name_vpc
ipv4_cidr_block = "10.0.0.0/21"
}
resource "ncloud_subnet" "subnet_pub1" {
name = var.name_pub1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = "10.0.2.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PUBLIC"
// PUBLIC(Public) | PRIVATE(Private)
}
두 번째는 variabels.tf에 들어갈 코드입니다.
variable name_vpc {
default = "agame-dev-vpc"
}
variable name_pub1 {
default = "agame-dev-pub1"
}
variable client_ip {
default = "3.3.3.3"
}
variable access_key {
default = "<액세스 키>"
}
variable secret_key {
default = "<비밀 키>"
}
변수에 액세스 키와 비밀 키는 본인의 것으로 수정해주셔야 합니다.
세 번째는 versions.tf 코드입니다.
terraform {
required_providers {
ncloud = {
source = "navercloudplatform/ncloud"
}
}
required_version = ">= 0.13"
}
ls 명령어 실행하면 이렇게 디렉토리가 구성됩니다.
ls
NOTICE jre8 main.tf terraform.tfstate versions.tf
README.md lib ncloud variables.tf
이제 terraform init, terraform plan, terraform apply -auto-approve를 순서대로 한 뒤 콘솔로 가시면 VPC와 Subnet이 생성되어 있습니다.
성공적으로 생성된 것을 확인했으니 이제 생성된 리소스를 지워주겠습니다.
terraform destroy --auto-approve
이제 콘솔로 돌아가면 깔끔하게 VPC와 Subnet이 삭제된 것을 확인할 수 있습니다.
2. VPC 안에 6개의 서브넷을 충돌하지 않게 생성하기
필요한 파일은 이전과 같이 main.tf, variables.tf, versions.tf로 동일합니다.
main.tf 파일의 코드입니다.
provider "ncloud" {
support_vpc = true
region = "KR"
access_key = var.access_key
secret_key = var.secret_key
}
resource "ncloud_login_key" "key_scn_01" {
key_name = var.name_scn01
}
resource "ncloud_vpc" "vpc_scn_01" {
name = var.name_scn01
ipv4_cidr_block = "10.0.0.0/21"
}
resource "ncloud_subnet" "subnet_pri1" {
name = var.name_pri1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.0.0/23"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub1" {
name = var.name_pub1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.2.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PUBLIC"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pri-db1" {
name = var.name_pri-db1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.3.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub-nat1" {
name = var.name_pub-nat1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.4.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PUBLIC"
usage_type = "NATGW"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub-lb1" {
name = var.name_pub-lb1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.5.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PUBLIC"
usage_type = "LOADB"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pri-lb1" {
name = var.name_pri-lb1
vpc_no = ncloud_vpc.vpc_scn_01.id
subnet = "10.0.6.0/24"
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_scn_01.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
usage_type = "LOADB"
}
provider와 login key, vpc, 서브넷에 대한 리소스들입니다.
variables.tf
variable name_scn01 {
default = "agame-dev-vpc"
}
variable name_pri1 {
default = "agame-dev-pri1"
}
variable name_pub1 {
default = "agame-dev-pub1"
}
variable name_pri-db1 {
default = "agame-dev-pri-db1"
}
variable name_pub-nat1 {
default = "agame-dev-pub-nat1"
}
variable name_pub-lb1 {
default = "agame-dev-pub-lb1"
}
variable name_pri-lb1 {
default = "agame-dev-pri-lb1"
}
variable client_ip {
default = "3.3.3.3"
}
variable access_key {
default = "액세스 키"
}
variable secret_key {
default = "비밀 키"
}
versions.tf
terraform {
required_providers {
ncloud = {
source = "navercloudplatform/ncloud"
}
}
required_version = ">= 0.13"
}
3. 쿠버네티스 생성하기
이번엔 필요한 파일이 5개입니다.
main.tf, variables.tf, versions.tf, nat1.tf, nks.tf
main.tf
provider "ncloud" {
support_vpc = true
region = "KR"
access_key = var.access_key
secret_key = var.secret_key
}
resource "ncloud_login_key" "key_vpc" {
key_name = var.name_vpc
}
resource "ncloud_vpc" "vpc_vpc" {
name = var.name_vpc
ipv4_cidr_block = "10.0.0.0/21"
}
resource "ncloud_subnet" "subnet_pri1" {
name = var.name_pri1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,2 ,0 )
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub1" {
name = var.name_pub1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,3 , 2)
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PUBLIC"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pri-db1" {
name = var.name_pri-db1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,3 , 3)
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub-nat1" {
name = var.name_pub-nat1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,3 , 4)
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PUBLIC"
usage_type = "NATGW"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pub-lb1" {
name = var.name_pub-lb1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,3 , 5)
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PUBLIC"
usage_type = "LOADB"
// PUBLIC(Public) | PRIVATE(Private)
}
resource "ncloud_subnet" "subnet_pri-lb1" {
name = var.name_pri-lb1
vpc_no = ncloud_vpc.vpc_vpc.id
subnet = cidrsubnet(ncloud_vpc.vpc_vpc.ipv4_cidr_block,3 , 6)
zone = "KR-1"
network_acl_no = ncloud_vpc.vpc_vpc.default_network_acl_no
subnet_type = "PRIVATE"
// PUBLIC(Public) | PRIVATE(Private)
usage_type = "LOADB"
}
cidrsubnet(prefix, newbits, netnum)
여기서 "ncloud_subnet" 리소스에 subnet = cidrsubnet()항목이 있는데 cidrsubnet은 계산하는 방법이 있습니다.
cidrsubnet(prefix, newbits, netnum) 인데 newbits는 새로 추가할 비트 수이고, netnum은 네트워크 번호를 의미합니다.
예를 들어 prefix는 10.0.0.0/21이고, newbits는 3, netnum은 2라고 가정할 때, newbits는 3이니까 네트워크를 더 작은 서브넷으로 나누기 위해 3비트가 추가됩니다. 즉 새 서브넷은 21 + 3 = 24가 됩니다.
netnum은 서브넷의 순서를 나타냅니다. 2이기 때문에 세 번째 서브넷부터 시작합니다.
그래서 10.0.2.0/24가 됩니다!
nat1.tf
resource "ncloud_nat_gateway" "nat_gateway_scn_02" {
vpc_no = ncloud_vpc.vpc_vpc.id
subnet_no = ncloud_subnet.subnet_pub-nat1.id
zone = "KR-1"
name = var.name_pub-nat1
}
# Route Table
resource "ncloud_route" "route_scn_02_nat" {
route_table_no = ncloud_vpc.vpc_vpc.default_private_route_table_no
destination_cidr_block = "0.0.0.0/0"
target_type = "NATGW"
// NATGW (NAT Gateway) | VPCPEERING (VPC Peering) | VGW (Virtual Private Gateway).
target_name = ncloud_nat_gateway.nat_gateway_scn_02.name
target_no = ncloud_nat_gateway.nat_gateway_scn_02.id
}
나트 게이트웨이를 생성하는 코드입니다. 나트 게이트웨이 생성 후에 "ncloud_route" 리소스를 이용해서 private 라우트 테이블을 "0.0.0.0/0"으로 전체 접속으로 나트 게이트웨이와 연결해주는 코드도 추가되었습니다.
nks.tf
쿠버네티스 코드입니다.
resource "ncloud_nks_cluster" "cluster" {
cluster_type = "SVR.VNKS.STAND.C002.M008.NET.SSD.B050.G002"
k8s_version = data.ncloud_nks_versions.version.versions.0.value
login_key_name = ncloud_login_key.loginkey.key_name
name = "sample-cluster"
lb_private_subnet_no = ncloud_subnet.subnet_pri-lb1.id
lb_public_subnet_no = ncloud_subnet.subnet_pub-lb1.id
kube_network_plugin = "cilium"
subnet_no_list = [ ncloud_subnet.subnet_pri1.id ]
vpc_no = ncloud_vpc.vpc_vpc.id
zone = "KR-1"
log {
audit = true
}
}
data "ncloud_nks_server_images" "image"{
hypervisor_code = "XEN"
filter {
name = "label"
values = ["ubuntu-20.04"]
regex = true
}
}
data "ncloud_nks_server_products" "nks_products"{
software_code = data.ncloud_nks_server_images.image.images[0].value
zone = "KR-1"
filter {
name = "product_type"
values = [ "STAND"]
}
filter {
name = "cpu_count"
values = [ "2"]
}
filter {
name = "memory_size"
values = [ "8GB" ]
}
}
resource "ncloud_nks_node_pool" "node_pool" {
cluster_uuid = ncloud_nks_cluster.cluster.uuid
node_pool_name = "pool1"
node_count = 1
software_code = data.ncloud_nks_server_images.image.images[0].value
product_code = data.ncloud_nks_server_products.nks_products.products[0].value
subnet_no_list = [ncloud_subnet.subnet_pri1.id]
autoscale {
enabled = true
min = 1
max = 2
}
}
data "ncloud_nks_versions" "version" {
filter {
name = "value"
values = [var.nks_version]
regex = true
}
}
resource "ncloud_login_key" "loginkey" {
key_name = var.login_key
}
variables.tf (추가)
variable name_vpc {
default = "agame-dev-vpc"
}
variable name_pri1 {
default = "agame-dev-pri1"
}
variable name_pub1 {
default = "agame-dev-pub1"
}
variable name_pri-db1 {
default = "agame-dev-pri-db1"
}
variable name_pub-nat1 {
default = "agame-dev-pub-nat1"
}
variable name_pub-lb1 {
default = "agame-dev-pub-lb1"
}
variable name_pri-lb1 {
default = "agame-dev-pri-lb1"
}
variable client_ip {
default = "3.3.3.3"
}
variable access_key {
default = "ncp_iam_BPAMKR5XsAr52VzPluqr"
}
variable secret_key {
default = "ncp_iam_BPKMKR1DwyNq8NImKqZpe759MRZ3F6aeKD"
}
variable nks_version {
default = "1.28"
}
variable name_scn_02 {
default = "tf-scn02"
}
variable login_key {
default = "agame-k8s12"
}
versions.tf
terraform {
required_providers {
ncloud = {
source = "navercloudplatform/ncloud"
}
}
required_version = ">= 0.13"
}
terraform init, terraform plan, terraform apply --auto-approve를 실행해주면
이렇게 시간이 조금 걸립니다. 편하게 기다립시다.
오래걸렸습니다.
3-1. 쿠버네티스의 UUID로 cli와 연결
ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid <UUID> --output kubeconfig.yaml
현재 디렉토리에 yaml 환경 설정 파일이 생겼습니다.
환경 변수 설정
export KUBECONFIG=/Users/ganghyeong-geun/Desktop/work/cloud/ncloud-study-0818/FIN_CLI_1.1.20_20240620/cli_linux/kubeconfig.yaml
config 파일을 현재 디렉토리의 yaml 파일로 지정하면
kubectl get nodes
NAME STATUS ROLES AGE VERSION
pool1-w-5ilf Ready <none> 16m v1.28.10
pool1-w-5ilj Ready <none> 5m41s v1.28.10
3-2. 쿠버네티스에 게임 올리기
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2048
spec:
selector:
matchLabels:
app.kubernetes.io/name: app-2048
replicas: 2
template:
metadata:
labels:
app.kubernetes.io/name: app-2048
spec:
containers:
- image: alexwhen/docker-2048
name: app-2048
ports:
- containerPort: 80
EOF
expose 명령어로 80번 포트로 외부에서 접속하는 것 허용
kubectl expose deployment deployment-2048 --port=80 --type=LoadBalancer
또는 콘솔에서 확인가능합니다.
드레그한 부분을 자신의 브라우저 주소창에 붙여넣기 하여 게임이 실행되는지 확인합니다.
게임이 잘 올라간 것을 확인했으니 이제 terraform destroy --auto-approve 명령어를 입력해서 삭제해줍니다.
삭제에도 시간이 조금 걸립니다. 차분히 기다리시고, 완료되었다면 콘솔에서 LoadBalancer, Target group, NKS, Server, ACG, Network Interface 등 관련된 리소스들이 삭제되었는지 확인하시고 아니라면 직접 삭제하시면 됩니다.
'[Cloud] > [NCP]' 카테고리의 다른 글
[NCP] 쿠버네티스 콘솔로 생성(NKS) (0) | 2024.08.19 |
---|---|
[NCP] ncp cli 맥에서 경로 설정하기 (0) | 2024.08.19 |
[NCP] NCP 로드밸런서 생성 및 연결 (0) | 2024.08.17 |
[NCP] NCP CLI로 VPC, 인스턴스 접근하기(macOS) (0) | 2024.08.16 |
[NCP] NCP Global DNS(도메인을 NCP 인스턴스와 연결하기) (0) | 2024.08.15 |