# 테라폼 파일로 생성
1
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]#
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...)만 허용합니다
안됨.
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 삭제
감사합니다.