在 Google Kubernetes Engine 上執行 Ruby Bookshelf 應用程式

本教學課程說明如何在 Google Kubernetes Engine (GKE) 上執行 Ruby Bookshelf 範例應用程式。請按照本教學課程的說明,將現有的 Ruby 網頁應用程式容器化並部署至 GKE。建議您完整閱讀 Bookshelf 應用程式說明文件,作為 App Engine 標準環境教學課程的一部分。

目標

  • 建立 GKE 叢集。
  • 將 Ruby 應用程式容器化。
  • 為 Bookshelf 應用程式建立複製的前端。
  • 為 Bookshelf 應用程式建立複製的後端。
  • 建立負載平衡服務,將 HTTP 流量轉送至 Bookshelf 前端。

費用

本教學課程使用下列 Google Cloud Platform 計費元件:

您可以使用 Pricing Calculator,根據您的預測使用量來產生預估費用。 初次使用 GCP 的使用者可能符合申請免費試用的資格。

完成本教學課程後,您可以刪除建立的資源,以免系統繼續收取資源的費用。詳情請參閱清除所用資源一節。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %} 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。
    • {% dynamic endif %}

    您可以隨時在 GCP 主控台中查看及管理這些資源。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %} 啟用{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要的{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。 {% dynamic endif %}

    啟用{% dynamic if "," in setvar.api_list %} API{% dynamic else %} API{% dynamic endif %}

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  6. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  7. 安裝並初始化 Cloud SDK
  8. 安裝 Docker。Docker 可用來在本機上建構容器映像檔。
  9. 安裝 kubectl
    gcloud components install kubectl

建立 GKE 叢集

GKE 叢集是由一組代管的 Compute Engine 虛擬機器 (VM) 組成,可做為單一 GKE 叢集運作。本教學課程需建立至少含有兩個節點的叢集,且這些節點必須能夠存取所有的 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 主控台建立叢集,則可以使用 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 主控台中,開啟「Cloud Datastore」頁面。

    前往「Cloud Datastore」頁面

  2. 選取資料儲存庫的地區,然後按一下 [Continue] (繼續),直到您進入「Create an Entity」(建立實體) 頁面為止。關閉視窗;此時 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. 如要查看 Bookshelf 應用程式中的上傳圖片,請將值區的預設存取控制清單 (ACL) 設定為 public-read

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

建立 Cloud Pub/Sub 主題和訂閱

針對新增至 Bookshelf 的書籍,Bookshelf 應用程式使用 Cloud Pub/Sub 儲存來自 Google Books API 的資料要求。

  1. 使用以下 Cloud SDK 指令建立新的 Cloud Pub/Sub 主題,其中 [YOUR_PUBSUB_TOPIC] 是新 Cloud Pub/Sub 主題的名稱。

    gcloud pubsub topics create [YOUR_PUBSUB_TOPIC]
    
  2. 針對前一步驟中建立的主題,建立新的 Cloud Pub/Sub 訂閱,其中 [YOUR_PUBSUB_SUBSCRIPTION] 是您的 Cloud Pub/Sub 訂閱。

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

設定應用程式

  1. 複製範例設定檔來建立自訂版本。這些範例設定檔位於 .gitignore,且不會修訂至版本控制。

    cp config/database.example.yml config/database.yml
    cp config/settings.example.yml config/settings.yml
    
  2. 開啟 config/database.yml 進行編輯,並將 [YOUR_PROJECT_ID] 替換成您的專案 ID。

  3. 開啟 config/settings.yml 進行編輯,並替換下列值:

    • [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/*
  1. 建構應用程式的 Docker 映像檔。

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  2. 將映像檔推送至 Container Registry,以便您的叢集可以存取該映像檔。

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

部署 Bookshelf 前端

Bookshelf 應用程式擁有處理網路要求的前端伺服器,以及處理書籍與新增其他資訊的後端工作站。

執行前端所需的叢集資源定義在 bookshelf-frontend.yaml 中。這些資源稱為 GKE 部署。您可以使用部署來建立和更新備用資源組合及其相關聯的 Pod。

# 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
    

    一旦部署擁有的可用 Pod 達到所需數量,即表示部署已完成。如果部署發生問題,您可以將其刪除,然後重新開始。

    kubectl delete deployments bookshelf-frontend
    
  4. 部署完成後,您可查看部署建立的 Pod。

    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. 確認 Pod 正在執行。

    kubectl get pods
    

建立 Bookshelf 服務

GKE 服務可讓您從單點存取一組 Pod。雖然您可以存取單一 Pod,但由於 Pod 是暫時的,所以透過單一端點處理一組 Pod 會更方便。在 Bookshelf 應用程式中,Bookshelf 服務可讓您從單一 IP 位址存取 Bookshelf 前端 Pod。這個服務會在 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

請注意,Pod 與使用 Pod 的服務是分別獨立的。Kubernetes 使用標籤來選取服務處理的 Pod。透過標籤,您可以讓服務處理來自不同備用資源組合的 Pod,也可以讓多個服務指向個別 Pod。

  1. 建立 Bookshelf 服務。

    kubectl create -f bookshelf-service.yaml
    
  2. 取得服務的外部 IP 位址。

    kubectl describe service bookshelf
    

    分配 IP 位址最多可能需要一分鐘的時間。外部 IP 位址會列在 LoadBalancer Ingress 下方。

存取 Bookshelf 應用程式

現在,您已經部署了在 GKE 上執行 Bookshelf 應用程式需要的所有資源。如要在網路瀏覽器中載入應用程式並建立書籍,請使用先前步驟中的外部 IP 位址。

如果您部署了工作站,系統會使用 Google Books API 中的資訊自動更新書籍。

清除所用資源

如要避免系統向您的 Google Cloud Platform 帳戶,收取您在本教學課程中所用資源的相關費用:

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

刪除專案:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

刪除叢集

刪除叢集也會一併移除所有 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 服務
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁