6 분 소요


이 가이드는 실제 부하를 기반으로 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 확인하기

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

$ 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 축소 확인하기

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

$ 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 파라미터 변경하기

또한 실행 중인 FleetFleetAutoscaler 구성을 변경하고 서비스 중단없이 변경 사항을 적용할 수 있습니다.

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 을 업데이트하려는 경우:

  1. kubectl apply 을 사용하는 경우:
    Fleet 구성을 다시 적용하기 전에 Fleet 사양에서 replicas 매개 변수를 생략해야 합니다.
  2. kubectl edit 를 사용하는 경우:
    다른 필드 매개변수를 업데이트할 때 Fleet 사양에서 replicas 매개 변수를 변경해서는 안됩니다.

위의 규칙을 따르면 maxSurgemaxUnavailable 매개변수가 RollingUpdate 전략으로 Fleet 을 업데이트 할 때 사용됩니다.
그렇지 않으면 FleetFleet replicas 매개변수에 따라 먼저 조정되고 특정 시간 후에 FleetAutoscaler BufferSize 매개변수에 맞게 조정됩니다.

또한 테스트 Fleet 에서 Fleet Autoscaler 를 사용하는 Fleet 의 동작을 확인하여
프로덕션 환경에서 어떤 일이 발생하는지 미리 확인할 수 있습니다.



다음 과정

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
      

댓글남기기