將 Docker 容器化網頁應用程式部署至 GKE


本教學課程說明如何在 Google Kubernetes Engine (GKE) 叢集上部署容器化網頁應用程式。

本頁適用於佈建及設定雲端資源,並部署應用程式和服務的營運人員和開發人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

閱讀本頁面之前,請先熟悉 Kubernetes

目標

  • 將範例網頁應用程式封裝至 Docker 映像檔中。
  • 將 Docker 映像檔上傳至 Artifact Registry。
  • 建立 GKE 叢集。
  • 將範例應用程式部署至叢集。
  • 為部署項目管理自動調度資源作業。
  • 將範例應用程式公開發布到網際網路。
  • 部署新版的範例應用程式。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.

    Enable the APIs

  8. 啟用 Cloud Shell

    Cloud Shell 已預先安裝本教學課程使用的 gclouddockerkubectl 指令列工具。

    1. 前往Google Cloud 控制台
    2. 按一下主控台視窗頂端的「啟用 Cloud Shell」啟動 Shell 按鈕 Google Cloud 按鈕。

      系統會在 Google Cloud 控制台底部的新頁框中開啟 Cloud Shell 工作階段,並顯示指令列提示。

      Cloud Shell 工作階段

建立存放區

在本教學課程中,您會將映像檔儲存在 Artifact Registry 中,並從該登錄檔部署映像檔。在本快速入門導覽課程中,您將建立名為 hello-repo 的存放區。

  1. PROJECT_ID 環境變數設為您的Google Cloud 專案 ID (PROJECT_ID)。建構容器映像檔並推送至存放區時,您會使用這個環境變數。

    export PROJECT_ID=PROJECT_ID
    
  2. 確認 PROJECT_ID 環境變數具有正確的值:

    echo $PROJECT_ID
    
  3. 為 Google Cloud CLI 設定專案 ID

    gcloud config set project $PROJECT_ID
    

    輸出:

    Updated property [core/project].
    
  4. 使用下列指令建立 hello-repo 存放區:

    gcloud artifacts repositories create hello-repo \
       --repository-format=docker \
       --location=REGION \
       --description="Docker repository"
    

    REGION 替換為存放區的區域,例如 us-west1。如要查看可用位置清單,請執行下列指令:

     gcloud artifacts locations list
    

建構 hello-app Docker 映像檔

在本教學課程中,您會部署名為 hello-app範例網頁應用程式;這是使用 Go 撰寫的網路伺服器,會透過通訊埠 8080,以「Hello, World!」訊息回應所有要求。

GKE 接受以 Docker 映像檔這種格式部署應用程式。將 hello-app 部署至 GKE 之前,您必須將 hello-app 原始碼封裝為 Docker 映像檔。

如要建構 Docker 映像檔,您需要有原始碼及 Dockerfile。Dockerfile 包含映像檔建構方式的操作說明。

  1. 執行下列指令,下載 hello-app 原始碼和 Dockerfile:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/quickstarts/hello-app
    
  2. hello-app 建構及標記 Docker 映像檔:

    docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .
    

    這個指令會指示 Docker 使用目前目錄中的 Dockerfile 建構映像檔,並將映像檔儲存至本機環境,然後為映像檔標記名稱,例如 us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1。 此映像檔會在下一節中推送至 Artifact Registry。

    • PROJECT_ID 變數會將容器映像檔與專案中的hello-repo存放區相關聯。 Google Cloud
    • us-west1-docker.pkg.dev 前置字串是指 Artifact Registry,也就是存放區的區域主機。
  3. 執行 docker images 指令來確認建構作業是否成功:

    docker images
    

    輸出:

    REPOSITORY                                                 TAG     IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/my-project/hello-repo/hello-app    v1      25cfadb1bf28   10 seconds ago   54 MB
    
  4. 將 IAM 政策繫結新增至服務帳戶:

    gcloud artifacts repositories add-iam-policy-binding hello-repo \
        --location=REGION \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role="roles/artifactregistry.reader"
    

    PROJECT_NUMBER 替換為專案的專案編號

(選用) 在本機執行 Docker 容器

  1. 使用本機 Docker 引擎測試容器映像檔:

    docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    
  2. 點選「Web Preview」(網頁預覽) 按鈕 網頁預覽功能按鈕,然後選取 8080 通訊埠編號。接著,GKE 就會在新的瀏覽器視窗中,開啟相關 Proxy 服務的預覽網址。

將 Docker 映像檔推送至 Artifact Registry

您必須將容器映像檔上傳至登錄檔,這樣 GKE 叢集才能下載並執行這個映像檔。在本教學課程中,您會將容器儲存在 Artifact Registry 中。

  1. 設定 Docker 指令列工具來向 Artifact Registry 進行驗證:

    gcloud auth configure-docker REGION-docker.pkg.dev
    
  2. 將您建構的 Docker 映像檔推送至存放區:

    docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    

建立 GKE 叢集

現在 Docker 映像檔已存放於 Artifact Registry,接著請建立 GKE 叢集 來執行 hello-app。GKE 叢集是由執行 KubernetesCompute Engine VM 執行個體集區所組成;其中,「Kubernetes」這套開放原始碼叢集自動化調度管理系統可用來為 GKE 提供支援。

Cloud Shell

  1. 設定 Compute Engine 區域

     gcloud config set compute/region REGION
    

    如果是標準區域叢集,請設定最靠近 Artifact Registry 存放區的 Compute Engine 區域。

  2. 建立名為 hello-cluster 的叢集:

     gcloud container clusters create-auto hello-cluster
    

    建立 GKE 叢集並進行健康檢查需要幾分鐘的時間。如要在 GKE Standard 叢集上執行本教學課程,請改用 gcloud container clusters create 指令。

控制台

  1. 在 Google Cloud 控制台中,前往「Create an Autopilot cluster」(建立 Autopilot 叢集) 頁面。

    前往「Create an Autopilot cluster」(建立 Autopilot 叢集) 頁面

  2. 在「Name」欄位中輸入名稱 hello-cluster

  3. 從「Region」(區域) 下拉式清單中選取 Compute Engine 區域,例如「us-west1」。

  4. 點選「建立」

  5. 等待叢集建立完成。叢集準備就緒時,叢集名稱旁會顯示勾號。

hello-app 部署至 GKE

現在可以開始將建構的 Docker 映像檔部署至 GKE 叢集。

Kubernetes 會以 Pod 的形式呈現應用程式,Pod 是可擴充的單位,其中包含一或多個容器。Pod 是 Kubernetes 中最小的可部署單位。通常,您會將 Pod 部署為一組副本,這些副本可一起擴充及分散到叢集各處。您可以透過 Kubernetes Deployment 部署一組副本。

在本節中,您將建立 Kubernetes Deployment,以便在叢集中執行 hello-app。這個 Deployment 有備用資源 (Pod)。一個 Deployment Pod 僅含一個容器:hello-app Docker 映像檔。 您也可以建立 HorizontalPodAutoscaler 資源,根據 CPU 負載量,將 Pod 數量從 3 個調整為 1 到 5 個。

Cloud Shell

  1. 確認您已連線至 GKE 叢集。

    gcloud container clusters get-credentials hello-cluster --region REGION
    
  2. hello-app Docker 映像檔建立 Kubernetes Deployment。

    kubectl create deployment hello-app --image=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    
  3. 將 Deployment 備用資源的基準數設為 3。

    kubectl scale deployment hello-app --replicas=3
    
  4. 為 Deployment 建立 HorizontalPodAutoscaler 資源。

    kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5
    
  5. 如要查看建立的 Pod,請執行下列指令:

    kubectl get pods
    

    輸出:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-784d7569bc-hgmpx   1/1     Running   0          90s
    hello-app-784d7569bc-jfkz5   1/1     Running   0          90s
    hello-app-784d7569bc-mnrrl   1/1     Running   0          95s
    

控制台

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下「部署」

  3. 在「Specify container」(指定容器) 區段中,選取「Existing container image」(現有容器映像檔)

  4. 按一下「Image path」(映像檔路徑) 欄位中的「Select」(選取)

  5. 在「Select container image」(選取容器映像檔) 窗格中,選取您推送至 Artifact Registry 的 hello-app 映像檔,然後按一下「Select」(選取)

  6. 在「容器」部分中,依序點選「完成」和「繼續」

  7. 在「Configuration」(設定) 專區中的「Labels」(標籤) 下方輸入 app 來當做「Key」(鍵),然後輸入 hello-app 來當做「Value」(值)

  8. 在「Configuration YAML」(設定 YAML) 下方,按一下「View YAML」(查看 YAML)。這項操作會開啟 YAML 設定檔,代表了要部署至叢集中的兩項 Kubernetes API 資源:一項 Deployment,以及該 Deployment 的一項 HorizontalPodAutoscaler

  9. 依序按一下「關閉」和「部署」

  10. 部署作業 Pod 準備就緒之後,「Deployment details」(部署作業詳細資料) 頁面隨即開啟。

  11. 在「Managed pods」(代管的 pod) 下方,查看 hello-app 部署作業的三個運作中 Pod。

將應用程式公開發布到網際網路

雖然 Pod 確實有個別指派的 IP 位址,但這些 IP 只能從叢集內部存取。此外,GKE Pod 是暫時性的,會根據資源調度需求啟動或停止。如果 Pod 因錯誤而當機,GKE 會自動重新部署該 Pod,每次都會指派新的 Pod IP 位址。

也就是說,對於任何部署作業,與有效 Pod 集對應的 IP 位址集都是動態的。我們需要一種方法,將 Pod 分組為一個靜態主機名稱,並將一組 Pod 公開到叢集外部的網際網路上。

Kubernetes 服務可解決這兩個問題。 Service 群組 Pod 整合成一個靜態 IP 位址,可透過叢集內的任何 Pod 存取。GKE 也會將 DNS 主機名稱指派給該靜態 IP。例如:hello-app.default.svc.cluster.local

GKE 中的預設 Service 類型稱為 ClusterIP,Service 會取得一個只能從叢集內部存取的 IP 位址。 如要從叢集外部公開發布 Kubernetes Service,請建立類型為 LoadBalancer 的 Service。這種類型的 Service 會為一組可透過網際網路存取的 Pod 產生外部負載平衡器 IP。

在本節中,您會使用 LoadBalancer 類型的 Service,將 hello-app Deployment 公開發布至網際網路。

Cloud Shell

  1. 使用 kubectl expose 指令為 hello-app 部署作業產生 Kubernetes Service:

    kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080
    

    在這裡,--port 旗標會指定在負載平衡器上設定的通訊埠編號,--target-port 旗標會指定 hello-app 容器要監聽的通訊埠編號。

  2. 執行下列指令以取得 hello-app-service 的 Service 詳細資料:

    kubectl get service
    

    輸出:

    NAME                 CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
    hello-app-service    10.3.251.122    203.0.113.0     80:30877/TCP     10s
    
  3. EXTERNAL_IP 位址複製到剪貼簿 (例如 203.0.113.0)。

控制台

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下 hello-app

  3. 在「部署作業詳細資料」頁面中,依序點選 「動作」>「公開」

  4. 在「Expose」(公開) 對話方塊中,將「Target port」(目標通訊埠) 設為 8080。 這是 hello-app 容器監聽的通訊埠。

  5. 在「服務類型」下拉式選單中,選取「負載平衡器」

  6. 按一下「Expose」(公開),為 hello-app 建立 Kubernetes Service。

  7. 負載平衡器準備就緒之後,「Service details」(服務詳細資料) 頁面隨即開啟。

  8. 向下捲動至「外部端點」欄位,然後複製 IP 位址。

現在 hello-app Pod 已透過 Kubernetes 服務公開至網際網路,您可以開啟新的瀏覽器分頁,然後前往您複製到剪貼簿的服務 IP 位址。畫面上會顯示 Hello, World! 訊息和 Hostname 欄位。Hostname 對應至其中一個 hello-app Pod,負責將 HTTP 要求傳送至瀏覽器。

部署新版 hello-app

在本節中,您將建構新的 Docker 映像檔並部署至 GKE 叢集,藉此將 hello-app 升級至新版本。

Kubernetes 滾動式更新功能可讓您更新部署作業,不必停機。在滾動式更新期間,GKE 叢集會逐步將現有的 hello-app Pod 換成包含新版 Docker 映像檔的 Pod。更新期間,負載平衡器服務只會將流量轉送至可用的 Pod。

  1. 返回 Cloud Shell,您已在其中複製 hello 應用程式原始碼和 Dockerfile。更新 main.go 檔案中的 hello() 函式,回報新版本 2.0.0

  2. 建構及標記新的 hello-app Docker 映像檔。

    docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .
    
  3. 將映像檔推送至 Artifact Registry。

    docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
    

現在,您可以更新 hello-app Kubernetes Deployment,改用新的 Docker 映像檔。

Cloud Shell

  1. 使用 kubectl set image 指令,將滾動式更新套用至含有映像檔更新的現有 hello-app Deployment:

    kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
    
  2. 觀察執行 v1 映像檔的 Pod 停止執行,以及執行 v2 映像檔的新 Pod 開始執行。

    watch kubectl get pods
    

    輸出:

    NAME                        READY   STATUS    RESTARTS   AGE
    hello-app-89dc45f48-5bzqp   1/1     Running   0          2m42s
    hello-app-89dc45f48-scm66   1/1     Running   0          2m40s
    
  3. 在另一個分頁中,再次前往 hello-app-service 外部 IP。您現在應該會看到 Version 設為 2.0.0.

控制台

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下 hello-app

  3. 在「部署詳細資料」頁面中,依序點選 「動作」> 滾動式更新

  4. 在「Rolling update」(滾動更新) 對話方塊中,將「Image of hello-app」(hello-app 的映像檔) 欄位設為 REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2

  5. 按一下「更新」

  6. 在「部署詳細資料」頁面中,檢查「有效修訂版本」部分。現在應該會看到兩個修訂版本,分別是 1 和 2。修訂版本 1 對應於您先前建立的初始部署作業。修訂版本 2 是您剛開始的持續更新。

  7. 稍待片刻後,請重新整理頁面。在「Managed pods」(代管的 pod) 下方,hello-app 的所有副本現在都對應至修訂版本 2。

  8. 在另一個分頁中,再次前往您複製的服務 IP 位址。 Version 應為 2.0.0.

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  1. 刪除服務:這麼做會取消分配為您的服務所建立的 Cloud 負載平衡器:

    kubectl delete service hello-app-service
    
  2. 刪除叢集:這項操作會刪除組成叢集的資源,例如運算執行個體、磁碟和網路資源:

    gcloud container clusters delete hello-cluster --region REGION
    
  3. 刪除容器映像檔:這麼做會刪除您推送至 Artifact Registry 的 Docker 映像檔。

    gcloud artifacts docker images delete \
        REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 \
        --delete-tags --quiet
    gcloud artifacts docker images delete \
        REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 \
        --delete-tags --quiet
    

後續步驟

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶,親自體驗實際使用 GKE 的成效。新客戶可以獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。

免費試用 GKE