brunch

4. 테라폼-네이버 클라우드-쿠버네티스 생성1

by Master Seo

# 테라폼 파일로 생성



<1> DB 라우팅 분리-새파일로-nks.tf 포함- 테라폼 생성하기

<2> 교육용 계정은 쿼터 제한 , 내계정은 잘됨.

<3> 명령서버에 툴들 설치




<1> DB 라우팅 분리-새파일로-nks.tf 포함- 테라폼 생성하기


1



슬라이드2.JPG
슬라이드3.JPG







root@quick1 db]# ls

main.tf nat.tf terraform.tfstate terraform.tfstate.backup var.tf ver.tf



rm -rf nks.tf



[root@ngame-web01-dev 6]# more *.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"

}

::::::::::::::

nat.tf

::::::::::::::

resource "ncloud_route_table" "route_table_pri1" {

name = var.name_pri1

vpc_no = ncloud_vpc.vpc_vpc.id

supported_subnet_type = "PRIVATE"

}

resource "ncloud_route_table_association" "subnet_pri-db1" {

route_table_no = ncloud_route_table.route_table_pri1.id

subnet_no = ncloud_subnet.subnet_pri-db1.id

}

# NAT Gateway

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

#route_table_no = ncloud_route_table.route_table_pri1.id

destination_cidr_block = "0.0.0.0/0"

target_type = "NATGW"

target_name = ncloud_nat_gateway.nat_gateway_scn_02.name

target_no = ncloud_nat_gateway.nat_gateway_scn_02.id

}

::::::::::::::

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

}

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

}

variable secret_key {

default = "ncp_iam_BPKLNrW50nQ"

}

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"

}




# 구버전





var.tf

access

secret

default = "1.32"



terraform init

terraform plan

terraform apply -auto-approve



잘됨


클러스터 18분

node_pool 10분


총 30분 걸림


https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1



ncloud_nks_cluster.cluster: Still creating... [18m10s elapsed]

ncloud_nks_cluster.cluster: Still creating... [18m20s elapsed]

ncloud_nks_cluster.cluster: Still creating... [18m30s elapsed]

ncloud_nks_cluster.cluster: Still creating... [18m40s elapsed]

ncloud_nks_cluster.cluster: Creation complete after 18m46s [id=e64eafc2-5a39-4483-9358-c6d4d831e0f1]

ncloud_nks_node_pool.node_pool: Creating...

ncloud_nks_node_pool.node_pool: Still creating... [00m10s elapsed]

ncloud_nks_node_pool.node_pool: Still creating... [00m20s elapsed]


ncloud_nks_node_pool.node_pool: Still creating... [10m30s elapsed]

ncloud_nks_node_pool.node_pool: Still creating... [10m40s elapsed]

ncloud_nks_node_pool.node_pool: Still creating... [10m50s elapsed]

ncloud_nks_node_pool.node_pool: Creation complete after 10m52s [id=e64eafc2-5a39-4483-9358-c6d4d831e0f1:pool1]

Apply complete! Resources: 15 added, 0 changed, 0 destroyed.

[root@com1 db]#







<2> 교육용 계정은 쿼터 제한 , 내계정은 잘됨.



1

교육용 계정 - 계속 안됨


│ Error: Status: 400 Bad Request, Body: {"error":{"errorCode":400,"statusCode":400,"message":"Bad Request","details":{"nodeCount":1,"nodePoolList":[{"name":"pool1","nodeCount":1,"subnetNoList":[251107],"softwareCode":"SW.VSVR.OS.LNX64.UBNTU.SVR2004.WRKND.B050","productCode":"SVR.VSVR.STAND.C002.M008.NET.SSD.B050.G002","autoscale":{"enabled":true,"max":2,"min":1}}],"quotaList":[{"restrictionCount":0,"resourceQuotaSequence":"24","policyNo":"1","generationCode":"G2","toBeCount":null,"resourceQuotaDetailSequence":"2","productTypeCodeName":"Standard","regionNo":"1","productTypeDetailCode":null,"productTypeDetailCodeName":"Standard","resourceTypeCode":"VSVR","usedCount":0,"productTypeCode":"STAND","reservedCount":1,"reservedTotalCount":0,"productType2Code":"STAND","contractProductRestrictionCount":0,"existingContractProductCount":0,"groupResult":{"restrictionCount":116,"resourceQuotaSequence":"24","policyNo":"1","toBeCount":null,"resourceTypeCode":"VSVR","usedCount":2,"regionNo":"1"},"isPossibleGroup":true,"isPossible":false}],"status":"ERROR_VM_LIMIT"}},"timestamp":"2025-08-17T13:32:29.678Z"}

│ with ncloud_nks_node_pool.node_pool,

│ on nks.tf line 79, in resource "ncloud_nks_node_pool" "node_pool":

│ 79: resource "ncloud_nks_node_pool" "node_pool" {



즉, Naver Cloud에서 현재 계정의 VSVR(Standard VM) 생성 한도에 걸려서 NKS 노드풀을 만들 수 없는 상황입니다.



왜 이런 에러가 나왔는가?

ncloud_nks_node_pool 은 내부적으로 VM(노드)을 생성해야 합니다.


그런데 현재 계정의 VM 한도(Quota) 가 꽉 차 있어서 더 이상 생성이 불가능합니다.


에러의 "isPossible":false 가 바로 “추가 생성 불가능”을 의미합니다.



수정1



resource "ncloud_nks_node_pool" "node_pool" {

cluster_uuid = ncloud_nks_cluster.cluster.id

name = "pool1"


# 노드 개수 (고정 1개만)

node_count = 1


# 사용할 서브넷 번호 (본인 환경 맞게 수정)

subnet_no_list = [251107]


# OS 및 VM 스펙 (본인 환경 맞게 수정)

software_code = "SW.VSVR.OS.LNX64.UBNTU.SVR2004.WRKND.B050"

product_code = "SVR.VSVR.STAND.C002.M008.NET.SSD.B050.G002"


# autoscale 비활성화

autoscale {

enabled = false

}

}




수정2

# 가장 작은 VM 스펙 (1 vCPU, 2GB RAM)

product_code = "SVR.VSVR.STAND.C001.M002.NET.SSD.B050.G002"




terraform apply -auto-approve


즉, NKS 클러스터/노드풀은 일반 VSVR 상품코드(SVR.VSVR... )가 아니라

NKS 전용 상품코드(SVR.VNKS...)만 허용합니다


안됨.




<3> 명령서버에 툴들 설치





1

# ncp-agame-com 명령서버 1대 만들기


2

# 명령툴들 설치하기

1) 네이버 클라우드에 권한이 있어야 한다.- access-key,secret-key

ncp_iam_BPA

ncp_iam_BPKMK

2) 서버 접속해 ncloud configure 실행

3) ncloud CLI 다운로드

4) # NKS 사용을 위한 인증 - ncp-iam 설치

5) # kubectl 명령어 설치

6) # alials 단축 명령어



1) 네이버 클라우드에 권한이 있어야 한다.- access-key,secret-key

access-key , secret-key를 알아야 한다.


오른쪽 위 본인 이름 > 이용관리 > 계정 관리 > 인증키 관리


신규 API 인증키 생성

https://www.ncloud.com/mypage/status/usage

Access Key ID , Secret Key 복사해 두기

ncp_iam_xxxxxxxxxxx

ncp_iam_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



2) 서버 접속해 ncloud configure 실행

# 서버 접속을 위한 보안 설정 = 나면 ssh 접속되게 하자.

Server > ACG 변경

agame-dev-vpc-default-acg

tcp 0.0.0.0/0 (전체) 80 추가 - 외부에서 웹접속되게 하기

tcp myip 클릭 22 추가 - 외부에서 ssh 접속용

tcp 10.0.0.0/8 22 추가 - 웹서버에서 WAS 서버 접속용

tcp 0.0.0.0/0 (전체) X 눌러 삭제

적용


# putty로 서버 로그인

명렁 서버의 공인IP 확인

root

passwd

나만의 passwd 로 입력



3) ncloud CLI 다운로드

아래내용 복사 , 붙여 넣기



wget https://www.ncloud.com/api/support/download/files/cli/CLI_1.1.23_20241121.zip

unzip CLI_1.1.23_20241121.zip

cd CLI_1.1.23_20241121/

cd cli_linux/

cp ncloud /usr/bin/

ncloud help




# 네이버 클라우드에 명령을 내릴수 있도록 권한 부여


ncloud configure


ncp_iam_xxxxxxxxxxx

ncp_iam_xxxxxxxxxxx

<엔터>



# 권한 있는지 확인 = 리전에 서버 리스트 확인하기

ncloud vserver getRegionList


oot@com1 cli_linux]# ncloud vserver getRegionList

{

"getRegionListResponse": {

"totalRows": 3,

"regionList": [

{

"regionCode": "KR",

"regionName": "Korea"

},

{

"regionCode": "SGN",

"regionName": "Singapore(New)"

},

{

"regionCode": "JPN",

"regionName": "Japan(New)"

}

],

"requestId": "f72a0b6a-454b-4b4c-b1bb-f3f34f6596d9",

"returnCode": "0",

"returnMessage": "success"

}

}




# 경로 오류시 아래 경로에서 실행해야 한다.

[root@agame-web01-dev ~]# ncloud vserver getRegionList

/usr/bin/ncloud: line 2: ./jre8/bin/java: No such file or directory

cd CLI_1.1.23_20241121/

cd cli_linux/

ncloud vserver getRegionList



4) # NKS 사용을 위한 인증 - ncp-iam 설치


cd

curl -o ncp-iam-authenticator -L https://github.com/NaverCloudPlatform/ncp-iam-authenticator/releases/latest/download/ncp-iam-authenticator_linux_amd64

chmod +x ./ncp-iam-authenticator

mkdir -p $HOME/bin && cp ./ncp-iam-authenticator $HOME/bin/ncp-iam-authenticator &&

export PATH=$PATH:$HOME/bin

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

ncp-iam-authenticator help



# clusterUuid는 콘솔에서 확인하자.

쿠버네티스 클러스터 UUID이다.

ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid xxxxxxxxxxxxxxxx --output kubeconfig.yaml




5) # kubectl 명령어 설치


curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl



6) # alials 단축 명령어



vi ~/.bash_profile

맨 아래줄에 아래 내용 3줄 추가


alias k='kubectl --kubeconfig="/root/kubeconfig.yaml"'

alias kw='watch -d kubectl get deploy,svc,pods --kubeconfig="/root/kubeconfig.yaml"'

alias kwn='watch -d kubectl get no,deploy,svc,pods --kubeconfig="/root/kubeconfig.yaml"'



저장하고 나옴

:wq!



# 반영 , 아래 2줄 실행



source ~/.bash_profile

k get nodes




# 터미널하나 더 띠우기 - 터미널 2 - 모니터링 하기

kwn




3

모니터링 툴 # kube-ops-view 설치해 보자.

# 파드와 노드증가를 시각화 하여 확인하는 Kubeops view 툴이다.

# git 다운로드 설치 - 80 접속



git clone https://codeberg.org/hjacobs/kube-ops-view.git

cd kube-ops-view/

k apply -k deploy



# 외부에서 kube-ops-view를 접속하기 위해서 Service Type을 LoadBalancer 로 변경한다.



k edit svc kube-ops-view


apiVersion: v1

kind: Service

metadata:

annotations:

name: kube-ops-view

spec:

....

sessionAffinity: None

type: LoadBalancer

status:

# type: ClusterIP 를 type: LoadBalancer 로 수정하면 바로 로드 밸런서 생성됨.

(3분 걸림)




콘솔에서 로드 밸런서 생성확인

웹 브라우저에서 해당 URL 로 접속

# 그림 설명

위 3개 cloudwatch-agent

아래 9개 kube-system- core dns , kube proxy




5

# 웹서버 생성, 로드 밸런서 생성 , 서버수 조정

k create deployment websrv --image=nginx --port=80 --replicas=4

k expose deployment websrv --port=80 --type=LoadBalancer

k scale deployment websrv --replicas=20



6

# 쿠버네티스에 게임 올리기 - deployment-2048 게임 올리기



cat <<EOF | k create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

name: deployment-2048

spec:

replicas: 2

selector:

matchLabels:

app.kubernetes.io/name: app-2048

template:

metadata:

labels:

app.kubernetes.io/name: app-2048

spec:

containers:

- name: app-2048

image: alexwhen/docker-2048

ports:

- containerPort: 80

EOF

k expose deployment deployment-2048 --port=80 --type=LoadBalancer




7

마리오 게임 올리기




cat <<EOF | k create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

name: mario

labels:

app: mario

spec:

replicas: 1

selector:

matchLabels:

app: mario

template:

metadata:

labels:

app: mario

spec:

containers:

- name: mario

image: pengbai/docker-supermario

---

apiVersion: v1

kind: Service

metadata:

name: mario

spec:

selector:

app: mario

ports:

- port: 80

targetPort: 8080

protocol: TCP

type: LoadBalancer

externalTrafficPolicy: Local

EOF




# 로드밸런서 도메인으로 웹사이트 접속



화면 캡춰해 제출




# 게임들

https://brunch.co.kr/@topasvga/4208



# 마리오 게임 삭제

k delete deploy,svc mario






8

삭제

API 키 삭제

클러스터 삭제

이미지 삭제

로드 밸런서 삭제

명령서버 삭제

VPC 삭제



감사합니다.

매거진의 이전글3. 테라폼-네이버 클라우드-실무 네트워크 생성