arrow_back

在 Kubernetes Engine 中借助 Jenkins 实现持续交付

登录 加入
访问 700 多个实验和课程

在 Kubernetes Engine 中借助 Jenkins 实现持续交付

实验 1 小时 15 分钟 universal_currency_alt 5 个积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP051

Google Cloud 自学实验的徽标

概览

在本实验中,您将学习如何在 Kubernetes Engine 上使用 Jenkins 设置持续交付流水线。对于经常将代码集成到共享仓库的开发者而言,Jenkins 是首选的自动化服务器。您在本实验中构建的解决方案与下图类似:

Jenkins 和 Kubernetes 架构

请前往 Cloud 架构中心,参阅 Kubernetes Engine 上的 Jenkins,详细了解如何在 Kubernetes 上运行 Jenkins。

学习内容

在本实验中,您将完成以下任务,了解如何在 Kubernetes 上运行 Jenkins:

  • 将 Jenkins 应用预配到 Kubernetes Engine 集群
  • 使用 Helm 软件包管理系统设置 Jenkins 应用
  • 探索 Jenkins 应用的功能
  • 创建并运行 Jenkins 流水线

前提条件

本实验是高级实验。在开始之前,您至少应熟悉 shell 编程、Kubernetes 和 Jenkins 的基础知识。以下实验可帮助您快速上手:

准备就绪后,向下滚动以详细了解 Kubernetes、Jenkins 和持续交付。

什么是 Kubernetes Engine?

Kubernetes Engine 是 Google Cloud 的 Kubernetes 托管式版本,这个集群管理和编排系统专为容器打造,功能十分强大。Kubernetes 是一个开源项目,可在众多不同环境中运行,包括笔记本电脑、高可用性多节点集群、虚拟机和裸金属。如前所述,Kubernetes 应用基于容器构建,这些容器是轻量级应用,其中包含运行所需的所有依赖项和库。正是因为采用这种底层结构,Kubernetes 应用具有高可用性、安全可靠,并且可以快速部署,是云开发者的理想框架。

什么是 Jenkins?

Jenkins 是一种开源自动化服务器,可让您灵活地编排构建、测试和部署流水线。借助 Jenkins,开发者可以快速迭代项目,而无需担心持续交付可能带来的开销问题。

什么是持续交付/持续部署?

如果您需要设置持续交付 (CD) 流水线,相对于基于虚拟机的标准部署,在 Kubernetes Engine 上部署 Jenkins 更有优势。

如果构建流程使用容器,一个虚拟主机可以在多个操作系统上运行作业。Kubernetes Engine 提供 ephemeral build executors,这些执行程序仅在构建实际运行时会得到使用,这样就能释放资源以用于其他集群任务(例如批处理作业)。使用临时构建执行程序的另一个好处是速度快,只需几秒钟就能启动。

Kubernetes Engine 还预配备了 Google 的全球负载均衡器,可让您将网络流量自动路由到实例。负载均衡器会处理 SSL 终止,并使用基于 Google 骨干网配置的全球 IP 地址,再加上您的 Web 前端,此负载均衡器总能让用户通过最快路径访问应用实例。

现在,您已经简单了解了 Kubernetes、Jenkins 以及这两者在 CD 流水线中如何交互,接下来可以开始构建了。

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:

    • “打开 Google Cloud 控制台”按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在“实验详细信息”窗格中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在“实验详细信息”窗格中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 Cloud Shell 信息窗口中的设置。
    • 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 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"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 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 Container 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 能够访问 GitHub 仓库和 Google Container Registry。

点击检查我的进度可验证您已完成的任务。如果您成功创建了 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

此命令可能需要几分钟时间才能完成。

点击检查我的进度可验证您已完成的任务。如果您成功配置了 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 公开端口 808050000。这会在 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

点击检查我的进度可验证您已完成的任务。如果您成功创建了部署,系统会显示一个评估分数。

创建生产部署和 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 流水线

在此任务中,您将按如下方式创建 Jenkins 流水线:

  • 创建仓库以托管源代码
  • 添加凭证以授予 Jenkins 对代码库的访问权限
  • 为 Kubernetes 配置 Jenkins 云
  • 向 GitHub 私有仓库对 Jenkins 进行身份验证
  • 创建 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(管理 Jenkins),然后依次点击 Security(安全)> Credentials(凭证)

  2. 点击 System(系统)。

“Credentials”页面

  1. 点击 Global credentials (unrestricted)(全局凭证 [不受限制])。

  2. 点击右上角的 Add Credentials(添加凭证)。

  3. Kind(种类)下拉菜单中选择 Google Service Account from metadata(元数据中的 Google 服务账号)。

  4. ID 字段下,输入项目 ID,然后点击 Create(创建)。

注意:“项目 ID”可在本实验的“连接详情”部分找到。

全局凭证已添加。

“Global credentials (unrestricted)”页面

为 Kubernetes 配置 Jenkins 云

  1. 在 Jenkins 界面中,依次选择 Manage Jenkins(管理 Jenkins)> Nodes(节点)。
  2. 点击左侧导航窗格中的 Clouds(云)。
  3. 点击 New cloud(新建云)。
  4. Cloud name(云名称)下输入任意名称,然后为 Type(类型)选择 Kubernetes
  5. 点击 Create(创建)。
  6. Jenkins URL(Jenkins 网址)字段中,输入以下值:http://cd-jenkins:8080
  7. Jenkins tunnel(Jenkins 隧道)字段中,输入以下值:cd-jenkins-agent:50000
  8. 点击 Save(保存)。

使用 SSH 密钥向 GitHub 私有仓库对 Jenkins 进行身份验证

如需使用 SSH 密钥向 GitHub 私有仓库对 Jenkins 进行身份验证,请按以下步骤操作:

a. 生成 SSH 密钥

  1. 创建一个新的 GitHub SSH 密钥,其中 github-email 是您的 GitHub 邮箱:
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C [your-github-email]
  1. 如需从本地机器下载私钥 (id_github) 和公钥 (id_github.pub),请在 Cloud Shell 操作栏中点击更多 (“更多”图标),然后选择文件夹 continuous-deployment-on-kubernetes/sample-app

b. 将公钥添加到 GitHub

生成 SSH 密钥后,您需要将公钥添加到 GitHub,这样 Jenkins 就可以访问仓库了。

  1. 前往您的 GitHub 账号。点击您的 GitHub 个人资料,然后前往 Settings(设置)。

  2. 在侧边菜单中,选择 SSH and GPG keys(SSH 和 GPG 密钥)。

  3. 点击 New SSH key(新建 SSH 密钥)。

  4. 输入标题 SSH_KEY_LAB

  5. 将从路径 (~/continuous-deployment-on-kubernetes/sample-app/id_github.pub) 下载的公钥 (id_github.pub) 内容粘贴到“Key”(密钥)字段中。您还可以在“Title”(标题)字段中添加一个描述性名称。

  6. 点击 Add SSH key(添加 SSH 密钥)。

c. 配置 Jenkins 以使用 SSH 密钥

  1. 前往 Jenkins,然后从主信息中心选择 Manage Jenkins(管理 Jenkins)。

  2. 选择 Credentials(凭证)选项。

  3. Stores scoped to Jenkins(Jenkins 范围内的存储区)下,点击 System(系统)。

  4. 点击 Global credentials (unrestricted)(全局凭证 [不受限制])。

  5. 点击 Add Credentials(添加凭证)。

  6. Kind(种类)下拉菜单中,选择 SSH Username with private key(SSH 用户名与私钥)。

  7. 在“ID”中,输入 _ssh_key。

  8. Username(用户名)中,输入 [您的 GitHub 用户名]

  9. 对于私钥,选择 Enter directly(直接输入),然后点击 Add(添加)。粘贴 id_github 文件(从 ~/continuous-deployment-on-kubernetes/sample-app/id_github 下载)的内容。

  10. 点击 Create(创建)。

d. 将 SSH 公钥添加到已知主机

在 Cloud Shell 中,创建一个名为 known_hosts.github 的文件,并将 SSH 公钥添加到此文件。

ssh-keyscan -t rsa github.com > known_hosts.github chmod +x known_hosts.github cat known_hosts.github 注意:如果您在 Cloud Shell 中看到任何错误,请按 CTRL+C,然后执行上述命令。

e. 配置已知主机密钥

  1. 在左侧面板中,依次点击 Dashboard(信息中心)> Manage Jenkins(管理 Jenkins)

  2. Security(安全)下,点击 Security(安全)。

  3. Host Key Verification Strategy(主机密钥验证策略)下的 Git Host Key Verification Configuration(Git 主机密钥验证配置)中,从下拉菜单中选择 Manually provided keys(手动提供的密钥)。

  4. known hosts.github 文件内容粘贴到 Approved Host Keys(已批准主机密钥)中。

  5. 点击 Save(保存)。

创建 Jenkins 作业

前往 Jenkins 界面并按照以下步骤配置流水线作业。

  1. 在左侧面板中,依次点击 Dashboard(信息中心)> New Item(新建内容)。

  2. 将项目命名为 sample-app,然后选择 Multibranch Pipeline(多分支流水线)选项,然后点击 OK(确定)。

  3. 在下一页的 Branch Sources(分支来源)部分中,从 Add Source(添加来源)下拉菜单中选择 Git

  4. 将 sample-app 仓库的 HTTPS 克隆网址粘贴到 Project Repository(项目仓库)字段下。将 ${GITHUB_USERNAME} 替换为您的 GitHub 用户名

git@github.com:${GITHUB_USERNAME}/default.git
  1. Credentials(凭证)菜单选项中,选择 github credentials(GitHub 凭证)名称。

  2. Scan Multibranch Pipeline Triggers(扫描多分支流水线触发器)部分,选中 Periodically if not otherwise run(如果不运行则定期扫描)复选框,并将 Interval(间隔)值设置为 1 minute(1 分钟)。

  3. 将所有其他选项都保留为默认值,然后点击 Save(保存)。

完成这些步骤后,系统将运行名为 Branch indexing 的作业。此元作业会标识仓库中的分支,并确保现有分支中未发生更改。如果点击左上角的 sample-app,应该会看到 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=production 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 版本来测试新功能。

点击检查我的进度可验证您已完成的任务。如果您成功启动了 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 版本。接下来,可以将新版本部署到生产环境。

点击检查我的进度可验证您已完成的任务。如果您成功部署了 Canary 版本,系统会显示一个评估分数。

部署 Canary 版本

任务 12. 部署到生产环境

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

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

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

点击检查我的进度可验证您已完成的任务。如果您成功启动了主流水线,系统会显示一个评估分数。

部署到生产环境
  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 技术方面的技能与专业知识。

本手册的最后更新时间:2025 年 6 月 10 日

本实验的最后测试时间:2025 年 6 月 10 日

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

准备工作

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

使用无痕浏览模式

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

登录控制台

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

此内容目前不可用

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

太好了!

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

一次一个实验

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

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

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