[Cloud]/[NCP]

[NCP] 테라폼으로 NCP에 쿠버네티스 설치

마린독 2024. 8. 20. 01:11
728x90

먼저 자신의 컴퓨터 운영체제에 맞는 테라폼을 설치합니다.

 

 

https://developer.hashicorp.com/terraform/install

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

 

 

1. ncp cli 연결

 

 

우선 내 계정과 ncp cli를 연결합니다.

 

ncloud configure

 

 

configure

 

 

명령어 입력해서 잘 실행되는지 확인

ncloud vserver getRegionList

 

 

 

 

안되는 경우)

 

https://hgk5722.tistory.com/562

 

[NCP] ncp cli 맥에서 경로 설정하기

ncp cli로 쿠버네티스를 실행하려다 사용하던 linux_cli가 들어있는 폴더의 위치를 바꿨는데(Download -> ) ncloud 파일 실행이 안되었습니다. 그 문제를 해결한 과정을 정리하였습니다.   cli_linux 폴더

hgk5722.tistory.com

 

 

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이 생성되어 있습니다.

 

 

Apply complete!

 

 

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"
}

 

 

서브넷 6개 생성

 

 

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를 실행해주면

 

 

 

 

이렇게 시간이 조금 걸립니다. 편하게 기다립시다.

 

 

 

 

오래걸렸습니다.

 

 

노드 2개 생성

 

 

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 등 관련된 리소스들이 삭제되었는지 확인하시고 아니라면 직접 삭제하시면 됩니다.

 

 

728x90