<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
실무에서는 네트워크는 아래를 참고해서 작업한다.
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일 현재
생성과 접속 법
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 로 접속 해보자
잘된다.
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> 같이 볼만한 사이트
<11> 다음은 컨테이너 레지스트리 사용하기
https://brunch.co.kr/@topasvga/2095
감사합니다.