Dev./Terraform

Terraform: nks resource

Ivan'show 2023. 9. 23.
728x90
반응형

NCP 와 k8s

nks 는 애플리케이션 컨테이너화, 배포, 스케일링 그리고 관리를 자동화하는 오픈 소스 플랫폼이다. kubernetes 환경을 구축하고, 배포 및 관리 그리고 클러스터 자동 확장이 가능하다.  

# Resource: ncloud_nks_cluster
https://registry.terraform.io/providers/NaverCloudPlatform/ncloud/latest/docs/resources/nks_cluster

기본적인 작업을 마치고 plan 하는 과정에서 계속 에러가 발생했는데, NCP 에서 k8s 기능을 사용하려면 우선 동의를 하고 시작해야한다.

# error
│ Error: Status: 403 Forbidden, Body: {"error":{"errorCode":403,"message":"Please agree to the terms of service."},"timestamp":"2023-09-05T02:22:36.212Z"}
│ 
│   with data.ncloud_nks_versions.version,
│   on main.tf line 63, in data "ncloud_nks_versions" "version":
│   63: data "ncloud_nks_versions" "version" { 
│

클러스터 리소스 생성 feat. terraform

Naver Cloud Provider

terraform {
  required_providers {
    ncloud = {
      source = "NaverCloudPlatform/ncloud"
    }
    ssh = {
      source = "loafoe/ssh"
      version = "2.6.0"
    }
  }
  required_version = ">= 0.13"
}

provider "ncloud" {
  access_key  = var.NCP_ACCESS_KEY
  secret_key  = var.NCP_SECRET_KEY
  region      = var.region
  site        = var.site
  support_vpc = var.support_vpc
}

ncloud, ssh

provider "ncloud" {
  access_key  = var.NCP_ACCESS_KEY
  secret_key  = var.NCP_SECRET_KEY
  region      = var.region
  site        = var.site
  support_vpc = var.support_vpc
}

provider "ssh" {}

vpn & subnet

resource "ncloud_vpc" "vpc" {
  name            = "vpc"
  ipv4_cidr_block = "10.10.0.0/16" # staging & production 과 겹치지 않게
}

resource "ncloud_subnet" "subnet" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 8, 5)
  zone           = "KR-1"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PUBLIC"
  name           = "k8s-subnet-01"
  usage_type     = "GEN"
}

resource "ncloud_subnet" "subnet_lb" {
  vpc_no         = ncloud_vpc.vpc.id
  subnet         = cidrsubnet(ncloud_vpc.vpc.ipv4_cidr_block, 8, 6)
  zone           = "KR-1"
  network_acl_no = ncloud_vpc.vpc.default_network_acl_no
  subnet_type    = "PRIVATE"
  name           = "k8s-subnet-lb"
  usage_type     = "LOADB"
}

cidrsubnet 를 사용하여 주소값을 자동으로 돌려서 설정할 수 있게 할 수 있다. 복잡하게 하나하나 설정하지 않아도 된다. be 서브넷과 로드 밸런서 서브넷은 네트워크 번호로 구분 지어서 설정한다.

cidrsubnet(prefix, newbits, netnum)
<https://developer.hashicorp.com/terraform/language/functions/cidrsubnet>

이해하기 쉽게 사진은 AWS 에서 제공하는 아키텍쳐 그림을 참고하자.

nks version, login key

# k8s 는 업데이트가 잦고 이전 버전은 지원하지 않기 때문에 최신버전을 사용하는게 좋다.
data "ncloud_nks_versions" "version" { 
  filter {
    name = "value"
    values = ["1.25.8"]
    regex = true
  }
}

resource "ncloud_login_key" "loginkey" {
  key_name = "k8s-login-key"
}

version release

<https://guide.ncloud-docs.com/docs/k8s-k8srelease>

nks cluster

resource "ncloud_nks_cluster" "cluster" { # minikube 로 했었던 클러스터
  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                        = "ncp-k8s-cluster"
  lb_private_subnet_no        = ncloud_subnet.subnet_lb.id
  kube_network_plugin         = "cilium"
  subnet_no_list              = [ ncloud_subnet.subnet.id ]
  public_network              = true
  vpc_no                      = ncloud_vpc.vpc.id
  zone                        = "KR-1"
  log {
    audit = true
  }
}

node pool >> image, product

data "ncloud_server_image" "image" {
  filter {
    name = "product_name"
    values = ["ubuntu-20.04"]
  }
}

data "ncloud_server_product" "product" {
  server_image_product_code = data.ncloud_server_image.image.product_code

  filter {
    name = "product_type"
    values = [ "STAND" ]
  }

  filter {
    name = "cpu_count"
    values = [ 2 ]
  }

  filter {
    name = "memory_size"
    values = [ "8GB" ]
  }

  filter {
    name = "product_code"
    values = [ "SSD" ]
    regex = true
  }
}

resource "ncloud_nks_node_pool" "node_pool" {
  cluster_uuid   = ncloud_nks_cluster.cluster.uuid
  node_pool_name = "k8s-node-pool"
  node_count     = 1
  product_code   = data.ncloud_server_product.product.product_code
#   subnet_no      = [ ncloud_subnet.subnet.id ]

  autoscale {
    enabled = true
    min = 1
    max = 2
  }
  lifecycle {
    ignore_changes = [ node_count, subnet_no_list ]
  }
}

nks, 쿠버네티스의 클러스터 생성은 상당히 오랜 시간이 걸리기 때문에 테라폼에서 재생성 되는 시간을 줄여야 한다.

  lifecycle {
    ignore_changes = [ node_count, subnet_no_list ]
  }
terraform init
terraform plan
terraform apply

 

 

네이버 클라우드 플랫폼 - 서버에 클러스터가 생성된 것을 확인 할 수 있다.

728x90
반응형

'Dev. > Terraform' 카테고리의 다른 글

Terraform: AWS 서버구축2  (0) 2023.09.10
Terraform: AWS ssh connection  (0) 2023.09.09
Terraform: AWS 서버구축  (0) 2023.09.08
Terraform: Status 가 꼬이는 현상  (0) 2023.09.07
Terraform: Separating  (0) 2023.09.06

댓글