AKS(Azure Kubernetes Service)를 사용하는 동기 멀티 플레이어

관리되는 AKS(Azure Kubernetes Service)를 사용하면 Azure에서 Kubernetes 오케스트레이터를 사용하여 컨테이너화된 전용 게임 서버를 관리할 수 있습니다.

이 문서에서는 GitHub의 이 샘플에 사용된 아키텍처에 대해 설명합니다. 이 참조 아키텍처의 코드는 지침을 위한 예제일 뿐이며 프로덕션 환경에서 사용하기 위해서는 일부 코드를 최적화해야 할 수 있습니다.

아키텍처 다이어그램

SAzure Kubernetes Service를 사용하는 동기 멀티 플레이어

관련 서비스

아키텍처 고려 사항

CRD(사용자 지정 리소스 정의)

이 참조 아키텍처에서는 CRD(사용자 지정 리소스 정의) 개체를 사용하여 Kubernetes를 확장합니다. 이러한 개체는 전용 게임 서버 엔터티를 나타내는 데 사용됩니다.

특히 2개의 핵심 엔터티가 있으며 이들은 해당 CRD로 표현됩니다.

  • DedicatedGameServer: 멀티 플레이어 게임 서버 자체를 나타냅니다. 각 DedicatedGameServer에는 게임 서버 실행 파일을 사용하여 컨테이너 이미지를 실행하는 단일 자식 Pod가 있습니다.

  • DedicatedGameServerCollection: 동일한 Pod 템플릿을 실행하고 컬렉션 내에서 확장/축소(즉 인스턴스를 추가 또는 제거)할 수 있는 관련 DedicatedGameServer의 컬렉션/집합을 나타냅니다.

    모두 동일한 멀티 플레이어 맵 또는 동일한 유형의 게임을 실행할 수 있는 것과 같이 동일한 DedicatedGameServerCollection의 구성원인 DedicatedGameServer는 해당 실행 환경에서 매우 유사합니다. 따라서 게임의 "플래그 캡처" 모드에 대한 컬렉션 한 개와 "정복" 모드에 대한 다른 컬렉션을 사용할 수 있습니다. 또는 맵 "X"에서 플레이하는 플레이어를 위한 컬렉션과 맵 "Y"에서 플레이하는 플레이어를 위한 컬렉션을 사용할 수 있습니다.

구성 요소

이 참조 아키텍처에는 두 개의 주요 구성 요소가 포함되어 있으며 둘 다 단일 인스턴스 Kubernetes 배포로 만들어졌습니다.

  1. API 서버 구성 요소

    프로젝트의 API 서버입니다(Kubernetes API 서버와는 관련이 없음). 여기에는 두 개의 하위 구성 요소가 있습니다.

    1. API 서버 하위 구성 요소

      게임 서버 또는 외부 예약 시스템(예: 로비 서비스 또는 매치 메이커)에서 호출할 수 있는 REST API를 제공합니다.

    2. Webhook 하위 구성 요소

      Kubernetes 승인 webhook은 Kubernetes API 서버 관련 CRD에 대한 요청을 유효성 검사하고 수정합니다.

  2. 컨트롤러

    Kubernetes 컨트롤러는 활성 조정 프로세스인 개체입니다. 간단히 말하면 컨트롤러가 개체(또는 개체 집합)의 실제 상태뿐만 아니라 원하는 상태도 감시합니다. 적극적으로 상태를 비교하고 실제 상태를 원하는 상태로 만들기 위해 모든 노력을 합니다.

    이 프로젝트에는 컨트롤러 집합이 있으며, 각각 특정 개체 집합을 조정하기 위해 작업을 수행합니다. 모든 컨트롤러는 공식 Kubernetes 샘플 컨트롤러를 기반으로 하며 해당 설명서는 여기에 있습니다. 이 프로젝트의 컨트롤러는 CRD(사용자 지정 리소스 정의) 개체, 즉 DedicatedGameServerCollections 및 DedicatedGameServers를 조정하기 위해 만들어졌습니다.

    1. DedicatedGameServerCollectionController

      DedicatedGameServerCollection의 DedicatedGameServer 개체를 처리할 의무가 있습니다.

    2. DedicatedGameServerController

      DedicatedGameServer 개체의 Pod를 처리할 의무가 있습니다.

    3. DGSActivePlayersAutoScalerController

      선택적으로 컨트롤러에 대한 명령줄 인수를 통해 시작되고 Pod 자동 크기 조정 메커니즘을 사용하는 모든 DedicatedGameServerCollection에 대한 Pod 자동 크기 조정을 담당합니다.

이러한 구성 요소는 DedicatedGameServers의 네임스페이스와 구분된 자체 네임스페이스(샘플의 dgs-system)에 포함되어 있습니다. 대규모 클러스터 시나리오에서는 DedicatedGameServerCollections 목록별로 네임스페이스가 있을 수 있습니다.

공용 IP

게임 클라이언트는 전용 게임 서버에 직접 연결할 수 있으므로 모든 노드에 공용 IP가 있어야 합니다. Azure Kubernetes Service는 기본적으로 공용 IP를 제공하지 않지만 이 GitHub 프로젝트를 사용하여 이를 설정할 수 있습니다.

배포 템플릿

Azure Kubernetes Cluster를 만들려면 다음 지침을 따릅니다.

보안 고려 사항

모든 API 메서드는 문자열로 표시되고 apiaccesscode라는 Kubernetes 비밀에 유지되는 액세스 코드를 통해 보호됩니다. 이는 프로젝트 설치 도중 생성되며 모든 메서드 호출 코드 GET 매개 변수에 전달되어야 합니다. 기본적으로 인증이 필요하지 않은 유일한 메서드는 /running 메서드입니다. 그러나 API 서버 프로세스 명령줄 인수에서 이를 변경할 수 있습니다.

최적화 고려 사항

소규모 클러스터의 경우 모든 노드에 대해 단일 Pod(API 서버 하위 구성 요소, Webhook 하위 구성 요소 및 컨트롤러를 포함)를 사용하여 간소화할 수 있습니다. Kubernetes 클러스터에서는 모든 Pod가 디자인을 통해 다른 모든 노드의 다른 Pod와 통신할 수 있습니다.

SPod의 단일 관리 집합을 포함한 AKS를 사용하는 서버 호스팅

추가 리소스 및 샘플

공식 Kubernetes 설명서

가격

Azure 구독이 없는 경우 무료 계정을 만들어 12개월 무료 서비스를 시작합니다. 이러한 서비스의 제한을 초과하지 않는 한 Azure 무료 계정에서 무료로 제공하는 서비스에 대해서는 요금이 부과되지 않습니다. Azure Portal을 통해 또는 사용량 파일을 통해 사용량을 확인하는 방법을 알아보세요.

이러한 참조 아키텍처를 실행하는 동안 사용되는 Azure 서비스의 비용은 사용자가 부담합니다. 전체 금액은 사용량에 따라 달라집니다. 참조 아키텍처에 사용된 각 서비스에 대한 가격 웹 페이지를 참조하세요.

Azure 가격 계산기를 사용하여 사용하려는 Azure 서비스에 대한 비용을 구성하고 예측할 수도 있습니다.