在 Kubernetes Engine 上執行 Go Bookshelf

本教學課程說明如何在 Google Kubernetes Engine (GKE) 執行 Go Bookshelf 應用程式。請按照本教學課程的說明,將現有 Go 網路應用程式容器化並部署至 GKE。強烈建議您瀏覽 Bookshelf 應用程式說明文件,這是 App Engine 標準環境教學課程的一部分。

目標

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

費用

本教學課程使用的 Google Cloud Platform (GCP) 收費元件包括:

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

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

事前準備

  1. 登入您的 Google 帳戶。

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

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

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

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

    瞭解如何啟用計費功能

  4. 啟用Cloud Datastore, Kubernetes Engine, Cloud Storage, Cloud Pub/Sub, and Google+ API。

    啟用 API

  5. 安裝並初始化 Cloud SDK
  6. 安裝 Docker。Docker 可用來在本機上建構容器映像檔。
  7. 安裝 kubectl
    gcloud components install kubectl

建立 GKE 叢集

GKE 叢集是由一組代管的 Compute Engine 機器組成,可做為單一 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/golang-samples) 找到範例應用程式。

  1. 複製存放區。

    go get -u -d github.com/GoogleCloudPlatform/golang-samples/getting-started/bookshelf
    
  2. 前往範例目錄。

    cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/getting-started/bookshelf
    

初始化 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]

    設定應用程式

    1. 將 Dockerfile 複製到 bookshelf 目錄。

      cp gke_deployment/Dockerfile .
      
    2. 開啟 config.go 進行編輯。這個檔案包含範例應用程式的設定。

    3. 取消註解以下這一行:

      // DB, err = configureDatastoreDB("<your-project-id>")
      
    4. <your-project-id> 替換為您的專案 ID:

    5. 取消註解以下這兩行:

      // StorageBucketName = "<your-storage-bucket>"
      // StorageBucket, err = configureStorage(StorageBucketName)
      
    6. <your-storage-bucket> 替換為您在上一步建立的值區名稱。

    7. 取消註解以下這一行:

      // PubsubClient, err = configurePubsub("<your-project-id>")
      
    8. <your-project-id> 替換為您的專案 ID。

    將應用程式容器化

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

    FROM golang:alpine
    
    ARG pkg=github.com/GoogleCloudPlatform/golang-samples/getting-started/bookshelf
    
    RUN apk add --no-cache ca-certificates
    
    COPY . $GOPATH/src/$pkg
    
    RUN set -ex \
          && apk add --no-cache --virtual .build-deps \
                  git \
          && go get -v $pkg/... \
          && apk del .build-deps
    
    RUN go install $pkg/...
    
    # Needed for templates for the front-end app.
    WORKDIR $GOPATH/src/$pkg/app
    
    # Users of the image should invoke either of the commands.
    CMD echo "Use the app or pubsub_worker commands."; exit 1
    
  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 部署。您可以透過部署輕鬆建立及更新備用資源集與相關 Pod。

# Copyright 2019 Google LLC
#
# 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
#
#     https://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://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: bookshelf
        tier: frontend
    spec:
      containers:
      - name: bookshelf-app
        # TODO: Replace [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        command: ["app"]
        # 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 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 2019 Google LLC
#
# 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
#
#     https://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-worker
  labels:
    app: bookshelf
    tier: worker
# 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://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: bookshelf
        tier: worker
    spec:
      containers:
      - name: bookshelf-worker
        # TODO: Replace [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        command: ["pubsub_worker"]
        # 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
  1. bookshelf-worker.yaml 中,將 [YOUR_PROJECT_ID] 替換為您的專案 ID。

  2. 將資源部署至叢集。

    kubectl create -f bookshelf-worker.yaml
    
  3. 確認 Pod 正在執行。

    kubectl get pods
    

建立 Bookshelf 服務

Kubernetes Services 為您提供存取整組 Pod 的單一管道。雖然可以存取單一 Pod,但 Pod 是臨時的,通常使用單一端點解決一組 Pod 更適合。在 Bookshelf 應用程式中,Bookshelf 服務可讓您在單一 IP 位址存取 Bookshelf 前端 Pod。這個服務會在 bookshelf-service.yaml 中定義。

# Copyright 2019 Google LLC
#
# 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
#
#     https://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 位址最多可能需要 60 秒的時間。外部 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 服務
本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁