멀티 클러스터 할당 구성

이 페이지에서는 Game Servers에 대해 멀티 클러스터 할당을 구성하는 방법을 설명합니다. 멀티 클러스터 할당을 사용하면 한 렐름 내의 한 클러스터에서 Ready 상태의 GameServer를 요청하고, 해당 렐름 내의 모든 클러스터에서 Ready 상태의 GameServer를 다시 가져올 수 있습니다. 멀티 클러스터 할당을 위해서는 클러스터가 서로 연결되도록 설정하고 멀티 클러스터 할당 엔드포인트에도 연결되도록 설정하는 수동 구성 및 설정이 필요합니다.

GameServer 할당에 관한 상세 내용은 Agones Game Servers 플릿 만들기 빠른 시작에서 전체 개요를 확인하세요.

시작하기 전에

시작하기 전에 Game Servers 개요의 주요 개념을 숙지하는 것이 좋습니다. 또한 다음 태스크를 수행했는지 확인합니다.

  • Game Services API가 사용 설정되어 있는지 확인합니다.
  • Game Services API 사용 설정
  • Cloud SDK가 설치된 셸을 선택하거나 API 클라이언트를 사용하세요.
  • Cloud Shell

    Cloud Shell을 시작하려면 다음 단계를 수행하세요.

    1. Google Cloud Console로 이동합니다.

      Google Cloud Console

    2. Console의 오른쪽 상단에서 Cloud Shell 활성화 버튼을 클릭합니다.

    Console 하단의 프레임에서 Cloud Shell 세션이 열립니다. 이 셸을 사용하여 gcloud 명령어를 실행합니다.

    로컬 셸

    gcloud를 설치하려면 gcloud 명령줄 도구가 포함된 Cloud SDK를 설치합니다.

    gcloud 명령줄 도구에 대해 원하는 기본 프로젝트를 설정했는지 확인합니다. 그렇지 않으면 나중에 각 명령어에 대해 명시적으로 --project 플래그를 지정해야 합니다.

    gcloud config list project
    

    사용할 수 없는 경우 다음 명령어를 실행하여 기본 프로젝트를 설정하고 PROJECT_ID를 원하는 프로젝트 ID로 바꾸세요.

    gcloud config set project PROJECT_ID
    

    다음 명령어를 실행하여 Google Cloud SDK의 버전을 확인합니다. Game Servers에는 306.0.0 이상의 SDK 버전이 필요합니다.

    gcloud version
    

    설치를 업데이트하려면 다음 명령어를 실행합니다.

    gcloud components update
    

    curl / PowerShell

    curl 또는 Windows PowerShell에서 REST API를 사용하려면 다음을 수행합니다.

    1. 서비스 계정 만들기.
    2. 비공개 키를 JSON 파일로 다운로드합니다.
    3. GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 서비스 계정 키가 포함된 JSON 파일의 경로로 설정합니다. 이 변수는 현재 셸 세션에만 적용되므로, 새 세션을 열 경우, 변수를 다시 설정합니다.

    클라이언트 라이브러리

    클라이언트 라이브러리를 사용하여 Google Cloud Game Servers를 프로그래매틱 방식으로 제어할 수 있습니다. 라이브러리 사용 및 인증에 대한 안내는 클라이언트 라이브러리 개요를 참조하세요.

Agones 할당자 서비스 구성

Agones 설치를 위해 Agones 할당자 서비스가 설정되어 있고 단일 클러스터 할당이 동일한 가이드를 사용하여 작동하는지 확인합니다. 기본적으로 agones-allocator 서비스에는 유효한 서비스 인증서가 설치되어 있지 않고 인증서를 바꿔야 합니다. 리전별 Google Cloud Platform IP 주소를 예약하고 예약된 IP를 사용하여 agones-allocator를 설치하면 서비스에 대한 유효한 인증서도 발급됩니다. IP를 예약하려면 다음 명령어를 실행합니다.

gcloud compute addresses create allocator-service --region REGION

예약된 IP를 찾으려면 다음 명령어를 실행합니다.

gcloud compute addresses describe allocator-service --region REGION --format="value(address)"

그런 다음 이전 명령어의 예약된 IP를 RESERVED_IP로 전달하여 Agones를 설치/업그레이드합니다.

helm upgrade RELEASE --install --set agones.allocator.http.loadBalancerIP=RESERVED_IP --namespace agones-system --create-namespace agones/agones

RESERVED_IPagones-allocator 서비스에 사용할 IP 주소입니다.

RELEASE은 helm 차트 설치에 대한 Agones 출시의 이름입니다.

Citadel 설치

Game Servers는 Citadel 프로젝트를 Agones에서 클러스터 사이의 보안 연결을 용이하게 하는 멀티 클러스터 할당 클라이언트 측 인증서의 인증서 관리자로 사용합니다. Game Servers에 등록된 각 Google Kubernetes Engine 클러스터에 설치해야 합니다.

클러스터의 모든 네임스페이스에 대해 Citadel은 Game Servers에서 클라이언트 측 인증서로 사용하는 istio.default Kubernetes secret을 실행합니다.

Google Kubernetes Engine 클러스터에 Istio를 이미 설치한 경우 이 단계를 건너뛸 수 있습니다. 현재 전체 Istio 설치에서 Agones 호환성과 관련된 알려진 문제가 있습니다.

Terraform 사용자의 경우에는 Terraform을 사용하여 Citadel을 설치할 수 있습니다. GitHub에 Terraform을 사용하여 Citadel 설치에 대한 자세한 내용은 예시 구성 파일을 참조하세요.

이 가이드에서는 helm v3git용 명령줄 도구가 설치되어 있다고 가정합니다.

Citadel을 설치하려면 다음 안내를 따르세요.

  1. Istio GitHub 저장소를 클론합니다.

    git clone -b release-1.5 https://github.com/istio/istio.git
    
  2. Istio의 새 네임스페이스를 만듭니다.

    kubectl create ns istio-system
    

  3. 다음 각 명령어를 복사하고 실행하여 Istio Helm 템플릿에서 Citadel YAML 설치 파일을 생성합니다.

    helm template istio/install/kubernetes/helm/istio --name-template istio --namespace istio-system -s charts/security/templates/serviceaccount.yaml -s charts/security/templates/clusterrole.yaml -s charts/security/templates/clusterrolebinding.yaml -s charts/security/templates/deployment.yaml > citadel.yaml
    

  4. 다음으로 다음 명령어를 실행하여 이전 단계에서 생성한 YAML 파일을 Google Kubernetes Engine 클러스터에 적용합니다.

    kubectl apply -f citadel.yaml
    
  5. Citadel이 올바르게 작동하는지 확인합니다.

    kubectl get pods --namespace=istio-system
    

    Citadel 배포가 단일 Pod로 실행되는지 확인합니다.

멀티 클러스터 할당의 네트워킹 요구사항

멀티 클러스터 할당이 렐름에서 작동하려면 각 클러스터가 서비스에 공개 외부 주소가 있는 할당자 서비스를 실행하는지 확인해야 합니다.

구성되어 있는지 확인하려면 외부 부하 분산기가 서비스에 할당되어 있는지 확인합니다.

kubectl get service agones-allocator -n agones-system
NAME               TYPE                      CLUSTER-IP   EXTERNAL-IP    PORT(S)
agones-allocator   LoadBalancer              10.86.3.77   RESERVED_IP  443:30219/TCP

RESERVED_IP는 비워 둘 수 없습니다.

멀티 클러스터 할당 검사

할당 프로세스를 테스트하려면 다음 단계를 완료하세요.

  1. 렐름에 Game Servers 클러스터 2개를 등록하고 위에 표시된 대로 멀티 클러스터 할당에 구성합니다.

  2. Game Servers 배포를 만듭니다.

  3. 복제본이 5로 설정되고 gameName: udp-server 라벨이 적용된 플릿 사양으로 Game Servers 구성을 만듭니다.

  4. Game Servers 배포의 출시를 업데이트하여 구성을 활성화합니다.

  5. 다음 YAML을 LOCAL_FILE에 복사합니다.

    apiVersion: "allocation.agones.dev/v1"
    kind: GameServerAllocation
    spec:
      multiClusterSetting:
        enabled: true
      required:
        matchLabels:
          gameName: udp-server
    

다음 명령어를 사용하여 YAML 파일을 렐름의 Game Servers 클러스터 중 하나에 적용합니다.

kubectl create -f LOCAL_FILE -o yaml

이렇게 하면 두 클러스터에 준비된 복제본 10개 중 1개가 할당됩니다. 명령어를 9번 더 반복하여 두 클러스터의 복제본 10개가 모두 할당되었는지 확인합니다.

렐름 내 모든 클러스터의 모든 엔드포인트를 사용하여 렐름의 모든 클러스터에서 GameServer를 할당할 수 있습니다. GameServer 할당은 라운드 로빈 스키마를 사용하여 렐름 내의 모든 클러스터에 부하가 분산됩니다.

문제해결

이 가이드의 절차와 관련하여 문제가 발생한 경우 다음 문제 해결 문서를 검토하시기 바랍니다.

멀티 클러스터 할당 정책이 지정되지 않음

게임 서버를 할당하려고 하면 다음 오류가 표시됩니다.

no multi-cluster allocation policy is specified

게임 서버 네임스페이스에서 citadel이 istio.default 보안 비밀을 생성했는지 확인하 클러스터에 올바르게 citadel을 설치했는지 확인합니다.

kubectl get secret istio.default -n NAMESPACE

알 수 없는 기관에서 서명한 인증서

게임 서버를 할당하려고 하면 다음 오류가 표시됩니다.

transport: authentication handshake failed: x509: certificate signed by unknown authority

모든 클러스터에 대해 allocator-tls-ca Kubernetes 보안 비밀을 올바르게 설정했는지 확인합니다. Helm 설치 시 allocator-tls-ca 보안 비밀이 업데이트되지만 TLS 보안 비밀을 수동으로 변경하면 allocator-tls-ca 보안 비밀도 업데이트해야 합니다. 인증 기관을 확인하려면 다음 명령어를 실행합니다.

kubectl get secret allocator-tls-ca -n agones-system -ojsonpath="{.data.tls-ca\.crt}" | base64 -d > ca.crt
kubectl get secret allocator-tls -n agones-system -ojsonpath="{.data.tls\.crt}" | base64 -d > tls.crt
openssl verify -verbose -CAfile ca.crt tls.crt

확인은 tls.crt: OK를 출력해야 합니다.

근본 원인 해결했지만, 문제가 남아 있음

모든 클러스터에서 단일 클러스터에 적용되는 변경사항을 조정하는 데 최대 1시간이 걸릴 수 있습니다. 예를 들어, 렐름 리소스의 라벨을 업데이트하여 Game Servers 리소스를 변경하면 즉시 조정을 트리거할 수 있습니다.

gcloud game servers realms update REALM_NAME --update-labels=usage=testing --location=REALM_LOCATION

다음 단계