部署容器化網路應用程式

本教學課程示範如何將網路應用程式封裝到 Docker 容器映像檔中,然後在 Google Kubernetes Engine 叢集上執行該容器映像檔,以做為可配合使用者需求進行調度的負載平衡備用資源集。

目標

如要在 GKE 上封裝並部署您的應用程式,您必須:

  1. 將您的應用程式封裝至 Docker 映像檔中
  2. 在機器本機上執行這個容器 (選用)
  3. 將這個映像檔上傳至登錄檔
  4. 建立容器叢集
  5. 將您的應用程式部署至叢集
  6. 將您的應用程式公開發佈到網際網路
  7. 擴充您的部署作業
  8. 部署新版本的應用程式

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

選項 A:使用 Google Cloud Shell

在進行本教學課程時,您可以使用 Google Cloud Shell,其中已預先安裝本教學課程所使用的 gclouddockerkubectl 指令列工具。如果使用的是 Cloud Shell,則不需要在工作站上安裝這些指令列工具。

如要使用 Google Cloud Shell:

  1. 前往 Google Cloud Platform 主控台
  2. 按一下主控台視窗頂端的 [啟用 Cloud Shell] 按鈕。

    Google Cloud Platform 主控台

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

    Cloud Shell 工作階段

選項 B:在本機使用指令列工具

如果您想在工作站上進行本教學課程,則需要安裝下列工具:

  1. 安裝 Google Cloud SDK,其中包含 gcloud 指令列工具。
  2. 使用 gcloud 指令列工具安裝 Kubernetes 指令列工具。kubectl 會用來與 GKE 叢集的叢集自動化調度管理系統「Kubernetes」進行通訊:

    gcloud components install kubectl
  3. 在您的工作站上安裝 Docker Community Edition (CE)。您將使用這個工具來建構應用程式的容器映像檔。

  4. 安裝 Git 原始碼控管工具,以便從 GitHub 中擷取範例應用程式。

步驟 1:建構容器映像檔

GKE 接受 Docker 映像檔做為應用程式部署作業的格式。如要建構 Docker 映像檔,您需要有應用程式和 Dockerfile。

就本教學課程而言,您將會部署一個名為 hello-app樣本網頁應用程式;這是使用 Go 撰寫的網路伺服器,會以「Hello, World!」訊息回應所有要求。(在通訊埠 80 上)

這個應用程式會透過其中包含映像檔建構方式操作說明的 Dockerfile 封裝成 Docker 映像檔。您將使用此 Dockerfile 封裝您的應用程式。

如要下載 hello-app 原始碼,請執行下列指令:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/hello-app

PROJECT_ID 環境變數設為您的 GCP 專案 ID。此變數會用於建立容器映像檔與專案的 Container Registry 之間的關聯性。

export PROJECT_ID=[PROJECT_ID]

如要建構這個應用程式的容器映像檔,並且將其標記以進行上傳,請執行下列指令:

docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

這個指令會指示 Docker 使用目前目錄中的 Dockerfile 建構映像檔,並以類似 gcr.io/my-project/hello-app:v1 的名稱加以標記。gcr.io 前置字串代表 Google Container Registry,映像檔會在此處託管。執行這個指令並不會上傳映像檔。

您可以執行 docker images 指令來確認建構作業是否成功:

docker images
輸出:
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
gcr.io/my-project/hello-app    v1                  25cfadb1bf28        10 seconds ago      54 MB

步驟 2:上傳容器映像檔

您必須將容器映像檔上傳至登錄檔,這樣 GKE 才能下載並執行這個映像檔。

首先,請設定 Docker 指令列工具對 Container Registry 進行驗證 (只需執行一次):

gcloud auth configure-docker

您現在可以使用 Docker 指令列工具,將映像檔上傳至 Container Registry:

docker push gcr.io/${PROJECT_ID}/hello-app:v1

步驟 3:在本機執行容器 (選用)

如要使用本機 Docker 引擎測試您的容器映像檔,請執行下列指令:

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

如果您使用的是 Cloud Shell,則可以按一下右上角的 [Web preview] (Web 預覽)按鈕,即可看到您的應用程式在瀏覽器分頁中執行。如否,請開啟新的終端機視窗 (或 Cloud Shell 分頁),然後執行確認容器是否運作並以「Hello, World!」訊息回應要求:

curl http://localhost:8080

在看到回應成功後,您可以在執行 docker run 指令的分頁中按下 Ctrl+C 來關閉容器。

步驟 4:建立容器叢集

現在,容器映像檔已經存到登錄檔中,您需要容器叢集來執行這個容器映像檔。叢集是由執行 KubernetesCompute Engine VM 執行個體集區所組成;其中,「Kubernetes」這套開放原始碼叢集自動化調度管理系統可用來為 GKE 提供支援。

建立 GKE 叢集後,請使用 Kubernetes 將應用程式部署至叢集,並管理應用程式的生命週期。

設定 gcloud 工具的 專案 IDCompute Engine 區域 選項:

gcloud config set project $PROJECT_ID
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

執行下列指令以建立名為 hello-cluster 的雙節點叢集:

gcloud container clusters create hello-cluster --num-nodes=2

可能需要幾分鐘時間才能建立叢集。該指令執行完畢後,請執行以下指令,並查看群集的兩個工作站 VM 執行個體:

gcloud compute instances list
輸出:
NAME                                          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gke-hello-cluster-default-pool-07a63240-822n  us-central1-b  n1-standard-1               10.128.0.7   35.192.16.148   RUNNING
gke-hello-cluster-default-pool-07a63240-kbtq  us-central1-b  n1-standard-1               10.128.0.4   35.193.136.140  RUNNING

步驟 5:部署您的應用程式

如要在 GKE 叢集上部署和管理應用程式,您必須與 Kubernetes 叢集管理系統進行通訊。一般來說,此操作會透過 kubectl 指令列工具進行。

Kubernetes 會以 Pod 的形式呈現應用程式,這是容器 (或緊密結合的容器群組) 的單位。Pod 是 Kubernetes 中最小的可部署單位。在本教學課程中,每個 Pod 只包含 hello-app 容器。

下方的 kubectl create deployment 指令會讓 Kubernetes 在叢集上建立名為hello-webDeployment。部署作業會管理應用程式的多個複本 (稱之為備用資源),並將這些複本安排在叢集的各個節點上執行。就這個範例而言,部署作業只會執行應用程式的一個 Pod。

執行下列指令來部署應用程式:

kubectl create deployment hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1

如要查看部署作業所建立的 Pod,請執行下列指令:

kubectl get pods
輸出:
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-px7tx   1/1       Running   0          3s

步驟 6:將應用程式公開發佈到網際網路

根據預設,您在 GKE 上執行的容器無法從網際網路存取,因為這些容器沒有外部 IP 位址。您必須執行下列指令,將應用程式明確公開至網際網路傳出的流量:

kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080

上述的 kubectl expose 指令會建立一個服務資源,為應用程式的 Pod 提供網路和 IP 支援。GKE 會為應用程式建立外部 IP 和負載平衡器 (需要計費)。

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

確認應用程式的外部 IP 位址後,請複製這個 IP 位址。將瀏覽器指向這個網址 (如 http://203.0.113.0),以檢查您的應用程式是否能存取。

步驟 7:擴充您的應用程式

您可以使用 kubectl scale 指令,將更多的備用資源新增至應用程式的部署作業。如果想另外新增兩個備用資源至部署作業 (總共為三個),請執行下列指令:

kubectl scale deployment hello-web --replicas=3

您可以執行下列指令,查看正在叢集上執行的新備用資源:

kubectl get deployment hello-web
輸出:
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-web   3         3         3            2           1m
kubectl get pods
輸出:
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-ntgdb   1/1       Running   0          9s
hello-web-4017757401-pc4j9   1/1       Running   0          9s
hello-web-4017757401-px7tx   1/1       Running   0          1m

現在,您有多個應用程式執行個體彼此獨立運作;如要調整應用程式的容量,您可以使用 kubectl scale 指令。

在上一步中佈建的負載平衡器會開始自動將流量轉送至這些新的備用資源。

步驟 8:部署新版本的應用程式

GKE 的滾動式更新機制可確保即使系統將舊容器映像檔的執行個體更換成新的容器映像檔,您的應用程式在所有運作中的備用資源之間依然保持運作且可用。

您可以透過建構相同的原始碼,並將其標記為 v2 來為應用程式的 v2 版本建立映像檔 (或者您可以在建構映像檔前將 "Hello, World!" 字串變更為 "Hello, GKE!"):

docker build -t gcr.io/${PROJECT_ID}/hello-app:v2 .

然後,將映像檔推送至 Google Container Registry:

docker push gcr.io/${PROJECT_ID}/hello-app:v2

現在,將滾動式更新套用至含有映像檔更新的現有部署作業:

kubectl set image deployment/hello-web hello-app=gcr.io/${PROJECT_ID}/hello-app:v2

再次前往位於 http://[EXTERNAL_IP] 的應用程式,並觀察您所做的變更是否已生效。

清除所用資源

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

完成本教學課程之後,請按照步驟移除下列資源,以免您的帳戶產生不必要的費用:

  1. 刪除服務:此步驟將取消分配為您的服務所建立的 Cloud 負載平衡器:

    kubectl delete service hello-web

  2. 刪除容器叢集:此步驟會一併刪除容器叢集的組成資源,例如運算執行個體、磁碟和網路資源。

    gcloud container clusters delete hello-cluster

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁
Kubernetes Engine 教學課程