執行網站 (包括 VM 執行個體、叢集、pod 和 Service 等) 時,執行所有網站會變得相當困難。這適用於大型的多層式應用程式。不過,如果您只是想讓網站部署及顯示,那麼需要負擔相當多的費用。
Cloud Run 是 Knative 的 Google Cloud 實作項目,可讓您管理及部署網站,完全不需要 VM 或 Kubernetes 部署。從管理的角度來看,不但可簡化做法,而且在您的網站沒有提出任何要求時,還可將觸及範圍調整為零。
Cloud Run 不僅能將無伺服器開發工作導入容器,也能在 Google Kubernetes Engine (GKE) 叢集或 Cloud Run 提供的全代管平台式服務 (PaaS) 解決方案上執行。您將在本程式碼研究室中測試後者。
下圖說明部署和 Cloud Run 託管的流程。您一開始先透過 Cloud Build 建立 Docker 映像檔,並透過 Cloud Shell 觸發這個映像檔。然後,您可以使用 Cloud Shell 中的指令將映像檔部署至 Cloud Run。
必要條件
- 對 Docker 的一般熟悉程度 (請參閱 Docker 網站的「開始使用」一節)。
課程內容
- 如何使用 Cloud Build 建構 Docker 映像檔並上傳至 gcr.io
- 如何將 Docker 映像檔部署至 Cloud Run
- 如何管理 Cloud Run 部署作業
- 如何在 Cloud Run 上設定應用程式的端點
建構項目
- 在 Docker 容器中執行的靜態網站
- 這個容器的版本儲存在 Container Registry
- 靜態網站的 Cloud Run 部署作業
軟硬體需求
- 擁有管理員存取權的 Google 帳戶,用於建立專案或具備專案擁有者角色的專案
自行調整環境設定
如果您還沒有 Google 帳戶,請先建立帳戶。接著,登入 Google Cloud Console,然後按一下 [專案] > [建立專案]。
請記住專案 ID (系統會自動自動填入專案名稱)。專案 ID 是所有 Google Cloud 專案中的專屬名稱,因此螢幕截圖中的名稱已有人使用。稍後將稱為 PROJECT_ID
。
接下來,您必須在 Cloud Console 中啟用計費功能,才能使用 Google Cloud 資源並啟用 Cloud Run API。
啟用 Cloud Run API
按一下 [導覽] 選單 ☰ > [API 與服務] > [資訊主頁] > [啟用 API 和服務]。.
搜尋「Cloud Run API」,然後按一下 [Cloud Run API] (啟用)。
完成這個程式碼研究室的成本應該不會超過 $0 美元,但如果你決定要使用更多資源,或是讓資源繼續運作,可能還會產生更多費用 (請參閱最後的清除所用資源)。詳情請參閱定價。
Google Cloud 新使用者可享有 $300 美元的免費試用期。
Cloud Shell
雖然您可以將 Google Cloud 與 Cloud Run 從筆記型電腦遠端執行,但會使用在 Google Cloud 中執行的指令列環境 Cloud Shell。這個環境已預先設定您需要的所有用戶端程式庫與架構。
這款以 Debian 為基礎的虛擬機器會載入您需要的所有開發工具。這項服務提供永久性的 5GB 主目錄,可在 Google Cloud 中運作,大幅提升網路效能和驗證效能。也就是說,這個程式碼研究室只需使用瀏覽器 (是,您可以在 Chromebook 上使用)。
如要啟用 Google Cloud Shell,只要在開發人員控制台中,按一下右上角的按鈕 (只需幾分鐘即可佈建並連線至環境):
按一下 [Start Cloud Shell] 按鈕:
連線至 Cloud Shell 之後,您應該會看到您已經通過驗證,且專案已設為 PROJECT_ID
。
gcloud auth list
指令輸出
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
指令輸出
[core] project = <PROJECT_ID>
根據預設,Cloud Shell 也會設定某些環境變數,當您執行未來指令時可能會用到這個變數。
echo $GOOGLE_CLOUD_PROJECT
指令輸出
<PROJECT_ID>
如果因為某些原因而無法設定專案,只要發出下列指令即可:
gcloud config set project <PROJECT_ID>
正在尋找您的 PROJECT_ID
嗎?您可以查看在設定步驟中使用的 ID,或是在控制台資訊主頁查詢 ID:
重要事項:最後,請設定預設區域和專案設定:
gcloud config set compute/zone us-central1-f
您可以選擇多種不同的區域。詳情請參閱地區和區域說明文件。
由於您已部署現有的網站,因此只需要從存放區複製來源,即可專心建立 Docker 映像檔並部署至 Cloud Run。
執行下列指令,將存放區複製到 Cloud Shell 執行個體中,並變更為適當的目錄。您也會安裝 Node.js 依附元件,以便在部署前測試應用程式。
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
這會複製存放區,變更目錄,並安裝本機執行應用程式所需的依附元件。指令碼可能需要幾分鐘的時間才能執行。
進行盡職調查並測試您的應用程式。請執行下列指令來啟動網路伺服器:
cd ~/monolith-to-microservices/monolith npm start
輸出:
Monolith listening on port 8080!
如要預覽應用程式,請按一下 [網頁預覽] ,然後選取 [透過以下埠預覽:8080]。
系統會開啟新視窗,顯示您的 Fancy Store 實際運作情形!
您可以在瀏覽網站後關閉這個視窗。如要停止網路伺服器程序,請在終端機視窗中按下 CONTROL+C
(Macintosh 上的 Command+C
)。
現在您的來源檔案已準備就緒,現在可以開始為應用程式建立 Docker 了!
通常,您必須採取兩個步驟,包括建立 Docker 容器並推送至登錄檔,以便儲存映像檔並提取 GKE。不過,您可以使用 Cloud Build 建構 Docker 容器,並透過單一指令將映像檔放置在 Container Registry 中,讓生活變得更容易!如要查看手動建立並推送 Dockerfile 的人工程序,請參閱 Container Registry 快速入門導覽課程。
Cloud Build 會壓縮目錄中的檔案並移至 Cloud Storage 值區。接下來,建構程序會擷取值區中的所有檔案,並使用 Dockerfile。這個 Dockerfile 位於執行 Docker 建構程序的同一個目錄中。如果您將主機的 --tag
標記指定為 Docker 映像檔的 gcr.io,則產生的 Docker 映像檔將會推送至 Container Registry。
首先,請確認您已啟用 Cloud Build API。執行下列指令以啟用:
gcloud services enable cloudbuild.googleapis.com
API 啟用之後,請在 Cloud Shell 中執行下列指令,啟動建構程序:
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .
這個程序需要幾分鐘的時間,但完成之後,終端機會輸出類似以下內容:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/monolith:1.0.0 SUCCESS
如要檢視建構記錄或即時觀看處理流程,請前往 Cloud Console,然後按一下 [導覽選單] ☰ > > [Cloud Build] > [記錄]。該清單會顯示您先前的建構作業清單,但應該只會是您建立的版本。
按一下 [建構作業 ID],即可查看該建構作業的所有詳細資料,包括記錄檔輸出。按一下「圖片」旁的連結,即可查看已建立的容器映像檔。
您已經完成網站容器化並推送至 Container Registry,現在可以開始部署至 Cloud Run 了!
部署至 Cloud Run 的方法有兩種:
- Cloud Run (全代管) 是代管整個容器生命週期的 PaaS 模型。您將使用這個程式碼研究室程式碼的方法來完成這個做法。
- Cloud Run for Anthos 是 Cloud Run 的額外控管機制,可讓您從 GKE 中導入叢集和 Pod。詳情請參閱在 Google Cloud 中設定 Cloud Run for Anthos。
在 Cloud Shell 中,指令列範例會使用您先前設定的環境變數。
指令列
執行下列指令來部署您的應用程式:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed
系統會請您指定要在哪個地區放送廣告。請選取最接近的地區,並接受預設的建議服務名稱 (單體)。
為了進行測試,請針對應用程式提出未經驗證的要求。請在提示中輸入「y
」。
驗證部署作業
如要確認部署作業是否已成功建立,請執行下列指令。Pod status
可能需要幾分鐘的時間才能Running
:
gcloud run services list
選取 [[1] Cloud Run (全代管)]。
輸出:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
輸出結果會顯示幾項資訊。您可以查看部署作業、部署的使用者 (您的電子郵件地址) 和可用於存取應用程式的網址。系統似乎已成功建立!
在網路瀏覽器中開啟服務清單中的網址,即可看到與本機預覽內容相同的網站。
現在,請再次部署應用程式,但這次會調整其中一個參數。
根據預設,Cloud Run 應用程式的並行值為 80,表示每個容器執行個體一次最多可提供 80 個要求。這個函式是從函式即服務 (FaaS) 模型中大幅離開,其中一個執行個體一次只能處理一個要求。
將並行容器映像檔重新部署為 1 (並行用於測試),看看會發生什麼事。
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1
按照後續步驟的做法回答後續問題。指令成功後,請前往 Cloud Console 查看結果。
在 Cloud Run 資訊主頁中,按一下 monolith 服務即可查看詳細資料。
按一下 [修訂版本] 分頁標籤。您應該會看到兩個修訂版本。按一下 [monolith-00002] 並查看詳細資料。您應該會看到並行值減少為 1。
]
雖然這項設定足以進行測試,但在大部分的實際執行情境中,您需使用支援多個並行要求的容器。
現在,還原原始並行而不重新部署。您可以把並行值設為預設值 80 或 0,這會移除任何並行限制並設為預設最大值 (撰寫此文件時將為 80)。
在 Cloud Shell 中執行下列指令,以更新目前的修訂版本:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80
請注意,系統已建立另一個修訂版本,且該流量已重新導向,並且會回到 80。
您的行銷小組請您變更公司網站的首頁。他們認為應該對公司進行更全面的賣出。在本節中,您將在首頁中加入一些文字,讓行銷團隊更滿意!
您的其中一個開發人員已經以「index.js.new
」檔案名稱建立變更。只要將該檔案複製到 index.js
即可。按照操作說明進行適當修正。
執行下列指令,將更新後的檔案複製到正確的檔案名稱,並列印檔案內容以驗證變更:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
產生的程式碼應該會如下所示:
/* 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. */ import React from "react"; import { makeStyles } from "@material-ui/core/styles"; import Paper from "@material-ui/core/Paper"; import Typography from "@material-ui/core/Typography"; const useStyles = makeStyles(theme => ({ root: { flexGrow: 1 }, paper: { width: "800px", margin: "0 auto", padding: theme.spacing(3, 2) } })); export default function Home() { const classes = useStyles(); return ( <div className={classes.root}> <Paper className={classes.paper}> <Typography variant="h5"> Fancy Fashion & Style Online </Typography> <br /> <Typography variant="body1"> Tired of mainstream fashion ideas, popular trends and societal norms? This line of lifestyle products will help you catch up with the Fancy trend and express your personal style. Start shopping Fancy items now! </Typography> </Paper> </div> ); }
您已更新 React 元件,但必須建立 React 應用程式才能產生靜態檔案。執行下列指令以建立 React 應用程式,並將其複製到單體式公開目錄中:
cd ~/monolith-to-microservices/react-app npm run build:monolith
程式碼已更新,您必須重新建立 Docker 容器並發布至 Container Registry。您可以像以前一樣使用同樣的指令,但這次會更新版本標籤!
執行下列指令來觸發使用新的映像檔版本為 2.0.0 的新 Cloud Build:
cd ~/monolith-to-microservices/monolith #Feel free to test your application npm start gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .
在下一節中,您將使用該映像檔來更新應用程式,而且無需停機。
已完成變更,行銷小組也對您的更新感到滿意!適時更新網站,而不至於對使用者造成乾擾。
Cloud Run 會將每項部署作業視為新的修訂版本,而系統會將該版本設為線上,然後將流量重新導向至該修訂版本。
按照接下來的操作說明來更新網站。
指令列
您可以透過指令列重新部署服務,使用下列指令將映像檔更新為新版本:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed
驗證部署作業
執行下列指令來驗證部署更新:
gcloud run services describe monolith --platform managed
輸出結果如下所示:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: annotations: client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0 ...
您隨即會看到,您的服務目前使用的新版本,使用的是部署在最新版修訂版本中的映像檔。
如要驗證您的變更,請再次前往 Cloud Run 服務的外部網址,並注意到應用程式名稱已更新。
執行下列指令來列出服務,如果忘記 IP 位址,也可以檢視 IP 位址:
gcloud run services list
您的網站現在應該會顯示您新增至首頁元件的文字!
刪除 Container Registry 映像檔
# Delete the container image for version 1.0.0 of our monolith gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet # Delete the container image for version 2.0.0 of our monolith gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet
從 Cloud Storage 中刪除 Cloud Build 構件
# The following command will take all source archives from all builds and delete them from cloud storage # Run this command to print all sources: # gcloud builds list | awk 'NR > 1 {print $4}' gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done
刪除 Cloud Run 服務
gcloud run services delete monolith --platform managed
您已透過 Cloud Run 部署、擴充及更新網站。