Agones 리서치 Part.6 - Fleet Autoscaler 를 Webhook 으로 만들기
이 가이드에서는 웹훅 Fleet Autoscaler
정책을 만드는 방법을 다룹니다.
Quickstart: Create a Fleet Autoscaler with Webhook Policy를 정리한 글입니다.
경우에 따라 게임 서버는 fleetautoscaler
의 버퍼 정책을 사용하여 표현할 수 있는 것보다
더 복잡한 Fleet
을 확장하기 위해 커스텀 로직을 사용해야 할 수 있습니다.
이 가이드는 커스텀 Autoscaling 정책을 구현하기 위해 Autoscaler Webhook
으로
Agones 를 확장하는 방법을 소개합니다.
Autoscaler Webhook
을 사용하는 경우 대상 복제본 수를 계산하는 논리는
동일한 클러스터의 쿠버네티스 Deployment 및 서비스에서 제공하는 것과 같은
외부 HTTP/S 엔드포인트에 위임됩니다(아래 예를 참고하세요).
Fleetautoscaler
는 JSON 바디를 사용하여 동기화 기간(현재 30 초)마다
웹훅 Autoscaler 의 /scale
엔드포인트에 요청을 보내고 반환된 데이터를 기반으로
대상 Fleet
을 확장합니다.
Chapter 1. HTTP fleetautoscaler webhook 구성하기
전제조건
GameServer Fleet
만들기를 완료하고 게임 서버 Fleet
을 실행하고 있다고 가정합니다.
목표
Fleet
을 실행하기.- autoscaling 을 위한 Webhook 파드와 서비스를 배포하기.
- Agones 커스텀 리소스를 사용하여 쿠버네티스에서 Webhook 정책 타입으로
Fleet Autoscaler
만들기. GameServer
를 할당할 때Fleet
이 확장되는 것을 확인하기.GameServer
이 종료된 후Fleet
이 축소되는 것을 확인하기.
1. autoscaling을 위해 Webhook
서비스 배포하기
다음 명령으로 클러스터에 Fleet
을 실행합니다:
kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/fleet.yaml
2. Fleet
배포하기
이 단계에서는 Fleet
에 할당된 일부 GameServer
들을을 기반으로 Fleet
의 크기를 제어하는
Webhook
예제를 배포합니다. 이 예제 Webhook
서버의 소스 코드는 여기에서 볼 수 있습니다.
fleetautoscaler
는 30 초마다 이 엔드포인트를 트리거합니다. 자세한 내용은 여기에서도
확인할 수 있습니다.
json 페이로드 FleetAutoscaleReview
를 사용하여 HTTP 요청을 처리하고 FleetAutoscaleResponse
를
응답할 파드를 만들어야 합니다.
FleetAutoscaleResponse
에서 반환된 Scale
플래그 및 Replicas
값은 FleetAutoscaler
에 Fleet
이 확장
또는 축소되어야하는 대상 크기를 알려줍니다. Scale
이 false
면 스케일링이 발생하지 않습니다.
다음 명령을 실행하여 클러스터에 서비스 및 Webhook 파드를 생성합니다.
kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/autoscaler-webhook/autoscaler-service.yaml
실행 중이고 활성 상태인지 확인하려면:
kubectl describe pod autoscaler-webhook
Name: autoscaler-webhook-86944884c4-sdtqh
Namespace: default
Node: gke-test-cluster-default-1c5dec79-h0tq/10.138.0.2
...
Status: Running
3. Fleet Autoscaler
생성하기
다음 명령을 사용하여 Fleet Autoscaler
를 만들어 보겠습니다:
kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/webhookfleetautoscaler.yaml
성공하면 다음과 같이 출력됩니다:
fleetautoscaler.autoscaling.agones.dev "webhook-fleet-autoscaler" created
쿠버네티스 내부에 FleetAutoscaler
레코드를 생성했습니다.
위에서 배포한 Webhook
서비스에 대한 링크가 포함되어 있습니다.
4. Fleet
과 Autoscaler
상태 확인하기
플릿에서 실행되는 게임서버들을 추적하려면 별도의 터미널 탭에서 다음 명령을 실행합니다:
watch "kubectl get gs -n default"
Autoscaler
상태를 가져 오려면 다음 명령어를 사용하세요:
kubectl describe fleetautoscaler webhook-fleet-autoscaler
결과로 다음과 같이 출력됩니다:
Name: webhook-fleet-autoscaler
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":
"autoscaling.agones.dev/v1","kind":"FleetAutoscaler","metadata":{"annotations"
:{},"name":"webhook-fleet-autoscaler","namespace":"default...
API Version: autoscaling.agones.dev/v1
Kind: FleetAutoscaler
etadata:
Cluster Name:
Creation Timestamp: 2018-12-22T12:52:23Z
Generation: 1
Resource Version: 2274579
Self Link: /apis/autoscaling.agones.dev/v1/namespaces/default/fleet
autoscalers/webhook-fleet-autoscaler
UID: 6d03eae4-05e8-11e9-84c2-42010a8a01c9
Spec:
Fleet Name: simple-game-server
Policy:
Type: Webhook
Webhook:
Service:
Name: autoscaler-webhook-service
Namespace: default
Path: scale
URL:
Status:
Able To Scale: true
Current Replicas: 2
Desired Replicas: 2
Last Scale Time: <nil>
Scaling Limited: false
Events: <none>
상태(확장 가능, 제한되지 않음), 플릿이 마지막으로 스케일된 시간(없는 경우 nil),
현재 및 원하는 플릿 크기를 볼 수 있습니다.
Autoscaler
는 1 단계에서 배포된 webhoook 서비스와 대상 복제본 크기를 변경하는 응답에 대해
쿼리를 수행하고 플릿은 해당 수를 달성하기 위해 GameServer 인스턴스를 생성/삭제합니다.
수렴은 일반적으로 초 단위로 이루어집니다.
5. 스케일 업을 진행할 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
나중에 서버에 연결하기 위해 필요할 수 있으니 주소와 포트를 적어 두세요.
두 서버가 모두 할당되도록 kubectl
명령을 한 번 더 실행합니다.
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/gameserverallocation.yaml -o yaml
6. 새 Autoscaler
와 Fleet
상태 확인하기
이제 Autoscaler
가 Fleet
의 변경사항을 감지하고 상태를 다시 확인할 수 있도록
몇 초 동안 기다리겠습니다.
kubectl describe fleetautoscaler webhook-fleet-autoscaler
마지막 부분은 다음과 유사합니다:
Spec:
Fleet Name: simple-game-server
Policy:
Type: Webhook
Webhook:
Service:
Name: autoscaler-webhook-service
Namespace: default
Path: scale
URL:
Status:
Able To Scale: true
Current Replicas: 4
Desired Replicas: 4
Last Scale Time: 2018-12-22T12:53:47Z
Scaling Limited: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal AutoScalingFleet 35s fleetautoscaler-controller Scaling fleet simple-game-server from 2 to 4
Fleet
크기가 두 배로 증가한 4 개의 게임 서버(웹 후크의 커스텀 로직에 따라)를 확인할 수 있습니다.
Autoscaler
는 할당된 두 인스턴스를 보상했습니다.
마지막 스케일 시간이 업데이트되었고 스케일링 이벤트가 기록되었습니다.
다음 명령을 실행하여 실제 GameServer
인스턴스 수와 상태를 다시 확인하세요.
kubectl get gs -n default
그러면 현재 모든 GameServers
리스트와 그 Status > State
가 표시됩니다:
NAME STATE ADDRESS PORT NODE AGE
simple-game-server-dmkp4-8pkk2 Ready 35.247.13.175 7386 minikube 5m
simple-game-server-dmkp4-b7x87 Allocated 35.247.13.175 7219 minikube 5m
simple-game-server-dmkp4-r4qtt Allocated 35.247.13.175 7220 minikube 5m
simple-game-server-dmkp4-rsr6n Ready 35.247.13.175 7297 minikube 5m
7. Webhook Autoscaler 정책을 사용하여 축소 확인하기
이전에 배포한 커스텀 웹훅을 기반으로 전체 레플리카 수에서 할당된 레플리카의 비율이
임계값(0.3)보다 작으면 집합이 scaleFactor
에 의해 축소됩니다. 우리의 경우 2입니다.
예제 웹훅 서버에는 2인 minReplicasCount
에서 Fleet
레플리카 수를 줄이지 않는다는
제한이 있습니다.
Fleet
에서 할당된 GameServer
수(<0.3)를 줄이려면 한 GameServer
에서 EXIT 명령을
실행해야합니다(이전 단계에서 할당된 GameServer
의 IP 주소 및 포트를 사용합니다).
nc -u 35.247.13.175 7220
EXIT
서버는 Shutdown 상태가 됩니다. 30 초 정도 기다리면 다음 명령의 출력에 축소 이벤트가 표시됩니다:
kubectl describe fleetautoscaler webhook-fleet-autoscaler
이벤트에서 다음 줄이 표시되어야 합니다:
Normal AutoScalingFleet 11m fleetautoscaler-controller Scaling fleet simple-game-server from 2 to 4
Normal AutoScalingFleet 1m fleetautoscaler-controller Scaling fleet simple-game-server from 4 to 2
그리고 get gameservers
명령의 출력입니다:
NAME STATUS ADDRESS PORT NODE AGE
simple-game-server-884fg-6q5sk Ready 35.247.117.202 7373 minikube 5m
simple-game-server-884fg-b7l58 Allocated 35.247.117.202 7766 minikube 5m
8. 정리하기
다음 명령어를 사용하여 Autoscaler
서비스 및 관련 리소스를 삭제할 수 있습니다:
kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/autoscaler-webhook/autoscaler-service.yaml
Fleet
을 제거합니다:
kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/fleet.yaml
Chapter 2. CA 번들을 사용하여 HTTPS Fleetautoscaler 웹훅 구성하기
(작성 중)
다음 과정
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
-
댓글남기기