6 분 소요


이 가이드에서는 웹훅 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 값은 FleetAutoscalerFleet이 확장
또는 축소되어야하는 대상 크기를 알려줍니다. Scalefalse 면 스케일링이 발생하지 않습니다.

다음 명령을 실행하여 클러스터에 서비스 및 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. FleetAutoscaler 상태 확인하기

플릿에서 실행되는 게임서버들을 추적하려면 별도의 터미널 탭에서 다음 명령을 실행합니다:

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. 새 AutoscalerFleet 상태 확인하기

이제 AutoscalerFleet 의 변경사항을 감지하고 상태를 다시 확인할 수 있도록
몇 초 동안 기다리겠습니다.

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

Tools

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
      

댓글남기기