brunch

NKS 4탄-1. 테라폼으로 생성,NKS에 게임 올리기

by Master Seo

# 개발용 싱글 AZ용 NKS이다.


game 서비스 만들어보자.

비용상 NAT를 구성하지 않는다.

클러스터는 Private에 구성한다.

DB 서브넷은 구성하지 않는다.




<1> 콘솔로 명령서버 네트워크와 ncp-game4-com 명령서버 1대 만들기

<2> 테라폼으로 네트워크와 NKS 생성 하자.

<3> 생성 확인

<4> NAT 사용하기

<5> 게임 올리기

<6> NKS 삭제



<1> 콘솔로 명령서버 네트워크와 ncp-game4-com 명령서버 1대 만들기



1

public 서브넷에 로키 리눅스로 개발자 명령서버 1대를 만들자.

명령을 내릴 서버에 로그온해 명령툴을 설치하자.


# 명령서버 네트워크 생성


ncp-game4-vpc

192.168.0.0/21


ncp-game4-pub1

192.168.0.0/24



# 명령서버 생성

Rocky Linux 8.10

Standard (필수)

vCPU 2개 , 메모리8GB 선택 (필수)

ncp-game4-com

새로운 공인 IP 할당


인증키 관리는 서버 관리 및 설정 변경 > 인증키 관리 에서 가능합니다.

불필요한 인증키는 삭제하세요. 리스트에 보여서 불편합니다.

Server 메뉴에 없어서 찾는 분이 있을거 같아 알려드립니다.


# 서버 로그인

root


passwd

g1!!



2

# 명령툴들 설치하기


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

2) ncloud configure

3) ncloud CLI 다운로드

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

5) # kubectl 명령어 설치

6) # alials 단축 명령어

7) 테라폼 유틸 설치




3

네이버 클라우드에 권한이 있어야 한다.

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


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

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


Access Key ID , Secret Key 복사해 두기


ncp_iam_xxxxxxxxxxx

ncp_iam_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx





4

# 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



최신버전

https://cli.ncloud-docs.com/docs/guide-clichange




5

# ncloud 권한 설정 - Access-key , Secret-key 입력


ncloud configure


Ncloud Access Key ID []: ncp_iam_BPAMKR4

Ncloud Secret Access Key []: ncp_iam_BPKMKR6EFfmXGEJ

Ncloud API URL (default:https://ncloud.apigw.ntruss.com) []: (그냥 엔터)




# 리전에 서버 리스트 확인하기

ncloud vserver getRegionList


https://cli.ncloud-docs.com/docs/cli-vserver-server-common-getregionlist


# MacOS를 사용할 때 자바 바이너리 파일이 실행이 안되는 문제도 발생해서 jdk17버전으로 수정하는 방법

https://hgk5722.tistory.com/560


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


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

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


cd /root/CLI_1.1.20_20240620/cli_linux

ncloud vserver getRegionList




# CLI 명령어들


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




6

# 사용을 위한 인증 = ncp-iam 설치


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

cd



매뉴얼

https://guide.ncloud-docs.com/docs/k8s-iam-auth-ncp-iam-authenticator





# NKS 클러스터 생성후 실행 , 클러스터의 ClusterUUID 필요함

# -clusterUuid는 콘솔에서 확인하자. 쿠버네티스 클러스터 UUID이다.



cd

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


ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid 916c52ad-daa8-449b-a2b0-c4a8b9aeabe7 --output kubeconfig.yaml

kubeconfig created successfully.




7

# 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



8

# alials 단축 명령어


vi ~/.bash_profile



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


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!


source ~/.bash_profile

k get nodes


# 동작하지 않음. 아직 클러스터 생성전




9

# 하시코프 테라폼 설치하기 (선택) , 테라폼 사용시만 설치


sudo yum install -y yum-utils shadow-utils

sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo

sudo yum -y install terraform

terraform -version



10

# 터미널 2 - 모니터링 하기


kw

kwn

# 클러스터 생성전이라 동작하지 않음.





<2> 테라폼으로 네트워크와 NKS 생성 하자.


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






1

테라폼 코드 다운로드


[root@ncp-game44-com ~]# 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_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"

}

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

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_pub1 {

default = "agame-dev-pub1"

}

variable name_pri1 {

default = "agame-dev-pri1"

}

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

}

variable secret_key {

default = "ncp_iam_BPKM6gFVJ0mFbGTc5"

}

variable nks_version {

default = "1.29"

}

variable name_scn_02 {

default = "tf-scn02"

}

variable login_key {

default = "agame11"

}

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

versions.tf

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

terraform {

required_providers {

ncloud = {

source = "navercloudplatform/ncloud"

}

}

required_version = ">= 0.13"

}



2

파일 5개중 4개만 사용 - 개발환경이라 nat는 비용 발생으로 제외


main.tf

nat.tf (생성하지 않음)

nks.tf

variables.tf

versions.tf



vi variables.tf

login 키 이름 수정 필요!!



terraform init

terraform plan

terraform apply -auto-approve



# 삭제

terraform destroy -auto-approve



# 여러번 실행시 로그인키 중복 오류 함.


vi variables.tf

login 키 이름 수정 필요!!


terraform apply -auto-approve


# 클러스터 생성에 17분 , 노드 생성에 11분 , 총 28분 걸린다.



ncloud_nks_cluster.cluster: Still creating... [16m51s elapsed]

ncloud_nks_cluster.cluster: Still creating... [17m1s elapsed]

ncloud_nks_cluster.cluster: Creation complete after 17m10s [id=60ef54df-1487-42f1-b71a-b17d7f89b729]


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 10m51s [id=9d946de5-4337-465b-a885-547e92cc626a:pool1]




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



3

결과

VPC 생성


클러스터 생성




4

인증


cd


ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid ce88e483-b057-4b92-b0cb-2cdb14101c28 --output kubeconfig.yaml



k get nodes

NAME STATUS ROLES AGE VERSION

pool1-w-65ff Ready <none> 55s v1.29.9




<3> 생성 확인


1

콘솔에서

네트워크 구축 확인 - NAT 구축 안함. 비용 절감.

70 subnet.png



2

NKS 구축 확인


1) 상세정보

80 nks.png



2) 노드풀

90 np.png



3) 노드

100 node.png




4) 노드 서버는 Private 에 생성됨.

NAT가 되어야 인터넷이 됨. 참조.

현재 서비스 가능한 네트워크는 아니다.


110 node-private1.png



3

k get nodes



NAME STATUS ROLES AGE VERSION

pool1-w-5082 Ready <none> 3m41s v1.29.9

pool1-w-65ff Ready <none> 18m v1.29.9







<4> NAT 사용하기


1

전체 NAT 까지 있는 테라폼 코드 (참조)


전체 네트워크를 구성하고, 서비스까지 올려보자.




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





<5> deployment-2048 게임 올리기


1


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



# 클래식 로드 밸런서 연결

# 외부에서 접속

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




2

콘솔에서 사설 라우팅 테이블에 0.0.0.0/0 NAT1 설정을 하면 pod들이 서비스 가능해진다.



3

kw로 모니터링하기


모니터링 상태




4

서비스 동작 확인




5

# 서버 20대로 늘리기

# pod 증가 시키기



k scale deployment deployment-2048 --replicas=20





6

# 애플리케이션 삭제


k delete deployment.apps/deployment-2048


k delete service/deployment-2048




1

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



2

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



3

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









<6> NKS 삭제


1

# 테라폼으로 삭제


웹서비스 삭제

kube-ops-view 삭제

NKS와 네트워크는 테라폼으로 삭제



terraform destroy -auto-approve



2

# 수동 삭제 순서


NKS 노드 삭제

클러스터 삭제

로드 밸런서 삭제

NATGW 삭제

프라이빗 라우팅테이블에 0.0.0.0/0 NAT1 삭제

서브넷 삭제

VPC 삭제



3

# 전체 다시 보기


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



다음

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


감사합니다.


keyword
매거진의 이전글NKS 3탄-1. 테라폼으로 서비스용 NKS만들기