任务 2. 预配 Jenkins
创建 Kubernetes 集群,并允许 Jenkins 访问 Google Cloud 服务和 Google Artifact
Registry。
创建 Kubernetes 集群
- 现在,运行以下命令以预配 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 集群
- 现在,运行以下命令来预配 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 集群(可用区:)
- 在继续操作之前,请执行以下命令,确认集群正在运行:
gcloud container clusters list
获取集群凭证
- 为集群获取凭证:
gcloud container clusters get-credentials jenkins-cd
-
Kubernetes Engine
使用这些凭证访问您新预配的集群。请运行以下命令,确认您可以连接到该集群:
kubectl cluster-info
任务 3. 设置 Helm
Helm 是一个软件包管理系统,可让您轻松配置和部署 Kubernetes 应用。安装 Jenkins
后,就可以设置 CI/CD 流水线。
在此任务中,您将使用 Helm 从图表仓库安装 Jenkins。
- 添加 Helm 的稳定版图表仓库:
helm repo add jenkins https://charts.jenkins.io
- 确保仓库是最新版本:
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 项目。
- 使用 Helm CLI 根据配置设置来部署图表:
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait
此命令可能需要几分钟时间才能完成。
点击
Check my progress(检查我的进度),验证您已完成的任务。成功配置 Jenkins
图表后,系统会显示评估分数。
配置和安装 Jenkins
-
该命令执行完成后,确保 Jenkins Pod 变为
Running 状态且容器处于
READY 状态:
kubectl get pods
输出示例:
NAME READY STATUS RESTARTS AGE
cd-jenkins-7c786475dd-vbhg4 2/2 Running 0 1m
- 配置 Jenkins 服务账号,使其能够将内容部署到集群:
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins
您应该会看到下面的输出内容:
clusterrolebinding.rbac.authorization.k8s.io/jenkins-deploy created
- 运行以下命令,设置从 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 &
- 现在,检查是否已正确创建 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 界面。
- Jenkins 图表会自动为您创建管理员密码。如需检索密码,请运行以下命令:
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
-
如需进入 Jenkins 界面,请在 Cloud Shell 操作栏中依次点击网页预览 (
) 在端口 8080 上预览:
-
如果系统提示,请使用用户名 admin 和自动生成的密码登录。
现在,您已在 Kubernetes 集群中设置了 Jenkins!在接下来的部分中,Jenkins
将推动自动化 CI/CD 流水线的运作。
任务 6. 了解应用
在此任务中,您将在持续部署流水线中部署示例应用 gceme。该应用使用
Go 语言编写,位于仓库的 sample-app 目录中。当您在 Compute Engine 实例上运行
gceme 二进制文件时,应用会在信息卡片中显示实例的元数据。
该应用通过支持两种操作模式来模拟微服务。
-
后端模式:gceme 会监听端口 8080,并以 JSON 格式返回 Compute
Engine 实例元数据。
-
前端模式:gceme 会查询后端 gceme 服务,并在界面中显示生成的
JSON。

任务 7. 部署应用
将应用部署到两个不同的环境:
-
生产环境:用户访问的实际网站。
-
Canary 环境:容量较小的网站,仅接收一定比例的用户流量。在向所有用户发布软件之前,您可以在此环境中通过实时流量验证软件。
- 在 Google Cloud Shell 中,前往示例应用目录:
cd sample-app
- 创建 Kubernetes 命名空间,从逻辑上隔离部署:
kubectl create ns production
-
使用
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 个副本在运行。
- 运行以下命令,对生产环境前端进行扩容:
kubectl scale deployment gceme-frontend-production -n production --replicas 4
-
现在,确认前端有 5 个 Pod 正在运行,其中 4 个用于生产流量,1 个用于 Canary
版本(对 Canary 版本的更改只会影响五分之一 [20%] 的用户):
kubectl get pods -n production -l app=gceme -l role=frontend
-
另外,确认后端有 2 个 Pod,其中 1 个用于生产环境,1 个用于 Canary 环境:
kubectl get pods -n production -l app=gceme -l role=backend
- 检索生产服务的外部 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
粘贴到浏览器中,查看显示的信息卡片。页面展示效果应与下面类似:
- 现在,将前端服务负载均衡器的 IP 存储在环境变量中,以便稍后使用:
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
-
通过在浏览器中打开前端外部 IP 地址,确认两个服务都在正常运行。
-
运行以下命令,检查服务的版本输出(应显示 1.0.0):
curl http://$FRONTEND_SERVICE_IP/version
您成功部署了示例应用!接下来,您将设置流水线,以便持续、可靠地部署更改。
任务 8. 创建 Jenkins 流水线
在此任务中,您将在专用 Git 服务器上设置 Git 代码库并创建 Jenkins 流水线:
- 将示例应用源代码推送到 Git 服务器
- 向 Jenkins 添加您的服务账号凭据
- 为 Kubernetes 配置 Jenkins Cloud
- 创建 Jenkins 多分支流水线作业
将示例应用源代码推送到 Git 服务器
- 在 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}"
- 将
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
- 添加指向自托管 Git 服务器的远程代码库:
git remote add origin http://giteaadmin:GiteaPassword123@${GIT_SERVER_IP}:3000/giteaadmin/sample-app.git
- 添加、提交并将文件推送到
master 分支:
git add .
git commit -m "Initial commit"
git push -u origin master
添加服务账号凭据
配置您的凭据以允许 Jenkins 访问集群并部署资源。
-
在 Jenkins 界面左侧面板中,依次点击 Manage Jenkins 和
Credentials(位于 Security 下)。
-
在 Stores scoped to Jenkins 下,点击
System。

-
点击 Global credentials (unrestricted)。
-
点击 Add Credentials。
-
对于 Kind,选择
Google Service Account from metadata,然后点击
Next。
-
在 ID 字段下输入您的项目 ID(),然后点击 Create。
注意:项目 ID 可以在实验的连接详情面板中找到。
全局凭据已添加。
为 Kubernetes 配置 Jenkins Cloud
-
在 Jenkins 界面中,依次选择 Manage Jenkins >
Clouds(或 System >
Clouds)。
- 点击 New cloud。
-
在 Cloud name 下输入 kubernetes,在
Type 中选择 Kubernetes,然后点击
Create。
-
在
Jenkins URL
字段中,输入以下值:
http://cd-jenkins:8080。
-
在
Jenkins tunnel
字段中,输入以下值:
cd-jenkins-agent:50000。
- 点击 Save。
创建 Jenkins 作业
前往 Jenkins 界面,并按照以下步骤配置多分支流水线作业:
-
在左侧面板中,点击 Jenkins >
New Item。
-
输入项目名称 sample-app,选择
Multibranch Pipeline 选项,然后点击 OK。
-
在下一页的 Branch Sources 部分中,从
Add source 下拉列表中选择 Git。
-
在 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。
-
在 Credentials 下,将其保留为 - none -。
-
在 Scan Multibranch Pipeline Triggers 部分下,勾选
Periodically if not otherwise run 复选框,并将
Interval 值设为 1 minute。
-
将所有其他选项保留为默认值,然后点击 Save。
完成这些步骤后,系统会运行名为
Branch indexing
的作业。该元作业会识别代码库中的分支,并确保现有分支未发生更改。如果您在导航中点击
sample-app,应该会看到 master 作业。
注意:在下一步中对代码进行一些更改之前,master 作业的首次运行可能会失败。
您已成功创建 Jenkins 流水线!接下来,创建用于持续集成的开发环境。
任务 9. 创建开发环境
开发分支是供开发者使用的一组环境。开发者可在这些环境中测试代码更改,然后进行提交,最终将其集成到实际网站。这些环境是应用的精简版,但在部署时仍需要使用与实际环境相同的机制。
创建开发分支
如需从功能分支创建开发环境,可以将该分支推送到 Git 服务器,然后让 Jenkins
部署环境。
注意:如果您在 Cloud Shell 中看到错误,请按 CTRL+C,然后执行以下命令。
git checkout -b new-feature
修改流水线定义
定义该流水线的 Jenkinsfile 使用
Jenkins Pipeline Groovy 语法编写而成。使用
Jenkinsfile
可以将整个构建流水线体现在与源代码共存的单个文件中。流水线支持并行等强大功能,且需要用户手动批准。
为了使流水线按预期运行,您需要修改 Jenkinsfile 以设置项目 ID。
- 在终端编辑器(例如
vi)中打开 Jenkinsfile:
vi Jenkinsfile
- 启动编辑器:
i
-
将您的 PROJECT_ID 添加到
REPLACE_WITH_YOUR_PROJECT_ID 值中。PROJECT_ID
就是项目 ID,可在本实验的
CONNECTION DETAILS 部分找到。您也可以运行
gcloud config get-value project 来查找项目 ID。
-
将 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}"
-
保存
Jenkinsfile 文件:按 ESC 键,然后输入以下内容(适用于
vi 用户):
:wq
修改网站
为了演示如何更改应用,请将 gceme
卡片从蓝色更改为橙色。
- 打开
html.go:
vi html.go
- 启动编辑器:
i
- 将两个
<div class="card blue"> 实例更改为以下内容:
<div class="card orange">
- 保存
html.go 文件:按 ESC 键,然后输入以下内容:
:wq
- 打开
main.go:
vi main.go
- 启动编辑器:
i
- 版本在这一行中定义:
const version string = "1.0.0"
将其更新为以下内容:
const version string = "2.0.0"
- 再次保存 main.go 文件:按 ESC 键,然后输入以下内容:
:wq
任务 10. 开始部署
在此任务中,您将部署开发环境。
- 提交并推送您的更改:
git add Jenkinsfile html.go main.go
git commit -m "Version 2.0.0"
git push origin new-feature
这将启动开发环境的构建。
将更改推送到 Git 代码库后,前往 Jenkins 界面,您会看到
new-feature
分支的构建已启动。系统接收这些更改最长可能需要一分钟时间。
-
构建运行后,点击左侧导航窗格中构建旁边的向下箭头,然后选择
Console output(控制台输出)。

-
跟踪构建输出几分钟,并观察是否开始显示
kubectl --namespace=new-feature apply…
消息。显示这个消息时,就表示 new-feature 分支现已部署到集群。
注意:在开发场景中,您不应使用公开的负载均衡器。为了帮助保护您的应用,您可以使用 kubectl 代理。此代理使用 Kubernetes API 对自身进行身份验证,并将来自本地机器的请求代理到集群中的服务,而不会将您的服务公开给互联网。
如果您在
Build Executor(构建执行器)中没有看到任何内容,请不必担心。只需前往 Jenkins
首页,找到示例应用,就能验证是否已创建 new-feature 流水线。
- 完成所有操作后,在后台启动代理:
kubectl proxy &
-
如果停滞,请按 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
-
这意味着您的前端端点尚未传播,请稍等片刻,然后重试
curl 命令。出现以下输出时,请继续操作:
2.0.0
您成功设置了开发环境!接下来,根据您在上一单元中学习的内容,部署 Canary
版本以测试新功能。
点击
Check my progress(检查我的进度),验证您已完成的任务。成功启动 new-feature
分支的构建后,系统会显示评估分数。
new-feature 分支的构建
任务 11. 部署 Canary 版本
您已验证应用在开发环境中运行的是最新代码,现在可以将代码部署到 Canary
环境中了。
- 创建 Canary 分支并将其推送到 Git 服务器:
git checkout -b canary
git push origin canary
-
在 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.0.0,请尝试再次运行上述命令。验证上述命令是否有效后,使用
CTRL+C 结束命令。
大功告成!您成功部署了 Canary 版本。接下来,将新版本部署到生产环境。
点击
Check my progress(检查我的进度),验证您已完成的任务。成功部署 Canary
版本后,系统会显示评估分数。
部署 Canary 版本
任务 12. 部署到生产环境
现在,我们已成功部署 Canary
版本,而且也没有收到任何客户投诉,接下来将该版本部署到生产舰队的其他部分。
- 创建 Canary 分支并将其推送到 Git 服务器:
git checkout master
git merge canary
git push origin master
在 Jenkins 中,您应该会看到主流水线已启动。
点击
Check my progress(检查我的进度),验证您已完成的任务。成功启动主流水线后,系统会显示评估分数。
部署到生产环境
-
完成后(可能需要几分钟时间),您可以检查服务网址,确保新版本 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.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 应用显示信息卡片的网站。卡片颜色从蓝色变为橙色。
-
以下是用于再次获取外部 IP 地址的命令。将外部 IP
粘贴到新标签页中,查看显示的信息卡片:
kubectl get service gceme-frontend -n production
输出示例:
任务 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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。