Kubernetes Engine에서 Ruby Bookshelf 실행

이 가이드에서는 Google Kubernetes Engine(GKE)에서 Ruby Bookshelf 앱을 실행하는 방법을 보여줍니다. 이 가이드를 따라 기존 Ruby 웹 애플리케이션을 컨테이너화하고 GKE에 배포합니다. App Engine 표준 환경에 대한 가이드의 일부로 Bookshelf 앱 문서를 살펴보는 것이 좋습니다.

목표

  • GKE 클러스터 만들기
  • Ruby 앱 컨테이너화
  • Bookshelf 앱의 복제된 프런트엔드 만들기
  • Bookshelf 앱의 복제된 백엔드 만들기
  • 부하 분산 서비스를 만들어 Bookshelf 프런트엔드로 HTTP 트래픽 라우팅

비용

이 가이드에서는 다음과 같이 비용이 청구될 수 있는 Google Cloud Platform(GCP) 구성요소를 사용합니다.

  • GKE
  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Cloud Pub/Sub

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다. GCP 신규 사용자는 무료 평가판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Cloud Datastore, Kubernetes Engine, Cloud Storage, Cloud Pub/Sub, and Google+ APIs를 사용 설정합니다.

    APIs 사용 설정

  5. Install and initialize the Cloud SDK.
  6. Docker를 설치합니다. Docker는 컨테이너 이미지를 로컬에서 빌드하는 데 사용됩니다.
  7. kubectl을 설치합니다.
    gcloud components install kubectl

GKE 클러스터 만들기

GKE 클러스터는 단일 GKE 클러스터처럼 작동하는 관리형 Compute Engine 가상 머신 모음입니다. 이 가이드에는 노드가 최소 두 개 있는 클러스터가 필요하며, 이러한 노드에는 모든 Google API에 대한 액세스 권한이 필요합니다.

  1. 클러스터를 만듭니다. [YOUR_GCP_ZONE]을 클러스터를 호스팅할 GCP 영역으로 바꿉니다.

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform,userinfo-email" \
        --num-nodes 2 \
        --enable-basic-auth \
        --issue-client-certificate \
        --enable-ip-alias \
        --zone [YOUR_GCP_ZONE]
    
  2. 클러스터에 액세스할 수 있는지 확인합니다. 다음 명령어는 컨테이너 클러스터의 노드를 나열하고 컨테이너 클러스터가 실행 중이고 액세스할 수 있음을 나타냅니다.

    kubectl get nodes
    

kubectl 명령어를 사용하여 GKE 클러스터에 리소스를 만듭니다. kubectl에 대한 자세한 내용은 GKE 클러스터 작업을 참조하세요. 일반적으로 gcloud를 사용하여 GCP 프로젝트의 리소스를 관리하고 kubectl을 사용하여 GKE 클러스터 내의 리소스를 관리합니다. 단일 프로젝트는 여러 클러스터를 포함할 수 있으므로, 다양한 머신 유형으로 클러스터를 구성하여 다양한 요구 사항을 손쉽게 충족할 수 있습니다.

gcloud로 클러스터를 만들면 kubectl에 대한 인증이 자동으로 설정됩니다. Google Cloud Platform Console을 사용하여 생성된 클러스터는 gcloud container clusters get-credentials 명령어를 사용하여 인증을 설정할 수 있습니다.

샘플 앱 복제

샘플 앱은 GitHub(GoogleCloudPlatform/getting-started-ruby)에서 제공됩니다.

  1. 저장소를 복제합니다.

    git clone https://github.com/GoogleCloudPlatform/getting-started-ruby.git
    
  2. 샘플 디렉토리로 이동합니다.

    cd getting-started-ruby/optional-kubernetes-engine
    

Cloud Datastore 초기화

Bookshelf 앱은 Cloud Datastore를 사용하여 도서를 저장합니다. 프로젝트에서 Cloud Datastore를 처음으로 초기화하려면 다음 단계를 따르세요.

  1. GCP Console에서 Cloud Datastore를 엽니다.

  2. 데이터 저장소 지역을 선택하고 계속을 클릭합니다. 항목 만들기 페이지까지 진행하면 Bookshelf 앱이 Cloud Datastore에서 항목을 만들 수 있으므로 이 창을 닫습니다.

Cloud Storage 버킷 만들기

Bookshelf 앱은 Cloud Storage를 사용하여 이미지 파일을 저장합니다.

다음 안내에서는 Cloud Storage 버킷을 만드는 방법을 보여줍니다. 버킷은 Cloud Storage에서 데이터를 보관하는 기본 컨테이너입니다.

  1. 터미널 창에서 다음 명령어를 입력합니다.

    gsutil mb gs://[YOUR-BUCKET-NAME]

    각 항목의 의미는 다음과 같습니다.

    • [YOUR-BUCKET-NAME]은 Cloud Storage 버킷 이름을 나타냅니다.
  2. 버킷의 기본 액세스제어 목록(ACL)을 public-read로 설정하여 Bookshelf 앱에 업로드된 이미지를 확인합니다.

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

    Cloud Pub/Sub 주제 및 구독 만들기

    Bookshelf 애플리케이션은 요청의 백그라운드 처리 대기열에 Cloud Pub/Sub를 사용하여 Bookshelf에 추가된 도서의 데이터를 Google Books API에서 가져옵니다.

    1. 다음 Cloud SDK 명령어를 사용하여 새로운 Cloud Pub/Sub 주제를 만듭니다.

      gcloud pubsub topics create [YOUR_PUBSUB_TOPIC]
      
    2. 다음 명령어를 사용하여 이전 단계에서 만든 주제에 대해 새로운 Cloud Pub/Sub 구독을 만듭니다.

      gcloud pubsub subscriptions create --topic [YOUR_PUBSUB_TOPIC] [YOU_PUBSUB_SUBSCRIPTION]
      

    애플리케이션 구성

    1. 예 구성 파일을 복사하여 맞춤설정된 버전을 만듭니다. 이들 파일은 .gitignore에 있으며 버전 관리의 적용을 받지 않습니다.

      cp config/database.example.yml config/database.yml
      cp config/settings.example.yml config/settings.yml
      
    2. 수정하기 위해 config/database.yml을 엽니다.

    3. [YOUR_PROJECT_ID]를 프로젝트 ID로 바꿉니다.

    4. 수정하기 위해 config/settings.yml을 엽니다.

    5. 다음과 같이 바꿉니다.

      • [YOUR_PROJECT_ID] 를 프로젝트 ID로 바꿉니다.
      • [YOUR_PUBSUB_TOPIC]을 Cloud Pub/Sub 주제로 바꿉니다.
      • [YOUR_PUBSUB_SUBSCRIPTION]을 Cloud Pub/Sub 구독으로 바꿉니다.
      • [YOUR_BUCKET_NAME]을 이전 단계에서 만든 버킷 이름으로 바꿉니다.
      • [YOUR_CLIENT_ID]를 OAuth 클라이언트 ID로 바꿉니다.
      • [YOUR_CLIENT_SECRET]를 OAuth 클라이언트 비밀번호로 바꿉니다.

    앱 컨테이너화

    샘플 앱에는 앱의 Docker 이미지를 만드는 데 사용되는 Dockerfile이 포함되어 있습니다. 이 Docker 이미지는 GKE에서 앱을 실행합니다.

    # The Google App Engine Ruby runtime is Debian Jessie with Ruby installed
    # and various os-level packages to allow installation of popular Ruby
    # gems. The source is on github at:
    #   https://github.com/GoogleCloudPlatform/ruby-docker
    FROM gcr.io/google_appengine/ruby
    
    # Install 2.4.3 if not already preinstalled by the base image
    RUN cd /rbenv/plugins/ruby-build && \
        git pull && \
        rbenv install -s 2.4.3 && \
        rbenv global 2.4.3 && \
        gem install -q --no-rdoc --no-ri bundler --version 1.16.1
    ENV RBENV_VERSION 2.4.3
    
    # Copy the application files.
    COPY . /app/
    
    # Install required gems.
    RUN bundle install --deployment && rbenv rehash
    
    # Set environment variables.
    ENV RACK_ENV=production \
        RAILS_ENV=production \
        RAILS_SERVE_STATIC_FILES=true
    
    # Run asset pipeline.
    RUN bundle exec rake assets:precompile
    
    # Reset entrypoint to override base image.
    ENTRYPOINT []
    
    # Use foreman to start processes. $FORMATION will be set in the pod
    # manifest. Formations are defined in Procfile.
    CMD bundle exec foreman start --formation "$FORMATION"
    
    샘플 애플리케이션에는 .dockerignore 파일도 포함되어 있는데, 이 파일은 결과 Docker 컨테이너에 포함되지 않는 파일 경로를 나열합니다. 일반적으로 이 파일에는 빌드 아티팩트 및 로컬 종속 항목 설치가 포함됩니다.

    # Copyright 2015, Google, Inc.
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #    http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    .git
    log/*
    tmp/*
    
  3. 앱의 Docker 이미지를 빌드합니다.

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  4. 클러스터가 이미지에 액세스할 수 있도록 이미지를 Google Container Registry로 푸시합니다.

    gcloud docker -- push gcr.io/[YOUR_PROJECT_ID]/bookshelf
    

Bookshelf 프런트엔드 배포

Bookshelf 애플리케이션에는 프런트엔드 서버와 백엔드 작업자가 있습니다. 프런트엔드 서버는 웹 요청을 처리하고 백엔드 작업자는 도서를 처리하고 정보를 추가합니다.

프런트엔드를 실행하는 데 필요한 클러스터 리소스는 bookshelf-frontend.yaml에서 정의됩니다. 이러한 리소스는 Kubernetes 배포로 설명됩니다. 배포를 통해 복제본 세트 및 관련 포드를 쉽게 만들고 업데이트할 수 있습니다.

# Copyright 2016, Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This file configures the bookshelf application frontend. The frontend serves
# public web traffic.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-frontend
  labels:
    app: bookshelf
    tier: frontend
# The bookshelf frontend replica set ensures that at least 3
# instances of the bookshelf app are running on the cluster.
# For more info about Pods see:
#   https://cloud.google.com/kubernetes-engine/docs/pods/
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: bookshelf
        tier: frontend
    spec:
      containers:
      - name: bookshelf-app
        # Replace [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        # The FORMATION environment variable is used by foreman in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the bookshelf process is needed.
        env:
        - name: FORMATION
          value: web=1
        # The bookshelf process listens on port 8080 for web traffic by default.
        ports:
        - name: http-server
          containerPort: 8080
  1. bookshelf-frontend.yaml에서 [YOUR_PROJECT_ID]를 프로젝트 ID로 바꿉니다.
  2. 리소스를 클러스터에 배포합니다.

    kubectl create -f bookshelf-frontend.yaml
    
  3. 배포 상태를 추적합니다.

    kubectl get deployments
    

    배포에서 필요한 포드와 동일한 수의 포드를 사용할 수 있게 되면 배포는 완료됩니다. 배포에 문제가 발생하면 배포를 삭제하고 다시 시작할 수 있습니다.

    kubectl delete deployments bookshelf-frontend
    
  4. 배포가 완료되면 배포에서 만들어진 포드를 확인할 수 있습니다.

    kubectl get pods
    

Bookshelf 백엔드 배포

Bookshelf 백엔드는 프런트엔드와 동일한 방식으로 배포됩니다.

# Copyright 2016, Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This file configures the bookshelf worker. The worker processes
# jobs in the background.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-worker
  labels:
    app: bookshelf
    tier: worker
# The bookshelf worker replica set ensures that at least 2
# instances of the bookshelf worker are running on the cluster.
# For more info about Pods see:
#   https://cloud.google.com/kubernetes-engine/docs/pods/
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: bookshelf
        tier: worker
    spec:
      containers:
      - name: bookshelf-worker
        # Replace [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        # The FORMATION environment variable is used by foreman in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the worker process is needed.
        env:
        - name: FORMATION
          value: worker=1
  1. bookshelf-worker.yaml에서 [YOUR_PROJECT_ID]를 프로젝트 ID로 바꿉니다.
  2. 리소스를 클러스터에 배포합니다.

    kubectl create -f bookshelf-worker.yaml
    
  3. 포드가 실행 중인지 확인합니다.

    kubectl get pods
    

Bookshelf 서비스 만들기

Kubernetes 서비스는 포드 모음에 대한 단일 액세스 포인트를 제공합니다. 단일 포드에 액세스할 수는 있지만 포드는 수명이 짧기 때문에 일반적으로 단일 엔드포인트를 사용하여 포드 모음에 주소를 지정하는 것이 더 편리합니다. Bookshelf 앱에서 Bookshelf 서비스는 단일 IP 주소에서 Bookshelf 프런트엔드 포드에 액세스할 수 있게 해줍니다. 이 서비스는 bookshelf-service.yaml에 정의되어 있습니다.

# Copyright 2016, Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The bookshelf service provides a load-balancing proxy over the bookshelf
# frontend pods. By specifying the type as a 'LoadBalancer', Kubernetes Engine
# will create an external HTTP load balancer.
# For more information about Services see:
#   https://cloud.google.com/kubernetes-engine/docs/services/
# For more information about external HTTP load balancing see:
#   https://cloud.google.com/kubernetes-engine/docs/load-balancer
apiVersion: v1
kind: Service
metadata:
  name: bookshelf-frontend
  labels:
    app: bookshelf
    tier: frontend
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: http-server
  selector:
    app: bookshelf
    tier: frontend

포드와 포드를 사용하는 서비스는 별개라는 점에 주의합니다. Kubernetes는 라벨을 사용하여 서비스에서 주소를 지정하는 포드를 선택합니다. 라벨을 사용하면 서비스 한 개에서 다양한 복제본 모음의 포드에 주소를 지정할 수 있고 여러 서비스에서 개별 포드를 가리킬 수도 있습니다.

  1. Bookshelf 서비스를 만듭니다.

    kubectl create -f bookshelf-service.yaml
    
  2. 서비스의 외부 IP 주소를 가져옵니다.

    kubectl describe service bookshelf
    

    IP 주소를 할당하는 데 최대 60초 걸릴 수 있습니다. 외부 IP 주소는 LoadBalancer Ingress 아래에 나열됩니다.

Bookshelf 앱에 액세스

이제 GKE에서 Bookshelf 앱을 실행하는 데 필요한 모든 리소스를 배포했습니다. 이전 단계의 외부 IP 주소를 사용하여 웹브라우저에서 앱을 로드하고 도서를 만듭니다. 작업자를 배포한 경우, 도서는 자동으로 Google Books API의 정보로 업데이트됩니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

프로젝트 삭제

청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. GCP 콘솔에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 프로젝트 삭제를 클릭합니다. 프로젝트 이름 옆의 체크박스를 선택한 다음 프로젝트 삭제 클릭
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

클러스터 삭제

클러스터를 삭제하면 모든 GKE와 Compute Engine 리소스가 삭제되지만, Cloud Storage, Cloud Datastore, Cloud Pub/Sub의 리소스를 수동으로 제거해야 합니다.

다음 명령어를 사용하여 클러스터를 삭제합니다. [YOUR_GCP_ZONE]클러스터 생성 시 사용한 영역으로 바꿉니다.

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

다음 단계

  • 다른 Google Cloud Platform 기능을 직접 사용해 보세요. 가이드를 살펴보세요.
  • 다른 GCP 서비스 살펴보기
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...