实验设置说明和要求
保护您的账号和进度。请务必在无痕浏览器窗口中,使用实验凭证运行此实验。

在 Kubernetes Engine 使用 Jenkins 持續推送軟體更新

实验 1 小时 5 分钟 universal_currency_alt 5 积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
此内容尚未针对移动设备进行优化。
为获得最佳体验,请在桌面设备上访问通过电子邮件发送的链接。

GSP051

Google Cloud 自學實驗室

總覽

本實驗室將說明如何在 Kubernetes Engine 中,使用 Jenkins 設定持續推送軟體更新管道。開發人員若經常需要將程式碼整合至共用存放區,通常會選用 Jenkins 這款自動化伺服器。您在本實驗室建構的解決方案,架構會與下圖類似:

Jenkins 和 Kubernetes 架構

請前往 Cloud Architecture Center,查看 Jenkins 在 Kubernetes Engine 的運作方式,進一步瞭解如何在 Kubernetes 執行 Jenkins。

課程內容

您會在本實驗室中完成下列工作,瞭解如何在 Kubernetes 執行 Jenkins:

  • 將 Jenkins 應用程式佈建至 Kubernetes Engine 叢集
  • 使用 Helm 套件管理工具設定 Jenkins 應用程式
  • 認識 Jenkins 應用程式的功能
  • 建立並實際操作 Jenkins 管道

事前準備

本實驗室屬於進階難度,開始前建議至少須熟悉殼層程式設計、Kubernetes 和 Jenkins 的基本概念。下列幾個實驗室可協助您快速掌握相關知識:

掌握先備知識後,請向下捲動,進一步瞭解 Kubernetes、Jenkins 和持續推送軟體更新。

什麼是 Kubernetes Engine?

Kubernetes Engine 是 Google Cloud 的託管版 Kubernetes,這套叢集管理與自動化調度管理系統專為容器設計,功能非常強大。Kubernetes 是一個開放原始碼專案,能在多種不同的環境中運作,包括筆記型電腦、高可用性的多節點叢集、虛擬機器和裸機等。如先前所述,Kubernetes 應用程式是以容器為建構基礎,這是一種輕量型應用程式,內含運作所需的所有依附元件和程式庫。這種基礎架構可確保 Kubernetes 應用程式的高可用性和安全性,部署也十分快速,是雲端開發人員理想的框架選擇。

什麼是 Jenkins?

Jenkins 是一款開放原始碼的自動化伺服器,可靈活地自動調度並管理建構、測試和部署管道。開發人員能運用 Jenkins 快速疊代專案,不必擔心持續推送軟體更新可能造成的負擔。

什麼是持續推送軟體更新/持續部署?

當您需要設定持續推送軟體更新 (CD) 管道時,可選擇將 Jenkins 部署至 Kubernetes Engine,這種做法比標準 VM 部署方式的好處更多。

如果建構程序使用容器,同一個虛擬主機便可橫跨多個作業系統執行工作。Kubernetes Engine 會提供暫時性的建構執行器,只有在建構期間才會使用,這樣資源就能留給批次處理等其他叢集工作。此外,這類執行器還有另一項優點,就是「速度快」,能在幾秒內完成啟動。

Kubernetes Engine 還預先搭載 Google 的全域負載平衡器,可自動將網站流量轉送至執行個體。該負載平衡器會處理 SSL 終止作業,並使用以 Google 骨幹網路設定的全球 IP 位址。如果搭配網站前端,使用者就能透過最快的路徑連至應用程式執行個體。

對於 Kubernetes、Jenkins 及兩者在 CD 管道的互動方式,您已有初步的瞭解,是時候開始建構了!

設定和需求

瞭解以下事項後,再點選「Start Lab」按鈕

請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。

您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。

為了順利完成這個實驗室,請先確認:

  • 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
  • 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。

如何開始研究室及登入 Google Cloud 控制台

  1. 點選「Start Lab」按鈕。如果實驗室會產生費用,畫面上會出現選擇付款方式的對話方塊。左側的「Lab Details」窗格會顯示下列項目:

    • 「Open Google Cloud console」按鈕
    • 剩餘時間
    • 必須在這個研究室中使用的臨時憑證
    • 完成這個實驗室所需的其他資訊 (如有)
  2. 點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」

    接著,實驗室會啟動相關資源,並開啟另一個分頁,顯示「登入」頁面。

    提示:您可以在不同的視窗中並排開啟分頁。

    注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」
  3. 如有必要,請將下方的 Username 貼到「登入」對話方塊。

    {{{user_0.username | "Username"}}}

    您也可以在「Lab Details」窗格找到 Username。

  4. 點選「下一步」

  5. 複製下方的 Password,並貼到「歡迎使用」對話方塊。

    {{{user_0.password | "Password"}}}

    您也可以在「Lab Details」窗格找到 Password。

  6. 點選「下一步」

    重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
  7. 按過後續的所有頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Google Cloud 控制台稍後會在這個分頁開啟。

注意:如要使用 Google Cloud 產品和服務,請點選「導覽選單」,或在「搜尋」欄位輸入服務或產品名稱。「導覽選單」圖示和搜尋欄位

啟動 Cloud Shell

Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。

  1. 點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示 「啟動 Cloud Shell」圖示

  2. 系統顯示視窗時,請按照下列步驟操作:

    • 繼續操作 Cloud Shell 視窗。
    • 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。

連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID。輸出內容中有一行文字,宣告本工作階段的 Project_ID

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。

  1. (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
  1. 點按「授權」

輸出內容:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project

輸出內容:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南

工作 1:下載原始碼

在這項工作中,您將下載本實驗室要用的原始碼。

  1. 請先在 Cloud Shell 開啟新的工作階段,然後執行下列指令來設定可用區
gcloud config set compute/zone {{{project_0.default_zone}}}
  1. 複製實驗室的程式碼範例:
gsutil cp gs://spls/gsp051/continuous-deployment-on-kubernetes.zip . unzip continuous-deployment-on-kubernetes.zip
  1. 切換至正確的目錄:
cd continuous-deployment-on-kubernetes

工作 2:佈建 Jenkins

建立 Kubernetes 叢集並啟用 Jenkins 來存取 GitHub 存放區及 Google Artifact Registry。

建立 Kubernetes 叢集

  1. 執行下列指令,佈建 Kubernetes 叢集:
gcloud container clusters create jenkins-cd \ --num-nodes 2 \ --machine-type e2-standard-2 \ --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform"

系統最多可能需要 5 分鐘才能完成佈建。指定額外範圍的目的是允許 Jenkins 存取 GitHub 存放區及 Google Artifact Registry。

點選「Check my progress」,確認工作已完成。如果已成功建立 Kubernetes 叢集,您將會看見評估分數。

建立 Kubernetes 叢集 (可用區:)
  1. 先執行下列指令,確認叢集正常運作,再繼續操作:
gcloud container clusters list

取得叢集憑證

  1. 取得叢集的憑證:
gcloud container clusters get-credentials jenkins-cd
  1. Kubernetes Engine 會使用這些憑證來存取新佈建的叢集。請執行下列指令,確認可連至該叢集:
kubectl cluster-info

工作 3:設定 Helm

Helm 是套件管理工具,能協助您輕鬆設定及部署 Kubernetes 應用程式。安裝 Jenkins 後,便可設定 CI/CD 管道。

在這項工作中,您會使用 Helm 從資訊套件存放區安裝 Jenkins。

  1. 新增 Helm 的穩定版資訊套件存放區:
helm repo add jenkins https://charts.jenkins.io
  1. 確保該存放區為最新版本:
helm repo update

工作 4:安裝及設定 Jenkins

安裝 Jenkins 時,可使用 values 做為範本,提供設定所需的值。

您將透過 values 檔案自動設定 Kubernetes Cloud,並新增下列必要的外掛程式:

  • Kubernetes:latest
  • Workflow-multibranch:latest
  • Git:latest
  • Configuration-as-code:latest
  • Google-oauth-plugin:latest
  • Google-source-plugin:latest
  • Google-storage-plugin:latest

這樣 Jenkins 就能連線至您的叢集和 Google Cloud 專案。

  1. 使用 Helm CLI 根據配置設定部署資訊套件:
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait

這個指令會在幾分鐘內執行完畢。

點選「Check my progress」,確認工作已完成。如果已成功設定 Jenkins 資訊套件,您將會看見評估分數。

安裝及設定 Jenkins
  1. 指令執行完畢後,請確認 Jenkins Pod 進入 Running 狀態,且容器處於 READY 狀態:
kubectl get pods

輸出內容範例:

NAME READY STATUS RESTARTS AGE cd-jenkins-7c786475dd-vbhg4 2/2 Running 0 1m
  1. 設定 Jenkins 服務帳戶,讓該帳戶能部署內容至叢集:
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins

輸出內容應如下所示:

clusterrolebinding.rbac.authorization.k8s.io/jenkins-deploy created
  1. 在 Cloud Shell 中執行下列指令,設定通訊埠轉送功能,以利存取 Jenkins UI:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
  1. 檢查是否已正確建立 Jenkins Service。
kubectl get svc

輸出內容範例:

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE cd-jenkins 10.35.249.67 8080/TCP 3h cd-jenkins-agent 10.35.248.1 50000/TCP 3h kubernetes 10.35.240.1 443/TCP 9h

本實驗室中您使用了 Kubernetes 外掛程式,因此系統在 Jenkins Master 要求建構工具節點時,可視需要自動啟動對應的節點。完成工作後,這些節點就會自動關閉,資源也會加回叢集的資源集區。

請注意,這項服務會對所有與選取條件相符的 Pod,公開通訊埠 808050000,意即在 Kubernetes 叢集內公開 Jenkins 網頁 UI 和建構工具/代理程式註冊通訊埠。此外,jenkins-ui 服務會透過 ClusterIP 公開,不開放從叢集外部存取。

工作 5:連線到 Jenkins

擷取管理員密碼並登入 Jenkins 介面。

  1. Jenkins 資訊套件會自動為您建立管理員密碼,請執行下列指令來擷取該密碼:
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
  1. 在 Cloud Shell 動作列,依序點選「網頁預覽」圖示 「網頁預覽」圖示 和「透過以下通訊埠預覽:8080」,進入 Jenkins 使用者介面:

  2. 如果出現提示訊息,請以 admin 這個使用者名稱和自動產生的密碼登入。

現在您已在 Kubernetes 叢集中成功設定 Jenkins!在接下來的幾項工作中,Jenkins 將推動整個自動化 CI/CD 管道的運作。

工作 6:瞭解應用程式

在這項工作中,您會在持續部署管道部署範例應用程式 gceme。這個應用程式是以 Go 語言編寫,位於存放區的 sample-app 目錄。您在 Compute Engine 執行個體上執行 gceme 二進位檔時,應用程式會在資訊卡中顯示執行個體的中繼資料。

這款應用程式類似微服務,支援兩種作業模式。

  • 後端模式下,gceme 會監聽通訊埠 8080,然後傳回 JSON 格式的 Compute Engine 執行個體中繼資料。
  • 前端模式下,gceme 會查詢後端 gceme 服務,然後在使用者介面中顯示所產生的 JSON。

gceme 架構圖

工作 7:部署應用程式

我們會將應用程式部署至下列兩種不同環境:

  • 正式環境:正式上線、供使用者存取的網站。
  • 初期測試環境:負載能力較低的網站,只會接收部分使用者流量。您會先在這個環境中以實際流量驗證軟體,確認沒有問題後,再向所有使用者發布。
  1. 在 Google Cloud Shell,前往範例應用程式目錄:
cd sample-app
  1. 建立 Kubernetes 命名空間,在邏輯層面上隔離這項 Deployment:
kubectl create ns production
  1. 使用 kubectl apply 指令,建立正式環境和初期測試環境的部署項目及相關服務:
kubectl apply -f k8s/production -n production kubectl apply -f k8s/canary -n production kubectl apply -f k8s/services -n production

點選「Check my progress」,確認工作已完成。如果已成功建立部署項目,您將會看見評估分數。

建立正式環境和初期測試環境的部署項目

根據預設,系統只會部署一個前端副本。請使用 kubectl scale 指令,確保隨時都至少有 4 個副本正常運作。

  1. 執行下列指令,擴充正式環境前端:
kubectl scale deployment gceme-frontend-production -n production --replicas 4
  1. 確認前端有 5 個 Pod 正在運作,其中 4 個處理正式環境流量,1 個處理初期測試版 (初期測試版的變更只會影響五分之一 (20%) 的使用者):
kubectl get pods -n production -l app=gceme -l role=frontend
  1. 同時也確認後端有 2 個 Pod,1 個用於正式環境,另 1 個用於初期測試環境。
kubectl get pods -n production -l app=gceme -l role=backend
  1. 擷取正式環境服務的外部 IP:
kubectl get service gceme-frontend -n production 注意:您可能要稍候幾分鐘後,才會看到負載平衡器外部 IP 位址。

輸出內容範例:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gceme-frontend LoadBalancer 10.79.241.131 104.196.110.46 80/TCP 5h

外部 IP 貼至瀏覽器中,即可看到畫面上顯示資訊卡。您看到的頁面應與下圖類似:

「Backend that serviced this request」頁面

  1. 將前端服務負載平衡器 IP 儲存至環境變數中,稍後會用到:
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
  1. 在瀏覽器中開啟前端外部 IP 位址,確認兩項服務都正常運作。

  2. 執行下列指令,檢查服務的版本輸出結果 (應顯示為「1.0.0」):

curl http://$FRONTEND_SERVICE_IP/version

您已成功部署範例應用程式!接下來要設定管道,以穩定持續部署變更。

工作 8:建立 Jenkins 管道

在這項工作中,您將按照下列步驟建立 Jenkins 管道:

  • 建立存放區來託管原始碼
  • 新增憑證,讓 Jenkins 能存取程式碼存放區
  • 為 Kubernetes 設定 Jenkins 雲端環境
  • 完成驗證,允許 Jenkins 存取 GitHub 私人存放區
  • 建立 Jenkins 工作

建立存放區來託管範例應用程式原始碼

  1. 建立 gceme 範例應用程式的副本,並推送至 GitHub 存放區

在 Cloud Shell 執行下列指令,設定 Git 和 GitHub:

curl -sS https://webi.sh/gh | sh gh auth login gh api user -q ".login" GITHUB_USERNAME=$(gh api user -q ".login") git config --global user.name "${GITHUB_USERNAME}" git config --global user.email "${USER_EMAIL}" echo ${GITHUB_USERNAME} echo ${USER_EMAIL}
  • 按下 Enter 鍵接受預設選項。
  • 閱讀指令輸出內的操作說明,透過網路瀏覽器登入 GitHub。

成功登入後,您的 GitHub 使用者名稱會出現在 Cloud Shell 輸出內容中。

gh repo create default --private

系統不會向您收取這個存放區的費用,因此可以忽略警告。

git init
  1. 將 sample-app 目錄初始化為獨立的 Git 存放區:
git config credential.helper gcloud.sh
  1. 執行下列指令:
git remote add origin https://github.com/${GITHUB_USERNAME}/default
  1. 新增、修訂及推送檔案:
git add . git commit -m "Initial commit" git push origin master

新增服務帳戶憑證

設定憑證來允許 Jenkins 存取程式碼存放區。Jenkins 會使用叢集的服務帳戶憑證,從 GitHub 存放區下載程式碼。

  1. 在 Jenkins 使用者介面中,點按右側角落的「Manage Jenkins」(設定圖示),然後依序點按「Security」>「Credentials」

  2. 點按「System」

憑證頁面

  1. 點按「Global」

  2. 點按「Add Credentials」

  3. 選取「Google Service Account from metadata」,然後點按「Next」

  4. 在「ID」欄位輸入專案 ID,然後點按「Create」

備註:「專案 ID」可在實驗室的「CONNECTION DETAILS」段落找到。

全域憑證已加入。

「Global credentials (unrestricted)」頁面

為 Kubernetes 設定 Jenkins 雲端環境

  1. 在 Jenkins 使用者介面中,依序選取「Manage Jenkins」>「System Configuration」
  2. 點按「Clouds」
  3. 點按「New cloud」
  4. 在「Cloud name」底下輸入名稱 (可自由命名),然後「Type」請選取「Kubernetes」
  5. 點按「Create」
  6. 在「Jenkins URL」欄位輸入下列值:http://cd-jenkins:8080
  7. 在「Jenkins tunnel」欄位輸入下列值:cd-jenkins-agent:50000
  8. 點按「Save」

使用安全殼層金鑰完成驗證,允許 Jenkins 存取 GitHub 私人存放區

按照下方步驟操作,使用安全殼層金鑰完成驗證,允許 Jenkins 存取 GitHub 私人存放區:

a. 產生安全殼層金鑰

  1. 建立新的 GitHub 安全殼層金鑰,其中 github-email 是您的 GitHub 電子郵件地址:
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C [your-github-email]
  1. 在 Cloud Shell 動作列,依序點按「更多」圖示 「更多」圖示 >「Download」,然後選取「continuous-deployment-on-kubernetes/sample-app」資料夾,從本機電腦下載私密金鑰 (id_github) 和公開金鑰 (id_github.pub)。

b. 將公開金鑰新增至 GitHub

產生安全殼層金鑰後,您必須將公開金鑰新增至 GitHub,Jenkins 才能存取存放區。

  1. 登入 GitHub 帳戶。點按 GitHub 個人資料,然後前往「Settings」

  2. 選取側邊選單中的「SSH and GPG keys」

  3. 點按「New SSH key」

  4. 標題輸入「SSH_KEY_LAB」

  5. 找到從 ~/continuous-deployment-on-kubernetes/sample-app/id_github.pub 這個路徑下載的公開金鑰 (id_github.pub),然後將金鑰內容貼至「Key」欄位。您也可以在「Title」欄位加入描述性名稱。

  6. 點按「Add SSH key」

c. 將 Jenkins 設為使用安全殼層金鑰

  1. 前往 Jenkins,然後選取資訊主頁中的「Manage Jenkins」

  2. 在「Security」底下選取「Credentials」選項。

  3. 點按「Stores scoped to Jenkins」底下的「System」

  4. 點按「Global」

  5. 點按「Add Credentials」

  6. 選取「SSH Username with private key」,然後點按「Next」

  7. 「ID」請輸入 _ssh_key。

  8. 「Username」請輸入 [您的 GitHub 使用者名稱]

  9. 選擇「Enter directly」做為私密金鑰的提供方式,然後點按「Add」,貼上 id_github 檔案 (從 ~/continuous-deployment-on-kubernetes/sample-app/id_github 下載) 的內容。

  10. 點按「Create」

d. 將公開安全殼層金鑰新增至已知主機

在 Cloud Shell 建立檔案並命名為 known_hosts.github,並將公開安全殼層金鑰加入這個檔案。

ssh-keyscan -t rsa github.com > known_hosts.github chmod +x known_hosts.github cat known_hosts.github 注意:如果 Cloud Shell 顯示錯誤,請按下 CTRL+C,然後執行上方的指令。

e. 設定已知的主機金鑰

  1. 前往 Jenkins,然後點按「Manage Jenkins」

  2. 在「Security」 底下,點按「Security」

  3. 在「Git Host Key Verification Configuration」底下,從「Host Key Verification Strategy」下拉式選單中選取「Manually provided keys」

  4. 點按「Open Editor」,將 known hosts.github 檔案的內容貼到「Approved Host Keys」欄位。

  5. 點按「Save」

建立 Jenkins 工作

前往 Jenkins 使用者介面,按照下列步驟設定 Pipeline 工作。

  1. 在左側面板依序點按「Jenkins」>「New Item」

  2. 輸入項目名稱「sample-app」,選擇「Multibranch Pipeline」選項,然後點按「OK」

  3. 在下一頁的「Branch Sources」部分,從「Add Source」下拉式選單中選取「Git」

  4. 在「Project Repository」欄位,貼上 sample-app 存放區的 HTTPS 本機副本網址。將 ${GITHUB_USERNAME} 改成您的 GitHub 使用者名稱

git@github.com:${GITHUB_USERNAME}/default.git
  1. 在「Credentials」選單的選項中,選取 GitHub 憑證名稱。

  2. 在「Scan Multibranch Pipeline Triggers」部分底下,勾選「Periodically if not otherwise run」方塊,然後將「Interval」的值設為「1 minute」

  3. 其餘選項的值都不更動,然後點按「Save」

完成上述步驟後,系統就會執行 Branch indexing 工作。這個中繼工作會找出存放區中的分支版本,並確保現有分支版本沒有任何變動。如果點按左上方的 sample-app,應該會看到 Master 工作。

注意:第一次執行 Master 工作時可能會失敗,等到後續步驟我們對程式碼做一些調整後,才會成功。

您已成功建立 Jenkins 管道!接下來要建立開發環境,以進行持續整合。

工作 9:建立開發環境

開發分支版本是一組環境,開發人員會先在這裡測試程式碼變更,再提交出去並整合至正式網站。這些環境是應用程式的簡化版,但部署時仍須採用和正式環境一樣的機制。

建立開發分支版本

如要從功能分支版本建立開發環境,可將該分支版本推送至 Git 伺服器,讓 Jenkins 部署環境。

注意:如果在 Cloud Shell 看到錯誤,請按下 CTRL+C,然後執行下方的指令。
  • 建立開發分支版本,並推送至 Git 伺服器:
git checkout -b new-feature

修改管道定義

定義該管道的 Jenkinsfile 是以 Jenkins Pipeline Groovy 語法編寫而成。使用 Jenkinsfile 可將整個建構管道編寫到同一個檔案中,而且該檔案會和原始碼放在一起。管道支援平行處理等強大功能,並要求使用者手動核准。

為確保管道正常運作,請修改 Jenkinsfile 並設定專案 ID。

  1. vi 之類的終端機編輯器開啟 Jenkinsfile:
vi Jenkinsfile
  1. 啟動編輯器:
i
  1. REPLACE_WITH_YOUR_PROJECT_ID 這個值改成您的 PROJECT_ID (PROJECT_ID 就是專案 ID,可在實驗室的 CONNECTION DETAILS 部分找到)。您也能執行 gcloud config get-value project 來查詢該 ID。

  2. CLUSTER_ZONE 的值變更為 。您可以執行 gcloud config get compute/zone 來查詢這個值。

PROJECT = "REPLACE_WITH_YOUR_PROJECT_ID" APP_NAME = "gceme" FE_SVC_NAME = "${APP_NAME}-frontend" CLUSTER = "jenkins-cd" CLUSTER_ZONE = "{{{project_0.default_zone}}}" IMAGE_TAG = "gcr.io/${PROJECT}/${APP_NAME}:${env.BRANCH_NAME}.${env.BUILD_NUMBER}" JENKINS_CRED = "${PROJECT}"
  1. 儲存 Jenkinsfile 檔案,按下 ESC 鍵,然後輸入下列內容 (適用於 vi 終端機編輯器):
:wq

修改網站

現在您要將 gceme 資訊卡從藍色變更為橘色,實際體驗應用程式的變化過程。

  1. 開啟 html.go
vi html.go
  1. 啟動編輯器:
i
  1. 將檔案中的兩個 <div class="card blue"> 改成:
<div class="card orange">
  1. 儲存 html.go 檔案,按下 ESC 鍵,然後輸入下列內容:
:wq
  1. 開啟 main.go
vi main.go
  1. 啟動編輯器:
i
  1. 版本定義在這一行:
const version string = "1.0.0"

將該行更新為下列內容:

const version string = "2.0.0"
  1. 再儲存 main.go 檔案一次,按下 ESC 鍵,然後輸入下列內容:
:wq

工作 10:開始部署

在這項工作中,您將練習部署開發環境。

  1. 修訂並推送變更:
git add Jenkinsfile html.go main.go git commit -m "Version 2.0.0" git push origin new-feature

執行上述指令將開始建構開發環境。

將變更推送至 Git 存放區之後,請前往 Jenkins 使用者介面,您會看到 new-feature 分支版本的建構作業已啟動,而變更會在一分鐘內接收到。

  1. 建構作業開始執行後,請在左側導覽區點選該建構作業旁的向下箭頭,然後選取「Console output」

導覽窗格

  1. 觀察建構作業的輸出內容幾分鐘,留意畫面上是否開始顯示 kubectl --namespace=new-feature apply... 這段訊息,出現即代表系統正在將 new-feature 分支版本部署至叢集。
注意:我們在開發階段不會使用對外公開的負載平衡器。為提高應用程式的安全性,您可以使用 kubectl proxy。這個 Proxy 會向 Kubernetes API 驗證自己的身分,並將源自本機電腦的要求透過 Proxy 傳送到叢集中的服務,但不會向網際網路公開服務。

如果 Build Executor 中未顯示任何內容,別擔心。只要前往 Jenkins 首頁 >「sample app」,就能確認 new-feature 管道是否已建立。

  1. 一切就緒後,請在背景啟動 Proxy:
kubectl proxy &
  1. 如果出現停滯不動的情況,請按下 CTRL+C 結束指令,然後傳送要求至 localhost,讓 kubectl Proxy 將要求轉送至服務,以確認應用程式可正常存取:
curl \ http://localhost:8001/api/v1/namespaces/new-feature/services/gceme-frontend:80/proxy/version

您應該會收到「2.0.0」這段回應,也就是正在執行的版本。

如果收到類似下方的錯誤訊息:

{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "no endpoints available for service \"gceme-frontend:80\"", "reason": "ServiceUnavailable", "code": 503
  1. 這表示前端端點尚未完成傳播,請稍候片刻,然後再試著執行 curl 指令。看到下列輸出內容時,即可繼續操作:
2.0.0

到此開發環境已設定成功!接下來,您將延伸運用先前單元所學的知識,部署初期測試版來測試新功能。

點選「Check my progress」,確認工作已完成。如果已成功啟動 new-feature 分支版本的建構作業,您將看見評估分數。

建構 new-feature 分支版本

工作 11:部署初期測試版

您已驗證應用程式在開發環境中執行的是最新程式碼,接下來要將該程式碼部署至初期測試環境。

  1. 建立初期測試分支版本,並推送至 Git 伺服器:
git checkout -b canary git push origin canary
  1. 在 Jenkins 中,您應該會看到初期測試管道已啟動。待作業完成後,就能檢查服務網址,確認新版本已開始處理部分流量。大約每 5 個要求中,就會有 1 個 (順序不固定) 傳回版本 2.0.0
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend) while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
  1. 如果持續看到 1.0.0,請重新執行上方的指令。確認上方流程正常運作後,再按下 CTRL+C 結束指令。

大功告成!您已部署初期測試版,接著要將新版本部署至正式環境。

點選「Check my progress」,確認工作已完成。如果已成功部署初期測試版,您將看見評估分數。

部署初期測試版

工作 12:部署至正式環境

您已成功部署初期測試版,而且未收到任何客訴,現在準備將新版本部署至正式環境中的剩餘機群。

  1. 建立初期測試分支版本,並推送至 Git 伺服器:
git checkout master git merge canary git push origin master

在 Jenkins 中,您應該會看到 Master 管道已啟動。

點選「Check my progress」,確認工作已完成。如果已成功啟動 Master 管道,您就會看見評估分數。

部署至正式環境
  1. 作業可能需要幾分鐘的時間執行,完成後您即可檢查服務網址,確認新版本 2.0.0 已開始處理所有流量。
export FRONTEND_SERVICE_IP=$(kubectl get -o \ jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend) while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
  1. 再次提醒,如果傳回的版本仍是 1.0.0,請重新執行上方的指令。確認結果正常後,再按下 CTRL+C,停止執行這項指令。

輸出內容範例:

gcpstaging9854_student@qwiklabs-gcp-df93aba9e6ea114a:~/continuous-deployment-on-kubernetes/sample-app$ while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done 2.0.0 2.0.0 2.0.0 2.0.0 2.0.0 2.0.0 ^C

您也可以前往 gceme 應用程式顯示資訊卡的網站,應該會發現資訊卡已從藍色變成橘色。

  1. 再次執行下列指令,取得外部 IP 位址,然後將該外部 IP 貼至新分頁,查看網頁顯示的資訊卡:
kubectl get service gceme-frontend -n production

輸出內容範例:

「Backend that serviced this request」頁面

工作 13:隨堂測驗

下列選擇題可以加深您對本實驗室所述概念的理解,盡力回答即可。

大功告成!

太棒了,您已成功將應用程式部署至正式環境。

恭喜!

本實作實驗室到此結束。您已順利在 Kubernetes Engine 部署並操作 Jenkins,建構能正常運作的持續推送軟體更新/持續部署管道。您在 Kubernetes Engine 中部署重要的 DevOps 工具並加以設定,以用於正式環境,也實際操作 kubectl 指令列工具和 YAML 檔案中的部署設定。此外,您也初步瞭解如何設定 Jenkins 管道,支援開發/部署程序。有了這次的實作經驗,您應能放心在自己的 DevOps 環境中應用這些工具。

後續步驟/瞭解詳情

Google Cloud 教育訓練與認證

協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。

使用手冊上次更新日期:2026 年 2 月 26 日

實驗室上次測試日期:2026 年 2 月 26 日

Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

使用无痕模式或无痕浏览器窗口是运行此实验的最佳方式。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。