본문 바로가기
IT/Unity3D

Unity Dedicated Server to AKS

by rapker 2023. 4. 17.
반응형
유니티는 ‘헤드리스(headless)’ 모드에서 의도치 않게 실행되고 있는 렌더링, 애니메이션 및 오디오를 제거하는 등 쉽게 해결할 수 있는 작업부터 시작하여 Unity Linux 런타임의 ‘헤드리스’ 버전을 최적화하는 데 주력하고 있습니다. 이를 통해 ‘헤드리스’ 모드가 적용된 Unity 현재 버전에서 안정성을 높이고 가동 시간을 늘리면서 메모리, 빌드 크기 및 CPU 사용을 최소화하고자 합니다.
또한 Unity 2018.3 버전에서는 모든 스탠드얼론 플레이어를 위한 새로운 ‘서버 빌드’ 옵션을 도입하여 개발자 워크플로를 개선했습니다. 이 옵션은 기본적으로 헤드리스 모드로 실행되며, 새로운 UNITY_SERVER 정의를 통해 서버 스크립트 로직을 분리할 수 있습니다.
 
오류 내용을 남기지 못했지만
  • Sample 프로젝트는 WSL에서 정상적으로 실행 되었으나
  • 실 프로젝트를 WSL에서 실행할 때는 요상한? Segmentation fault (core dumped) 오류가 발생 되었고
  • 오류 내용으로 검색 결과 WSL에서 실행할 때 발생하는 오류이므로
  • 실제 Linux 머신에서 실행해보라는 글을 발견하고, Linux 머신에서 정상 동작되는것 확인함
  • 애초에 실제 Linux 머신에서 실행하기를 권장합니다.
 

 
 
테스트 유니티 버전: 2021.3.5f1 (Dedicated Server build 지원)
 
  • 테스트는 2021.3.5f1에서 정상동작 확인 하였습니다.
 
 
  • 2021.1.15f1 버전에서의 빌드도 실행이 가능하기는 했지만 app종료시 오류로 인해 정상종료 되지 않았습니다.
 
  • 2021.2.0f1 버전에서는 빌드 후 실행해 보지 않았지만

Unity 2021.2.0f1

Unity 2021.1.28f1

 
 
 
 
Unity 설치 ( with Add-on )
 
유니티 설치 시 Linux Dedicated Server Build Support 설치가 필요 합니다.
 
 
 
Unity Server sample 준비
 
unity를 서버로 구동시키기 위한 샘플로 아래 소스 사용
 
위 링크에서 unity web server 샘플 프로젝트 다운로드 받고,
유니티 에디터에서 해당프로젝트를 열어 줍니다.
 
 
유니티 에디터에서 샘플 경로 오픈
 
해당 샘플 프로젝트의 버전 (2019.4.16f1)이 현재 설치한 유니티 에디터 버전(2021.3.5f1)보다 낮아서 마이그레이션 할거냐고 묻는 창이 뜨는데
quit 누르지 말고 continue 눌러서 마이그레이션을 진행 합니다.
 
 
 
 
샘플프로젝트가 정상 실행이 되는지 확인
 
샘플 Scene open
 
 
 
port 확인
 
샘플프로젝트의 기본 포트는 13579 입니다.
 
 
 
샘플 프로젝트 실행
 
유니티 에디터에서 play 버튼을 눌러 프로젝트를 실행 합니다.
 
실행된 모습
 
 
웹 브라우저에서 웹서버 실행상태 확인
 
위 이미지 처럼 Error 404 나오면 웹서버는 정상적으로 실행중인 상태 입니다.
  • 프로젝트 구조를 살펴보니
  • StreamingAsset 폴더가 root 경로로 확인되었고,
  • root 경로에  페이지 만들고
  • 브라우저에서 해당 url 호출하면
  • 정상적으로 해당 페이지 출력 되는 것 확인 되었습니다.
 
앞으로도 docker container로 실행 했을 때와 aks pod로 실행 했을 때 동일한 페이지 출력되면 정상입니다.
 
 
 
Unity Dedicated Server 로 빌드
 
build setting
 
 
scene 추가
실행 했던 scene을 Scenes in Build 영역으로 끌어다 놓습니다.
 
 
플랫폼 변경
 
 
dedicated server용도로 빌드
 
적당한 경로와 이름을 지정 후 저장버튼 클릭
  •  
 
build 결과물

 
 
 
Linux 에서 실행 확인
 
어떤 linux머신에서 실행해봐도 되지만 저는 Windows 11 wsl(ubuntu)로 실행 했습니다.
 
wsl 접속
 
현재 경로 탐색기로 열기
explorer.exe .
 
이 경로에 빌드된 바이너리를 복사 합니다.
 
 
실행파일에 실행권한 부여 및 실행
 
실행 중인 상태
 
브라우저에서 확인
 

 
 
Docker 작업
 
Windows 11에서 Docker file 작성 후 빌드 합니다.
 
 
Dockerfile 생성
 
유니티 에디터에서 빌드한 경로로 이동하여 Dockerfile 이란 빈 파일을 생성합니다.
 
 
Dockerfile 작성
 
Dockerfile 을 notepad로 열어 아래와 같이 작성 합니다.
FROM ubuntu:20.04 
RUN apt-get -y update
RUN mkdir -p /app
COPY . /app
WORKDIR /app
CMD ["./unitywebserver.x86_64"]
EXPOSE 13579
 
 
 
docker engine 실행 확인
 
docker engine 설치 및 local k8s 활성화 방법은 생략합니다.
 
docker를 build 하기위해서는 도커엔진(저의 경우 docker desktop)이 실행중인 상태여야 합니다.
 
 
 
docker build
 
cmd창에서 docker 파일이 있는 경로로 이동하여 docker build를 실행합니다.
docker build --force-rm --tag unityweb:0.1 .
 
 
 
container 실행
 
container로 제대로 실행되서 정상동작 하고 있는지 확인을 위해
container 실행 후 브라우저로 접속해 봅니다.
docker run -dit --name unity_web_server -p 8080:13579 unityweb:0.1
 
web server가 container로 정상중인 모습입니다.
 
 
 
아래 두가지는 그냥 tip 입니다.
 
container 정상동작하지 않을 시 접속방법
docker image를 bash로 실행 하면서 container 접속
docker run -it unityweb:0.1 bash
 
container 정상동작 시 접속방법
실행중인 container id 확인 후 bash 실행
docker ps
docker exec -it <container id> bash
docker exec -it 230f594d587d bash
 

 

 

 
K8S에 배포
 
먼저 yaml 파일을 생성하고 두 가지 k8s cluster에 배포해 보겠습니다.
  • docker desktop에서 지원하는 local k8s
  • azure kubernetes service
 
 
 
 
Local K8S에 배포
 
 
image repository 확인
 
yaml 파일 작성에 앞서 local 에 존재하는 docker image를 사용하기 위해 docker image repository를 확인합니다.
docker images
 
 
yaml 파일 작성
 
적당한 위치에 yaml 파일을 작성해 줍니다.
apiVersion: v1
kind: Service
metadata:
  name: unity-web-svc
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 13579
  selector:
    app: unity-web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: unity-web-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: unity-web
  template:
    metadata:
      labels:
        app: unity-web
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: unity-web-con
        image: unityweb:0.1
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 13579
 
local aks에 배포
 
배포에 앞서 docker desktop에서 지원해주는 local k8s가 실행 중인지 확인합니다.
 
추가로...
저는 local k8s와 aks를 같이 사용하고 있어서 local k8s에 배포하기 위해 kube config을 수정합니다.
 
 
yaml 배포
kubectl apply -f unity-web_local.yaml
 
브라우저에서 확인
 
 
정상적으로 이쁘게 출력 되었습니다.
 
 
 
배포했던 pod는 다시 yaml 파일로 삭제
kubectl delete -f unity-web_local.yaml
 
 
 
 
 
 
 
AKS 에 배포
 
AKS(Azure kubernetes service)와 ACR(Azure container registry)생성 방법은 생략 합니다.
 
aks 생성 시 acr 통합하지 않았다면 cli로 통합
az aks update -n <myAKSCluster> -g <myResourceGroup> --attach-acr <acr-name>
az aks update -n aksTest990 -g aksTest990_group --attach-acr acrTest998
 
 
ACR에 Docker image push
 
acr 로그인
az acr login -n <acr name>
az acr login -n acrtest998
 
 
docker image tagging
docker tag <docker image name> <acr name>.azurecr.io/<repository>:<tag>
docker tag unityweb:0.1 acrtest998.azurecr.io/samples/unityweb:0.1
 
acr에 push 하기 위해 원본 image인 unityweb과 같은 image id를 갖는 새로운 repository로 tagging 합니다.
 
 
docker image push to acr
docker push <acr name>.azurecr.io/samples/<repository>:<tag>
docker push acrtest998.azurecr.io/samples/unityweb:0.1
 
acr에서 repository 확인
 
 
yaml 작성
위 에서 작성했던 내용과 동일하지만 acr에 있는 image를 사용하도록 변경합니다.
apiVersion: v1
kind: Service
metadata:
  name: unity-web-svc
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 13579
  selector:
    app: unity-web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: unity-web-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: unity-web
  template:
    metadata:
      labels:
        app: unity-web
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: unity-web-con
        image: acrtest998.azurecr.io/samples/unityweb:0.1
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        ports:
        - containerPort: 13579
 
 
pod 배포
 
pod 배포하기 전에...
위 에서 local k8s cluster를 활성화 시켰기 때문에 다시 aks cluster를 활성화 합니다.
 
 
yaml 배포
kubectl apply -f unity-web_aks.yaml
 
aks에 배포된 service의 public ip 확인
 
public ip로 브라우저에서 확인
 
 
AKS 에서도 정상동작 하고 있습니다.
 
궁굼한 내용 모두 확인 되었으니 삭제..
yaml 삭제
 
 
 
반응형
LIST