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
-
댓글남기기