在 Kubernetes Engine 上執行 Python Bookshelf

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

目標

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

費用

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

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

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

事前準備

  1. 登入您的 Google 帳戶。

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

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

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

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

    瞭解如何啟用計費功能

  4. 啟用Cloud Datastore API, GKE API, Cloud Storage API, Cloud Pub/Sub API API。

    啟用 API

  5. 安裝並初始化 Cloud SDK
  6. 安裝 Docker。Docker 可用來在本機上建構容器映像檔。
  7. 安裝 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" \
        --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-python 中找到範例應用程式。

  1. 複製存放區。

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git
    
  2. 前往範例目錄。

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

初始化 Cloud Datastore

Bookshelf 應用程式使用 Cloud Datastore 儲存書籍。首次在專案中初始化 Cloud Datastore 時,請完成以下步驟:

  1. 在 GCP 主控台中,開啟「Cloud Datastore」頁面。

    前往「Cloud Datastore」頁面

  2. 為 Datastore 選取地區,然後按一下 [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]

設定應用程式

  1. 開啟 config.py 進行編輯。
  2. [PROJECT_ID] 替換為您的專案 ID。
  3. 使用在上一步建立的值區名稱更新 [CLOUD_STORAGE_BUCKET]

其餘設定值保持不變。

將應用程式容器化

範例應用程式包含一個可用於建立應用程式 Docker 映像檔的 Dockerfile。此 Docker 映像檔可在 GKE 上執行應用程式。

# The Google App Engine python runtime is Debian Jessie with Python installed
# and various os-level packages to allow installation of popular Python
# libraries. The source is on github at:
#   https://github.com/GoogleCloudPlatform/python-docker
FROM gcr.io/google-appengine/python

# Create a virtualenv for the application dependencies.
# If you want to use Python 2, add the -p python2.7 flag.
RUN virtualenv -p python3.4 /env

# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate. This ensures the application is executed within
# the context of the virtualenv and will have access to its dependencies.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Install dependencies.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# Add application code.
ADD . /app

# Instead of using gunicorn directly, we'll use Honcho. Honcho is a python port
# of the Foreman process manager. $PROCESSES is set in the pod manifest
# to control which processes Honcho will start.
CMD honcho start -f /app/procfile $PROCESSES
範例應用程式也包含 .dockerignore 檔案,其中列出不包含在產生的 Docker 容器中的檔案路徑。通常,這個檔案會包含版本成果與本機依附元件安裝項目。

__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
*.log
.git
  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 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

# 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
# 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 [GCLOUD_PROJECT] with your project ID or use `make template`.
        image: gcr.io/[GCLOUD_PROJECT]/bookshelf
        # 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 PROCESSES environment variable is used by Honcho in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the bookshelf process is needed.
        env:
        - name: PROCESSES
          value: bookshelf
        # The bookshelf process listens on port 8080 for web traffic by default.
        ports:
        - name: http-server
          containerPort: 8080
  1. bookshelf-frontend.yaml 中,將 [GCLOUD_PROJECT] 替換為您的專案 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 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

# This file configures the bookshelf task worker. The worker is responsible
# for processing book requests and updating book information.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-worker
  labels:
    app: bookshelf
# The bookshelf worker replica set ensures that at least 2 instances of the
# bookshelf worker pod 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-app
        # Replace [GCLOUD_PROJECT] with your project ID or use `make template`.
        image: gcr.io/[GCLOUD_PROJECT]/bookshelf
        # 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 PROCESSES environment variable is used by Honcho in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the worker process is needed.
        env:
        - name: PROCESSES
          value: worker
  1. bookshelf-worker.yaml 中,將 [GCLOUD_PROJECT] 替換為您的專案 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」(專案) 頁面。

    前往「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 服務
本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁