Create a Kubernetes cluster

检查我的进度

/ 20

Configure and Install Jenkins

检查我的进度

/ 20

Create the production and canary deployments

检查我的进度

/ 30

Build for the 'new-feature' branch

检查我的进度

/ 10

Deploying a canary release

检查我的进度

/ 10

Deploying to production

检查我的进度

/ 10

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

任务 2. 预配 Jenkins

创建 Kubernetes 集群,并允许 Jenkins 访问 Google Cloud 服务和 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"

此步骤可能需要几分钟才能完成。额外的作用域可让 Jenkins 访问 Google Cloud 服务和 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"

此步骤最多可能需要几分钟时间才能完成。这些额外范围让 Jenkins 能够访问 Google Cloud 服务和 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 界面的端口转发:
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 服务:
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 主节点发起请求时,构建器节点会根据需要自动启动。构建任务完成后,构建器节点将自动关闭,其占用的资源会归还至集群资源池。

请注意,此服务会对任何与 selector 匹配的 Pod 公开端口 8080 和 50000。这会在 Kubernetes 集群中公开 Jenkins 网页界面和构建器/代理注册端口。此外,jenkins-ui 服务是使用 ClusterIP 公开的,因此不支持从集群外部访问。

任务 5. 连接到 Jenkins

检索管理员密码并登录 Jenkins 界面。

  1. Jenkins 图表会自动为您创建管理员密码。如需检索密码,请运行以下命令:
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
  1. 如需进入 Jenkins 界面,请在 Cloud Shell 操作栏中依次点击网页预览 (“网页预览”图标) 在端口 8080 上预览:

  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. 部署应用

将应用部署到两个不同的环境:

  • 生产环境:用户访问的实际网站。
  • Canary 环境:容量较小的网站,仅接收一定比例的用户流量。在向所有用户发布软件之前,您可以在此环境中通过实时流量验证软件。
  1. 在 Google Cloud Shell 中,前往示例应用目录:
cd sample-app
  1. 创建 Kubernetes 命名空间,从逻辑上隔离部署:
kubectl create ns production
  1. 使用 kubectl apply 命令创建生产部署、Canary 部署以及服务:
kubectl apply -f k8s/production -n production kubectl apply -f k8s/canary -n production kubectl apply -f k8s/services -n production

点击 Check my progress(检查我的进度),验证您已完成的任务。成功创建部署后,系统会显示评估分数。

创建生产部署和 Canary 部署

默认情况下,系统只会部署一个前端副本。使用 kubectl scale 命令确保始终至少有 4 个副本在运行。

  1. 运行以下命令,对生产环境前端进行扩容:
kubectl scale deployment gceme-frontend-production -n production --replicas 4
  1. 现在,确认前端有 5 个 Pod 正在运行,其中 4 个用于生产流量,1 个用于 Canary 版本(对 Canary 版本的更改只会影响五分之一 [20%] 的用户):
kubectl get pods -n production -l app=gceme -l role=frontend
  1. 另外,确认后端有 2 个 Pod,其中 1 个用于生产环境,1 个用于 Canary 环境:
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 流水线

在此任务中,您将在专用 Git 服务器上设置 Git 代码库并创建 Jenkins 流水线:

  • 将示例应用源代码推送到 Git 服务器
  • 向 Jenkins 添加您的服务账号凭据
  • 为 Kubernetes 配置 Jenkins Cloud
  • 创建 Jenkins 多分支流水线作业

将示例应用源代码推送到 Git 服务器

  1. 在 Cloud Shell 中,检索 Git 服务器的外部 IP 地址:
export GIT_SERVER_IP=$(gcloud compute instances describe git-server --zone={{{project_0.default_zone}}} --format='get(networkInterfaces[0].accessConfigs[0].natIP)') echo "Git Server IP: ${GIT_SERVER_IP}"
  1. 将 sample-app 目录初始化为 Git 代码库:
cd ~/continuous-deployment-on-kubernetes/sample-app git init git config --global user.email "student@qwiklabs.net" git config --global user.name "Student" git branch -m master
  1. 添加指向自托管 Git 服务器的远程代码库:
git remote add origin http://giteaadmin:GiteaPassword123@${GIT_SERVER_IP}:3000/giteaadmin/sample-app.git
  1. 添加、提交并将文件推送到 master 分支:
git add . git commit -m "Initial commit" git push -u origin master

添加服务账号凭据

配置您的凭据以允许 Jenkins 访问集群并部署资源。

  1. 在 Jenkins 界面左侧面板中,依次点击 Manage Jenkins 和 Credentials(位于 Security 下)。

  2. 在 Stores scoped to Jenkins 下,点击 System。

Credentials 页面

  1. 点击 Global credentials (unrestricted)。

  2. 点击 Add Credentials。

  3. 对于 Kind,选择 Google Service Account from metadata,然后点击 Next。

  4. 在 ID 字段下输入您的项目 ID(),然后点击 Create。

注意:项目 ID 可以在实验的连接详情面板中找到。

全局凭据已添加。

Global credentials (unrestricted) 页面

为 Kubernetes 配置 Jenkins Cloud

  1. 在 Jenkins 界面中,依次选择 Manage Jenkins > Clouds(或 System > Clouds)。
  2. 点击 New cloud。
  3. 在 Cloud name 下输入 kubernetes,在 Type 中选择 Kubernetes,然后点击 Create。
  4. 在 Jenkins URL 字段中,输入以下值:http://cd-jenkins:8080。
  5. 在 Jenkins tunnel 字段中,输入以下值:cd-jenkins-agent:50000。
  6. 点击 Save。

创建 Jenkins 作业

前往 Jenkins 界面,并按照以下步骤配置多分支流水线作业:

  1. 在左侧面板中,点击 Jenkins > New Item。

  2. 输入项目名称 sample-app,选择 Multibranch Pipeline 选项,然后点击 OK。

  3. 在下一页的 Branch Sources 部分中,从 Add source 下拉列表中选择 Git。

  4. 在 Project Repository 字段中,输入代码库的克隆网址:

http://{{{project_0.startup_script.git_server_ip}}}:3000/giteaadmin/sample-app.git 注意:如果变量未填入,您可以输入 http://[GIT_SERVER_IP]:3000/giteaadmin/sample-app.git,将 [GIT_SERVER_IP] 替换为您的 Git 服务器 IP。
  1. 在 Credentials 下,将其保留为 - none -。

  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. 将您的 PROJECT_ID 添加到 REPLACE_WITH_YOUR_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 代理。此代理使用 Kubernetes API 对自身进行身份验证,并将来自本地机器的请求代理到集群中的服务,而不会将您的服务公开给互联网。

如果您在 Build Executor(构建执行器)中没有看到任何内容,请不必担心。只需前往 Jenkins 首页,找到示例应用,就能验证是否已创建 new-feature 流水线。

  1. 完成所有操作后,在后台启动代理:
kubectl proxy &
  1. 如果停滞,请按 CTRL+C 退出。通过向 localhost 发送请求并让 kubectl 代理将其转发到您的服务,验证应用是否可以访问:
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

您成功设置了开发环境!接下来,根据您在上一单元中学习的内容,部署 Canary 版本以测试新功能。

点击 Check my progress(检查我的进度),验证您已完成的任务。成功启动 new-feature 分支的构建后,系统会显示评估分数。

new-feature 分支的构建

任务 11. 部署 Canary 版本

您已验证应用在开发环境中运行的是最新代码,现在可以将代码部署到 Canary 环境中了。

  1. 创建 Canary 分支并将其推送到 Git 服务器:
git checkout -b canary git push origin canary
  1. 在 Jenkins 中,您应该会看到 Canary 流水线已启动。启动完成后,您可以检查服务网址,确保新版本正在处理部分流量。您应该会看到大约每 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 结束命令。

大功告成!您成功部署了 Canary 版本。接下来,将新版本部署到生产环境。

点击 Check my progress(检查我的进度),验证您已完成的任务。成功部署 Canary 版本后,系统会显示评估分数。

部署 Canary 版本

任务 12. 部署到生产环境

现在,我们已成功部署 Canary 版本,而且也没有收到任何客户投诉,接下来将该版本部署到生产舰队的其他部分。

  1. 创建 Canary 分支并将其推送到 Git 服务器:
git checkout master git merge canary git push origin master

在 Jenkins 中,您应该会看到主流水线已启动。

点击 Check my progress(检查我的进度),验证您已完成的任务。成功启动主流水线后,系统会显示评估分数。

部署到生产环境
  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 年 5 月 20 日

上次测试实验的时间:2026 年 2 月 26 日

版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

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

使用无痕浏览模式

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

登录控制台

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

此内容目前不可用

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

太好了!

一旦可用,我们会通过邮件联系您

一次一个实验

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

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

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