ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [퀵랩] 고급 - 쿠버네티스 솔루션 05/08
    Qwiklabs/고급 - Kubernetes Solutions 2020. 6. 4. 14:00
    728x90

    안녕하세요! 좋은 오후입니다!

    오늘은 GKE를 활용해서 전용 게임 서버를 실행해 볼 겁니다.

     

    Warning! 경고

    이번 랩은 상당히 길고 험난한 여정이 될 수 있습니다. (많이 루즈..)

    하지만, 실무에서 게임 서버를 어떻게 쓰는지에 대한 감각을 기를 수 있습니다.

    글을 쓰는 여정도 매우 길고 험난하기 때문에 좋아요와 댓글은 저에게도 좋습니다.

     

    이번 랩의 학습 목표는 다음과 같습니다.

     

    1) Docker를 활용하여 Linux에서 널리 사용되는 오픈소스 게임 서버DGS의 컨테이너 이미지를

        활용합니다.

    2) 내용물을 읽기 전용의 영구 디스크 볼륨에 저장하고 런타임의 컨테이너에 마운트 합니다..

    3) k8s 및 Google Cloud API를 사용하여 기본 스케줄러 프로세스를 구성하여 수요를 충족시킵니다.

     

    다음은 이번 랩의 아키텍처 도식이고, 퀵랩 이후에 테스팅도 가능합니다!

     

    이번 랩에서는 OpenArena를 사용합니다.

    시작해볼까요?

     

    게임 서버를 먼저 준비해 봅시다.

    Compute Engine > VM instances에 들어가서, Instance 생성하기를 누릅니다.

    Identity and API acces에서 Allow full access to all Cloud APIs를 하고

    Vm을 생성합니다.

     

     

    Google Cloud Shell을 구동하여,

    다음의 명령어를 구동합니다.

    sudo apt-get update

    Apt-get repository를 설치하기

    sudo apt-get -y install kubectl

    도커 종속성을 다음의 명령어를 수행하여 설치합니다.

    sudo apt-get -y install \

               apt-transport-https \

               ca-certificates \

               curl \

               gnupg2 \

               software-properties-common

     

    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -

    도커의 gpg key를 설치합니다.

    다음으로 설치된 키가 제대로 됐는지 확인해 봅시다.

    sudo apt-key fingerprint 0EBFCD88

     

    다음의 명령을 통해 도커 레파지토리를 설치합니다.

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"

     

    apt-get repository를 설치합니다.

    sudo apt-get update

    도커-ce를 설치합시다.

    sudo apt-get -y install docker-ce

    도커 User 권한 설정합니다.

    sudo usermod -aG docker $USER

     

    vm 인스턴스의 ssh 버튼 누르기.

    이때, 반드시 접속 종료 후 다시 ssh로 접속하세요.

     

    도커 hello-world를 설치합니다.

    docker run hello-world

     

    자, 데모를 복사합니다.

    git clone https://github.com/GoogleCloudPlatform/gke-dedicated-game-server.git

     

    다음으로, 작업 환경을 준비합니다.

    export GCR_REGION=<리전명> PROJECT_ID=<프로젝트명>

    리전과 프로젝트 아이디를 출력해 봅니다.

    printf “”$GCR_REGION \n$PROJECT_ID\n””

    컨테이너 이미지를 새로 만듭니다.

    cd gke-dedicated-game-server/openarena

    다음의 명령어를 수행하여, 도커 이미지를 만듭니다.

    docker build -t \ ${GCR_REGION}.gcr.io/${PROJECT_ID}/openarena:0.8.8 .

    그리고, 레파지토리에 만든 이미지를 푸시합니다.

    gcloud docker -- push \${GCR_REGION}.gcr.io\${PROJECT_ID}\openarena:0.8.8

     

    다음으로 자산 디스크를 생성합니다.

    gcloud compute instances attach-disk openarena-asset-builder\

     --disk openarena-assets --zone ${zone_1}

     

    적절한 크기의 영구 디스크를 만들어서 붙입니다.

    VM 인스턴스 생성 이후, Compute Engine > VM instances > SSH를 통해 접속하세요.

    gcloud compute instances create openarena-asset-builder \

           --machine-type f1-micro \

           --image-family debian-9 \

           --image-project debian-cloud \

           --zone ${zone_1}

     

    자산 디스크 포맷, 환경 설정하기

    sudo lsblk

    다음 단계인 Mkfs.ext4의 명령은 파괴적인 명령어로,  openarena-assets 디스크의 장치 id를 꼭 확인하십시오.

    sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb

     

    저장하기 위해서 인스톨하기 전 디스크를 마운트 하십시오,

    모든 .pk3 파일들을 디스크에 넣어두십시오.

     

    다음의 명령어를 실행해 봅시다!

     

    sudo mkdir -p /usr/share/games/openarena/baseoa/

    sudo mount -o discard,defaults /dev/sdb \ /usr/share/games/openarena/baseoa/

    sudo apt-get update

    sudo apt-get -y install openarena-server

    sudo gsutil cp gs://qwiklabs-assets/single-match.cfg

    /usr/share/games/openarena/baseoa/single-match.cfg

     

     

    인스톨이 완료되면 영구 디스크 볼륨을 언마운트하고 인스턴스를 종료합니다.

    SSH 콘솔이 응답하지 않을 것입니다.

    영구 디스크는 이제 쿠버네티스에서 영구 볼륨으로 사용될 것이고, 인스턴스는

    안전하게 지워질 것입니다.

    sudo umount -f -l /usr/share/games/openarena/baseoa/

    sudo shutdown -h now

     

    존을 확인해 봅니다.

    echo $zone_1

     

    다음의 명령어를 통해, 리전과 존을 설정합니다.

    region=us-east1

    zone_1=${region}-b

     

    인스턴스를 삭제합니다.

    gcloud compute instances delete openarena-asset-builder

    --zone ${zone_1}

     

     

    다음의 명령어를 통해서 쿠버네티스 클러스터를 만들고,

    방화벽 규칙을 만듭니다.

    gcloud compute networks create game

    gcloud compute firewall-rules create

        openarena-dgs

        --network game \

        --allow udp:27961-28061

     

    다음의 명령어를 실행해서 3개 노드의 클러스터를 만들고

    가상 CPU 코어는 4개를 만들되, n1-standard-2로 만들어 줍니다.

     

    gcloud container clusters create

         openarena-cluster \

         --num-nodes 3 \

         --network game \

         --machine-type=n1-standard-2 \

         --zone=${zone_1}

     

    10분가량, 클러스터가 실행되면

    새 클러스터의 로컬 쉘에서 쿠버네티스 인증을 얻어서 컨트롤하기 위한 준비를 합니다.

     

    gcloud container clusters get-credentials openarena-cluster --zone ${zone_1}

     

     

    이제 컨테이너 엔진에서는 풀의 노드 수를 늘리고, vm 인스턴스의 자동 확장을 비활성화했습니다.

    다음으로 쿠버네티스 자산 디스크를 구성합니다.

     

     

     

    쿠버네티스 자산 디스크에 대한 배포를 진행해 봅시다.

    kubectl apply -f k8s/asset-volume.yaml

    다음으로는 쿠버네티스 자산 디스크에 대한 청구권인 볼륨 클레임에 대한 배포를 진행해 봅시다.

    kubectl apply -f k8s/asset-volumeclaim.yaml

     

    다음의 명령어를 통해서 볼륨이 바운드됐는지를 확인합니다.

    kubectl get persistentVolume

     

     

    자 이제, DGS의 POD를 구성해 봅시다.

    파드의 수명주기를 단순화하고 자동 스케일링의 기초를 형성합니다.

     

     

     

    스케일링 매니저를 구축합니다.

    cd ../scaling-manager

    ./build-and-push.sh

     

    Openarena Scaling Manager 배포 파일 구성합니다.

    gcloud compute instance-groups managed list

     

    BASE_INSTANCE_NAME

    gke-openarena-cluster-default-pool-1990bcc7

     

    export GCR_REGION=[GCR_REGION]

    export PROJECT_ID=[PROJECT_ID]

    export GKE_BASE_INSTANCE_NAME=[BASE_INSTANCE_NAME]

    export GCP_ZONE=[ZONE]

    printf "$GCR_REGION \n$PROJECT_ID \n$GKE_BASE_INSTANCE_NAME \n$GCP_ZONE \n“

     

    sed -i "s/\[GCR_REGION\]/$GCR_REGION/g" k8s/openarena-scaling-manager-deployment.yaml

    sed -i "s/\[PROJECT_ID\]/$PROJECT_ID/g" k8s/openarena-scaling-manager-deployment.yaml

    sed -i "s/\[ZONE\]/$GCP_ZONE/g"

    k8s/openarena-scaling-manager-deployment.yaml

    sed -i "s/\gke-openarena-cluster-default-pool-\[REPLACE_ME\]/$GKE_BASE_INSTANCE_NAME/g" k8s/openarena-scaling-manager-deployment.yaml

     

    REPLACE_ME를 교체합니다! gcloud compute instance-groups manges list를 실행해서

    안에서 얻은 결과를 넣어줍니다.

     

    그런 다음, 클러스터를 배포합니다. 

    kubectl apply -f k8s/openarena-scaling-manager-deployment.yaml

    파드 확인해보는데, 3/3 노드가 Ready라고 뜰 때까지 기다립니다.

    kubectl get pods

     

    이제 노드 스케일링에 대한 설명입니다.

    노드를 스케일링하기 위해서, 스케일링 매니저는 Kubernetes API를 사용하여 현재 노드의 사용량을 확인하고 필요에 따라 현재 vm을 기반한 컨테이너 엔진 클러스터의 관리 인스턴스 그룹을 리사이즈합니다. 보편적인 DGS 스케일링 노드가 문제가 되는 점은 아래와 같습니다.

     

    자.. 가볍게 훑어주세요

     

    1) 표준 CPU와 메모리 사용량의 메트릭을 사용하여 게임 서버 인스턴스 스케일링 정보 취득에 실패할 수 있습니다.

    2) 사용 가능한 버퍼를 두고, 사용 중인 노드가 치명적이라면, 최적화된 DGS 컨테이너를 현존하는 노드로 스케줄링하여

    3) 많은 오토스케일러들이 우아하게 파드 셧다운을 하는 것은 불가능하기 때문에, 스케일링으로 제거되는 노드에서 파드를 빼내는 것은 중요합니다. 실행 중인 일치 항목이 하나라도 있는 노드를 종료하는 것은 허용되지 않습니다.

     

     

    이번 랩에서 스크립트는 기본적입니다. 하지만, 심플한 디자인은 로직을 쉽게 관리할 수 있습니다.

     

    다음으로 스케일링 업, 스케일링 다운, DGS 파드 수 스케일링 하기 등의 컨셉에 대해서 이야기해봅니다.

    스케일링 업부터 살펴볼까요? 클러스터에 대한 상향 스펙으로 VM을 구성하여 사용할 수 있습니다.

    간단히 말해 이것이 스케일링 업입니다.

     

     

     

     

    반면 스케일링 다운은 무엇일까요? DGS 스케일링 매니저를 사용하는 주 이유가 되겠는데,

    스케일링 다운이 DGS 스케일링 매니저를 사용하는 주된 이유가 된다고 합니다.

     

     

    node_stopper.sh 스크립트가 버려지거나 스케줄링 해제된 노드를 모니터링하는 역할을 합니다.

     

    다음으로 DGS 파드 수를 스케일링하기입니다.

    DGS 파드도 서로 일치를 이룬다면, 자기가 알아서 종료되도록 되어 있습니다.

     

     

    다음으로, 이제 본격적으로 테스팅해봅니다.

     

    1) 새로운 인스턴스 요청

    openarena/k8s/openarena_pod.yaml 파일을 업데이트합니다.

    image: value의 [GCR_REGION]이랑 [PROJECT_ID]를 교체할 것인데,

    sed 명령어를 사용하여 진행할 것입니다.

     

    cd ..

    sed -i "s/\[GCR_REGION\]/$GCR_REGION/g" openarena/k8s/openarena-pod.yaml

    sed -i "s/\[PROJECT_ID\]/$PROJECT_ID/g" openarena/k8s/openarena-pod.yaml

     

     

    만약, 명령어 실행 시 오류가 있다면 

     

    sed -i "s/\/usr\/share\/games\/openarena\/baseoa/\/usr\/lib\/openarena-server\/baseoa/g" openarena/k8s/openarena-pod.yaml

     

    이 명령어를 실행합니다.

     

    이후 새로운 파드의 구성을 해당 명령어를 통해 적용시킵니다.

    kubectl apply -f openarena/k8s/openarena-pod.yaml

     

    파드가 제대로 배포되었는지 다음의 명령어를 실행하여 확인합니다.

    kubectl get pods

     

    다음의 명령어를 통해서 게임 서버 IP를 확인합니다.

    export NODE_NAME=$(kubectl get pod openarena.dgs \

                -o jsonpath="{.spec.nodeName}")

    export DGS_IP=$(gcloud compute instances list \

                --filter="name=( ${NODE_NAME} )" \

                --format='table[no-heading](EXTERNAL_IP)’)

    printf "Node Name: $NODE_NAME \nNode IP : $DGS_IP \nPort : 27961\n"

    printf " launch client with: \nopenarena +connect $DGS_IP +set net_port 27961\n"

     

    컴퓨터에 게임이 설치되면 OpenArena 클라이언트를 통해 구동시킵니다.

    Multiplayer를 선택하고 Specify를 누릅니다.

    서버 ip 주소와 포트를 위의 명령어를 통해 나온 결과로 구성합니다.

    그리고 Connect를 누릅니다.

     

     

    스케일링 매니저가 DGS 파드의 수에 기반한 쿠버네티스 클러스터의 VM 인스턴스의 수를 확장하고,

    테스트하려면 일정기간 동안 다수의 파드 요청을 하고 노드의 수가 적절하게 확장되었는지를 체크합니다.

    이 테스트를 위해서 솔루션 레파지토리에 5분 동안 4개의 DGS 파드를 추가하는 스크립트가 제공됩니다.

     

    ./scaling-manager/tests/test-loader.sh

     

    이제 스케일링 매니저를 테스팅합니다. 인스턴스가 생성 중 오류가 발생한다면, CPU 리소스 부족으로 일어난 것임을 알 수 있습니다.

     

    이번 랩을 통해서 구글 쿠버네티스 엔진을 이용한 전용 게임 서버 배포를 해보았습니다!

    장시간 고생하셨습니다 😁

    다음 시간에 만나요!

     

    728x90
    반응형
Designed by Tistory.