Agones 리서치 Part.5 - Fleet Autoscaler 만들기
이 가이드는 실제 부하를 기반으로 Fleet 크기를 자동으로 관리하는 자동확장을 설명합니다.
Quickstart: Create a Fleet Autoscaler을 정리한 글입니다.
0. 목표
- Agones 커스텀 리소스를 사용하여 쿠버네티스에서
Fleet Autoscaler
를 만듭니다. GameServer
를 할당할 때Fleet
이 확장되는 것을 확인합니다.- 할당된
GameServer
를 종료할 때Fleet
이 축소되는 것을 확인합니다. - 실시간으로 변경 사항을 적용하기 위해
Autoscaler
사양을 수정합니다.
1. Fleet
자동확장 만들기
다음 명령을 사용하여 Fleet Autoscaler
를 만들어 보겠습니다.
$ kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/fleetautoscaler.yaml
다음과 같은 성공 메시지가 표시되어야 합니다.
fleetautoscaler.autoscaling.agones.dev/simple-game-server-autoscaler created
이제 쿠버네티스 내부에 FleetAutoscaler
레코드가 생성되었습니다.
2. Autoscaler
상태 확인하기
다음 명령을 실행하여 Autoscaler
상태를 확인합니다:
$ kubectl describe fleetautoscaler simple-game-server-autoscaler
결과는 다음과 같습니다:
Name: simple-game-server-autoscaler
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"au
toscaling.agones.dev/v1","kind":"FleetAutoscaler","metadata":{"annotations":{},
"name":"simple-game-server-autoscaler","namespace":"default"},...
API Version: autoscaling.agones.dev/v1
Kind: FleetAutoscaler
Metadata:
Cluster Name:
Creation Timestamp: 2018-10-02T15:19:58Z
Generation: 1
Owner References:
API Version: autoscaling.agones.dev/v1
Block Owner Deletion: true
Controller: true
Kind: Fleet
Name: simple-game-server
UID: 9960762e-c656-11e8-933e-fa163e07a1d4
Resource Version: 6123197
Self Link: /apis/autoscaling.agones.dev/v1/namespaces/default/fleetautoscalers/simple-game-server-autoscaler
UID: 9fd0efa1-c656-11e8-933e-fa163e07a1d4
Spec:
Fleet Name: simple-game-server
Policy:
Buffer:
Buffer Size: 2
Max Replicas: 10
Min Replicas: 2
Type: Buffer
Status:
Able To Scale: true
Current Replicas: 2
Desired Replicas: 2
Last Scale Time: <nil>
Scaling Limited: false
Events: <none>
상태(확장 가능, 제한되지 않음), 마지막으로 Fleet
이 스케일링된 시간(없음의 경우 nil) 및
현재 및 원하는 Fleet
의 크기를 볼 수 있습니다.
Autoscaler
는 원하는 크기로 수정하며 작동하며 Fleet
은 해당 크기를 맞추기 위해
GameServer
인스턴스를 생성/삭제합니다. 수렴은 일반적으로 초 단위로 이루어집니다.
3. Fleet
에서 GameServer
할당하기
GameServer
할당에 대한 자세한 내용은 GameServer Fleet 만들기 페이지를 참고하세요.
여기서는 Autoscaler
가 작동하는지 확인하기 위한 할당 트리거만 확인해보겠습니다.
$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/gameserverallocation.yaml -o yaml
다음과 같이 할당된 GameServer
세부 정보를 보여줍니다.
status:
address: 34.94.118.237
gameServerName: simple-game-server-v6jwb-6bzkz
nodeName: gke-test-cluster-default-f11755a7-5km3
ports:
- name: default
port: 7832
state: Allocated
주소와 포트는 나중에 서버에 연결하기 위해 필요합니다.
4. Autoscaler
확인하기
이제 Autoscaler
가 Fleet
의 변경 사항을 감지하고 상태를 다시 확인할 수 있도록
몇 초 동안 기다리겠습니다.
$ kubectl describe fleetautoscaler simple-game-server-autoscaler
실행 결과는 다음과 같습니다:
Spec:
Fleet Name: simple-game-server
Policy:
Buffer:
Buffer Size: 2
Max Replicas: 10
Min Replicas: 2
Type: Buffer
Status:
Able To Scale: true
Current Replicas: 3
Desired Replicas: 3
Last Scale Time: 2018-10-02T16:00:02Z
Scaling Limited: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal AutoScalingFleet 2m fleetautoscaler-controller Scaling fleet simple-game-server from 2 to 3
Fleet
크기가 증가하고 Autoscaler
가 할당된 인스턴스를 보정한 것을 확인할 수 있습니다.
마지막 스케일 시간이 업데이트되었으며 스케일링 이벤트가 기록되었습니다.
다음 명령을 실행하여 실제 GameServer
의 인스턴스 수와 상태를 다시 확인합니다.
$ kubectl get gs
결과로 현재 모든 GameServer
들과 그들의 Status > State
를 확인할 수 있습니다:
NAME STATE ADDRESS PORT NODE AGE
simple-game-server-mzhrl-hz8wk Allocated 10.30.64.99 7131 minikube 5m
simple-game-server-mzhrl-k6jg5 Ready 10.30.64.100 7243 minikube 5m
simple-game-server-mzhrl-n2sk2 Ready 10.30.64.168 7658 minikube 5m
5. Allocated
인스턴스 종료하기
Allocated
가 하나뿐이므로 유일한 Allocated GameServer
IP 및 포트의 세부 정보만 가져옵니다.
$ kubectl get gameservers | grep Allocated | awk '{print $3":"$4 }'
결과로 GameServer
IP 주소와 포트가 출력됩니다.(예, 10.130.65.208:7936)
이제 GameServer
와 통신할 수 있습니다.
$ nc -u {IP} {PORT}
Hello World !
ACK: Hello World !
EXIT
마지막으로 SDK에 Shutdown 명령 을 실행하도록 지시하는 EXIT를 입력하여 GameServer
를 종료할 수 있습니다.
6. Fleet
축소 확인하기
이제 Autoscaler
가 Fleet
의 변경을 감지하고 상태를 다시 확인할 수 있도록 몇 초 동안 기다립니다.
$ kubectl describe fleetautoscaler simple-game-server-autoscaler
결과는 다음과 같습니다:
Spec:
Fleet Name: simple-game-server
Policy:
Buffer:
Buffer Size: 2
Max Replicas: 10
Min Replicas: 2
Type: Buffer
Status:
Able To Scale: true
Current Replicas: 3
Desired Replicas: 2
Last Scale Time: 2018-10-02T16:09:02Z
Scaling Limited: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal AutoScalingFleet 9m fleetautoscaler-controller Scaling fleet simple-game-server from 2 to 3
Normal AutoScalingFleet 45s fleetautoscaler-controller Scaling fleet simple-game-server from 3 to 2
Fleet
크기가 감소하고, GameServer
인스턴스가 할당 해제되는 autoscaling이 처리되고,
마지막 확장 시간 및 이벤트가 업데이트되는 것을 확인할 수 있습니다.
방금 닫은 simple-game-server GameServer
인스턴스는 제거될 때까지 ‘Unhealthy’ 상태
(그리고 해당 파드는 ‘Terminating’ 상태)로 유지될 수 있습니다.
다음 명령을 실행하여 실제 GameServer
인스턴스 수와 상태를 다시 확인합니다.
$ kubectl get gs
결과로 현재의 모든 GameServer
들의 목록과 그들의 상태(Status > State
)를 확인할 수 있습니다.
NAME STATE ADDRESS PORT NODE AGE
simple-game-server-mzhrl-k6jg5 Ready 10.30.64.100 7243 minikube 5m
simple-game-server-mzhrl-t7944 Ready 10.30.64.168 7561 minikube 5m
7. Autoscaling 파라미터 변경하기
또한 실행 중인 Fleet
의 FleetAutoscaler
구성을 변경하고 서비스 중단없이 변경 사항을 적용할 수 있습니다.
kubectl edit fleetautoscaler simple-game-server-autoscaler
를 실행하고 bufferSize
필드를 5로 설정합니다.
GameServer
목록을 다시 살펴 보겠습니다. 5 개의 준비된 서버 인스턴스가 표시될 때까지 watch kubectl get gs
를 실행합니다.
NAME STATE ADDRESS PORT NODE AGE
simple-game-server-mzhrl-7jpkp Ready 10.30.64.100 7019 minikube 5m
simple-game-server-mzhrl-czt8v Ready 10.30.64.168 7556 minikube 5m
simple-game-server-mzhrl-k6jg5 Ready 10.30.64.100 7243 minikube 5m
simple-game-server-mzhrl-nb8h2 Ready 10.30.64.168 7357 minikube 5m
simple-game-server-mzhrl-qspb6 Ready 10.30.64.99 7859 minikube 5m
simple-game-server-mzhrl-zg9rq Ready 10.30.64.99 7745 minikube 5m
노트:
RollingUpdate
대체 전략이 있고FleetAutoscaler
에서 제어하는Fleet
을 업데이트하려는 경우:
kubectl apply
을 사용하는 경우:
Fleet
구성을 다시 적용하기 전에Fleet
사양에서replicas
매개 변수를 생략해야 합니다.kubectl edit
를 사용하는 경우:
다른 필드 매개변수를 업데이트할 때Fleet
사양에서replicas
매개 변수를 변경해서는 안됩니다.위의 규칙을 따르면
maxSurge
및maxUnavailable
매개변수가RollingUpdate
전략으로Fleet
을 업데이트 할 때 사용됩니다.
그렇지 않으면Fleet
이Fleet replicas
매개변수에 따라 먼저 조정되고 특정 시간 후에FleetAutoscaler BufferSize
매개변수에 맞게 조정됩니다.또한 테스트
Fleet
에서Fleet Autoscaler
를 사용하는Fleet
의 동작을 확인하여
프로덕션 환경에서 어떤 일이 발생하는지 미리 확인할 수 있습니다.
다음 과정
Autoscaling 에 대한 자세한 내용은 스케줄링과 Autoscaling 가이드를 읽어보세요.
자체 GameServer
컨테이너를 사용하려는 경우 Agones SDK를 올바르게 통합했는지 확인하세요.
참고자료
Kubernetes
- Kubernetes
- WSL+Docker: Kubernetes on the Windows Desktop
- Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?
- Running Kubernetes and the dashboard with Docker Desktop
- docker for window 환경 kubernetes dashboard 생성
- Load Balancing and Reverse Proxying for Kubernetes Services
Tools
- kubectl 치트 시트
- Minikube
- Helm
The package manager for Kubernetes
Agones
- Agones
- Agones: Scaling Multiplayer Game Servers with Open Source (GDC ‘19)
- Scaling UDP Workloads with Kubernetes
- Agones 인스톨하기
GCP 환경에서 설치하는 방법을 소개 - OpenMatch + Agones을 시도
Docker
문제해결
Agones Getting Started Guide with Minikube uses wrong IP due to minikube bug
Minikube doesn’t properly set the node’s external IP kubernetes/minikube#4330
$ minikube start --extra-config kubelet.node-ip=192.168.99.100
파드의 TCP 포트를 로컬 포트로 포워딩하기
Accessing Kubernetes Pods from Outside of the Cluster
kubernetes/minikube: add documentation for WSL2
cheslijones opened this issue on 24 Apr 2020
If you are on Docker for macOS or Docker for Windows, networking works a bit differently, as there is no direct IP connectivity to the container. On these platforms, Docker requires individual ports to be proxied through.
See the Deploy applications section of https://minikube.sigs.k8s.io/docs/start/ for instructions on how to get access to your service. Please let me know if this helps!
도커 클러스터 접근하기
- 도커를 사용하여 접근하기
$ docker ps -a $ docker exec -it {Container ID} /bin/sh
kubectl
을 사용하여 접근하기$ kubectl exec --stdin --tty {Container Name} -- /bin/bash
- 아니면,
minikube ssh
를 사용합니다.$ minikube ssh
Netcat
- WSL2 Ubuntu 에 netcat 설치
$ sudo apt-get update $ sudo apt-get install netcat
- netcat 테스트
- simple-game-server 테스트하기
$ nc -u IP Port
- simple-game-server 테스트하기
댓글남기기