brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Dec 27. 2024

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

개발용  싱글  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





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


source ~/.bash_profile


kubectl 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 생성 하자.


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 구축 안함. 비용 절감.



2

NKS 구축 확인


1) 상세정보



2) 노드풀



3) 노드




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

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

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




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 게임 올리기


0


cat <<EOF | k 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


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


감사합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari