brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Dec 21. 2021

46. 쿠버네티스 클러스터 만들고 게임 올리기-1/5

<1> 네이버 클라우드 쿠버네티스에 간단한 게임 하나 올려 봅시다 ^^

<2>  VPC 네트워크 설정 (필수)

<3> 명령어 서버를 위한 서버 보안 그룹과 서버 생성 

<4>  명령 서버에 kubectl 설치하기 (선택)

<5>  콘솔로 네이버 쿠버네티스  클러스터 만들기 (필수)

<6>  웹 서비스 1개 올리기

<7> 게임 서비스 1개 올리기

<8> 실습 비용

<9> 워커 노드를 3개에서 2개로 수정해보자

<10> 같이 볼만한 사이트

<11> 다음은  컨테이너 레지스트리  사용하기 




<1> 네이버 클라우드 쿠버네티스에 간단한 게임 하나 올려 봅시다 ^^


1

순서는?

네트워크를 만들고

명령 내릴 서버 생성

콘솔로 NKS 클러스터를 만들고

게임 1개 올려 봅시다.


네트워크를 만들고,  콘솔로 NKS 클러스터를 만들고, 명령 내릴 서버 생성, 게임 1개 만들어 올려도 된다.


2

네트워크 만들기

VPC 네트워크를 생성한다. 

서브넷을 생성한다

로드밸런서 서브넷을 생성한다.


3

네이버 쿠버네티스 클러스터 만들기


4

명령 내릴 서버 만들기


5

게임 올리기


6

네이버 쿠버네티스 서비스가 쿠버네티스 1.20  버전을 지원을 지원합니다. ( 2021년 12월 현재)

네이버 쿠버네티스 서비스가 쿠버네티스 1.21  버전을 지원을 지원합니다. ( 2022년 3월 현재)






<2>  VPC 네트워크 설정 (필수)


1

단순 테스트는  Puliblic , Private Subnet  , LB  Subnet 1개만 만들고 테스트한다.

VPC > VPC Management > VPC 셍성 


2

VPC 네트워크를 생성한다.

blockgame-dev-vpc

개발은

10.0.0.0/22 

를 할당한다.

(2분 걸림)


3

Subnet?


Private subnet  1개 생성?


blockgame-dev-pri1-subnet

10.0.0.0/24

KR-1

private로



4

Public subnet  1개 생성?


blockgame-dev-pub1-subnet

10.0.2.0/25

KR-1

public



5

Load Balancer Subnet  1개 생성?


blockgame-dev-lb1-subnet

10.0.3.128/26

KR-1

Private

LoadBalancer



or



1

다음은  Puliblic , Private  Subnet , LB  Subnet  2개씩 만들어 이중화 네트워크 구성하는 법이다.

// 위에서 네트워크를 만들었다면 넘어가자~



2

VPC 네트워크를 생성한다.

blockgame-dev-vpc

개발은

10.0.0.0/22

를 할당한다.



3

Subnet?


Private subnet  2개 생성?


blockgame-dev-pri1-subnet

10.0.0.0/24

KR-1

private로


blockgame-dev-pri2-subnet

10.0.1.0/24

KR-2

private로


4

Public subnet  2개 생성?


blockgame-dev-pub1-subnet

10.0.2.0/25

KR-1

public


blockgame-dev-pub2-subnet

10.0.2.128/25

KR-2

public



5

DB subnet  2개 생성?


blockgame-dev-db1-subnet

10.0.3.0/26

KR-1

private로


blockgame-dev-db2-subnet

10.0.3.64/26

KR-2

private로



6

Load Balancer Subnet  2개 생성?


blockgame-dev-lb1-subnet

10.0.3.128/26

KR-1

Private

LoadBalancer


blockgame-dev-lb2-subnet

10.0.3.192/26

KR-2

Private

LoadBalancer



7

실무에서는 네트워크는 아래를 참고해서 작업한다.

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




8

실무에서는 아래처럼 IP 블록을 미리 정한다.

정한 범위에서 할당한다.

 



9

클릭 몇 번만 하면 네트워크가 만들어진다~~~~

IDC 2 중화 구축된 상태


                 



10

디폴트 NACL  수정?

NACL은 네트워크 서브넷에 적용된다.

NACL = Network Access Control List


VPC > Network ACL > ACL Rule > blockgame-dev-vpc-default-acl


blockgame-dev-vcp-default-acl

Rule 설정

우선순위 10부터 지정

inbound는 내 ip만 ssh ,80 , icmp  허용

outbound는   0.0.0.0/0  (any)에 대해 icmp, tcp/udp 1-65535 허용



11

사설 서브넷 서버가 인터넷이 되기 위해 NAT Gateway 생성

VPC > NAT Gateway  >  NAT Gateway생성  

nat1

nat2 생성  (선택)



12

Private Route table 수정

VPC > Route table > blockgame-dev-vpc-default-private-table   > Route Table 설정 > 

0.0.0.0/0  NATGW nat1




<3> 명령어 서버를 위한 서버 보안 그룹과 서버 생성 


1

서버 생성전에 보안 그룹  ACG (Access Control Group)을 생성한다.

서버에 적용하는 것이  ACG이다.

서버 생성 시 보안 그룹을 지정하기 때문이다.


2

Server  클릭  > ACG  > ACG 생성 >

command-server1-acg


인바운드 허용

외부에서 명령 서버에 ssh (22) 접근 허용

inbound  0.0.0.0/0   22

inbound  0.0.0.0/0   3000

inbound  0.0.0.0/0  4000

inbound  0.0.0.0/0  5000


명령 서버에서 외부 파일을 다운로드하여야 하므로 ACG에 나가는 포트를 열어준다.

TCP 0.0.0.0  1-65535 허용

UDP 0.0.0.0  1-65535 허용

ICMP 0.0.0.0 허용

적용


3

서버 생성?

Server > 서버 생성

command-server1

Standard

public에 생성

command-server1

추가

새로운 공인 IP 할당

다음

새로운 인증키 생성

command-server1-key

다음

command-server1.acg

다음 > 서버 생성

10분 소요



4

ROOT  암호를 알기 위해?

관리자 비밀번호 확인

확인


5

putty로 서버 로그인




<4>  명령 서버에 kubectl 설치하기


1-1

다운 받아 설치하기

다음 장에  CURL로  KUBECTL  다운로드하여 사용하는 법도 있다.

KUBECTL은 쿠버네티스에 명령을 내리는 명령어 툴이다.


or


1-2

docker  설치법


cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg

https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF


yum install -y kubectl

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum install -y docker-ce

systemctl start docker



docker  설치법





<5>  콘솔로  네이버 쿠버네티스 서비스 클러스터 만들기 (필수)


1

컨테이너를 올릴 본체 서버?를 만드는 과정입니다.

본체 서버를 워커 노드라 부릅니다. =  일꾼들이 있는 서버.


2

콘솔 로그온 > Platform을  VPC 변경한다.

 Products & Services > Server > Kubernetes Service


서비스 > compute >  kubernetes  이용신청

서비스 > compute >  kubernetes   >  생성하기


3

blockgame-dev-nks1

2개의 버전을  지원한다.  

1.20  버전을 지원한다 - 2021년 12월 현재

1.20.13

1.19.16


private subnet 선택

노드수 3

추가


4

default-pool


5

node  수?

테스트 환경에서는 비용을 생각해서 node를 2대로 해도 좋다.

나는 3 개로 한다.  (본체 서버 3대로 만든다)

추가


6

서버 인증키

다음 > 생성하기

(20분 소요)



7

node 3개로 생성 한 경우  클러스터

접속 가이드 > 가이드 보기  클릭



8

node 4개로 생성한 경우 노드풀  (20분 소요)




9

설치후 

설정법을 확인하자.

접속법이 IAM 설정법으로 변경 됨. 2022년 3월 1일 현재


생성과 접속 법

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



10

 kubectl get nodes

[root@command-server1 ~]# kubectl get nodes

NAME                     STATUS   ROLES    AGE   VERSION

nks-default-pool-w-u5z   Ready    <none>   54m   v1.20.13

nks-default-pool-w-u60   Ready    <none>   54m   v1.20.13

nks-default-pool-w-u61   Ready    <none>   54m   v1.20.13







<6>  웹 서비스 1개 올리기


1

kubectl get no,deploy,rs,pod,svc,ep


본체 서버를 노드라고 합니다.

NODES

NO 로 볼수 있습니다. 3대가 있네요~  본체가 3대


[root@command-server1 ~]# kubectl get no,deploy,rs,pod,svc,ep


NAME                          STATUS   ROLES    AGE   VERSION

node/nks-default-pool-w-u5z   Ready    <none>   70m   v1.20.13

node/nks-default-pool-w-u60   Ready    <none>   70m   v1.20.13

node/nks-default-pool-w-u61   Ready    <none>   70m   v1.20.13


NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   198.19.128.1   <none>        443/TCP   70m


NAME                   ENDPOINTS                                   AGE

endpoints/kubernetes   10.0.0.6:6443,10.0.0.7:6443,10.0.0.8:6443   70m



2

cat <<EOF | kubectl create -f -

apiVersion: v1

kind: Pod

metadata:

  name: nginx-pod

  labels:

    app: nginx-app

spec:

  containers:

  - name: nginx-container

    image: nginx

    ports:

    - containerPort: 80

EOF




3

POD가 서버 입니다.

서버 1대가 돌아가네요~


kubectl get pods

[root@command-server1 ~]# kubectl get pods

NAME        READY   STATUS    RESTARTS   AGE

nginx-pod   1/1     Running   0          21s


// 삭제 필요시

kubectl delete pod nginx-pod



4

디플로이먼트 생성?

nginx  이미지로  websrv  pod를 만들어보자~

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


웹서버 4대가 바로 만들어 집니다~


5

kubectl get pods

[root@command-server1 ~]# kubectl get pods

NAME                      READY   STATUS    RESTARTS   AGE

websrv-684ff84f56-2zxmg   1/1     Running   0          22s

websrv-684ff84f56-fn9l7   1/1     Running   0          22s

websrv-684ff84f56-jfhwl   1/1     Running   0          22s

websrv-684ff84f56-kvxlk   1/1     Running   0          22s



6

외부 노출 ?

로드 밸런서 만드는 법입니다.  L4 만들기 1줄~


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



7

만들어진 리소스 확인


kubectl get deploy,rs,pod,svc,ep


[root@command-server1 ~]# kubectl get deploy,rs,pod,svc,ep


NAME                     READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/websrv   4/4     4            4           72s


NAME                                DESIRED   CURRENT   READY   AGE

replicaset.apps/websrv-684ff84f56   4         4         4       72s


NAME                          READY   STATUS    RESTARTS   AGE

pod/websrv-684ff84f56-2zxmg   1/1     Running   0          72s

pod/websrv-684ff84f56-fn9l7   1/1     Running   0          72s

pod/websrv-684ff84f56-jfhwl   1/1     Running   0          72s

pod/websrv-684ff84f56-kvxlk   1/1     Running   0          72s


NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)        AGE

service/kubernetes   ClusterIP      198.19.128.1     <none>                           443/TCP        79m

service/websrv       LoadBalancer   198.19.150.172   default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com   80:31749/TCP   34s


NAME                   ENDPOINTS                                                    AGE

endpoints/kubernetes   10.0.0.6:6443,10.0.0.7:6443,10.0.0.8:6443                    79m

endpoints/websrv       198.18.1.149:80,198.18.2.198:80,198.18.2.31:80 + 1 more...   34s



8

service/websrv 

웹브라우저로  L4 로  접속 해보자

잘된다.


http://default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com/



dig default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com  +short


[root@command-server1 ~]# dig default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com  +short

101.79.15.251



9

kubectl get svc

[root@command-server1 ~]# kubectl get svc

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                            PORT(S)        AGE

kubernetes   ClusterIP      198.19.128.1     <none>                           443/TCP        83m

websrv       LoadBalancer   198.19.150.172   default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com   80:31749/TCP   4m54s



kubectl describe svc websrv


[root@command-server1 ~]# kubectl describe svc websrv

Name:                     websrv

Namespace:                default

Labels:                   app=websrv

Annotations:              <none>

Selector:                 app=websrv

Type:                     LoadBalancer

IP Families:              <none>

IP:                       198.19.150.172

IPs:                      198.19.150.172

LoadBalancer Ingress:     default-websrv-1004b-9456247-7a2a46addaec.kr.lb.naverncp.com

Port:                     <unset>  80/TCP

TargetPort:               80/TCP

NodePort:                 <unset>  31749/TCP

Endpoints:                198.18.1.149:80,198.18.2.198:80,198.18.2.31:80 + 1 more...

Session Affinity:         None

External Traffic Policy:  Cluster

Events:

  Type    Reason                Age    From                Message

  ----    ------                ----   ----                -------

  Normal  EnsuringLoadBalancer  5m34s  service-controller  Ensuring load balancer

  Normal  EnsuredLoadBalancer   5m3s   service-controller  Ensured load balancer



10

서버수 조절

2대로 조절해보자~


kubectl scale deployment websrv --replicas=2


 kubectl get pods


[root@command-server1 ~]# kubectl get pods

NAME                      READY   STATUS    RESTARTS   AGE

websrv-684ff84f56-2zxmg   1/1     Running   0          7m53s

websrv-684ff84f56-fn9l7   1/1     Running   0          7m53s



11

접속자 IP 확인?

아래 명령서 실행시킬 웹브라우저로 서비스 접속해본다.

아래처럼 로그가 나온다.

kubectl logs -l app=websrv -f --max-log-requests 8


참고로 , 접속자  ip는  198.18.1.201  EKS  네트워크 IP로 보인다~


198.18.1.201 - - [23/Dec/2021:06:35:40 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-"


12

삭제

kubectl delete deploy,svc websrv





<7> 게임 서비스 1개 올리기


1

게임 올리기?


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




2

lb

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



3

kubectl get svc,ep


[root@command-server1 ~]# kubectl get svc,ep

NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP           PORT(S)        AGE

service/deployment-2048   LoadBalancer   198.19.196.247   default-deployment-2048-6fda8-9456376-d4b72b071b89.kr.lb.naverncp.com   80:31156/TCP   74s

service/kubernetes        ClusterIP      198.19.128.1     <none>              443/TCP        90m


NAME                        ENDPOINTS                                   AGE

endpoints/deployment-2048   198.18.2.37:80,198.18.2.65:80               74s

endpoints/kubernetes        10.0.0.6:6443,10.0.0.7:6443,10.0.0.8:6443   90m



4

웹브라우저로 접속

default-deployment-2048-6fda8-9456376-d4b72b071b89.kr.lb.naverncp.com


5

게임이 떴다

방향키로 같은 숫자 합치는 게임입니다.^^



6

pod  수 늘리기 (서버수 늘리기   2대에서 4대로 늘리자~)


kubectl get pods


[root@command-server1 ~]# kubectl get pods

NAME                               READY   STATUS    RESTARTS   AGE

deployment-2048-79785cfdff-bxzld   1/1     Running   0          4m17s

deployment-2048-79785cfdff-s245p   1/1     Running   0          4m17s



kubectl scale deployment deployment-2048 --replicas=4


[root@command-server1 ~]# kubectl scale deployment deployment-2048 --replicas=4

deployment.apps/deployment-2048 scaled


kubectl get pods


[root@command-server1 ~]# kubectl get pods

NAME                               READY   STATUS              RESTARTS   AGE

deployment-2048-79785cfdff-46zmt   0/1     ContainerCreating   0          2s

deployment-2048-79785cfdff-bxzld   1/1     Running             0          4m32s

deployment-2048-79785cfdff-fqh7r   0/1     ContainerCreating   0          2s

deployment-2048-79785cfdff-s245p   1/1     Running             0          4m32s



6

dns에서 cname으로 연결

원하는 도메인으로 접속 하면 된다.

www  를   CNAME  으로   로드밸런서를 연결하자


www.best10game.com

default-deployment-2048-6fda8-9456376-d4b72b071b89.kr.lb.naverncp.com



7

삭제

kubectl delete deploy,svc deployment-2048


8

다음번엔  컨테이너 레지스트리  이미지를 사용해 서비스를 올려보는 부분을 해보자~

실무에서는 레지스트리에 올려놓고 해당 이미지를 불러 사용한다.




<8> 비용 확인


1

초기 구축시 서버 사양을 낮게하고, 노드도 2개로 구축하면 하루에 2만원이 안나온다.

NAT 게이트웨이도 1개만 구축하자.

주말 실습하고 서버를 지우자~


하루에 1만 2천원 나왔다.

나는 서버 사양을 좋게 하고, 노드도 3개를 구축했다.   

NAT 게이트웨이도 2개 구축해봤다.

하루후 비용 확인




쿠버네티스를 사용해서  VPC가 1만원 나왔다.  

하루 1만원,  노드수 3대, 사양 vCPU 6개, 24기가 메모리


당일 사용한 비용은 하루 이후 확인 가능하다.

1일후 확인 

1만 2천원



당일 사용한 비용은 하루 이후 확인 가능하다.

2일후 확인

3만 3천원 

하루 평균 2만원 비용 

서버가 제일 비용이 많이 나온다. 2만 3천원



2

3 일까지 비용  6만원

하루 2만원 나온다.




3

신규 가입하면 3개월간 10만원을 사용할수 있도록 무료로 제공 된다.

주말 실습하는데 충분하다~

1일  2만원 * 2일 = 4만원.


4

기타

야간에는 서버를 정지 시켜놓으면 비용이 적게 나갑니다.






<9> 워커노드를 3개에서 2개로 수정해보자


2개로 바로 수정은 안되나 봐요.

고객 지원에 문의 해야 한다.






<10> 같이 볼만한 사이트


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




<11> 다음은  컨테이너 레지스트리  사용하기 


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


감사합니다.


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