arrow_back

使用 Cloud Build 的 Google Kubernetes Engine 流水线

登录 加入
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

使用 Cloud Build 的 Google Kubernetes Engine 流水线

Lab 1 小时 30 分钟 universal_currency_alt 5 个积分 show_chart 中级
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP1077

Google Cloud 自定进度实验

概览

在本实验中,您将创建一个 CI/CD 流水线。该流水线根据所提交的代码自动构建容器映像,将映像存储在 Artifact Registry 中,更新 Git 代码库中的 Kubernetes 清单,并使用该清单将应用部署到 Google Kubernetes Engine。

CI/CD 流程

为完成本实验,您将创建 2 个 Git 代码库:

  • app 代码库:包含应用本身的源代码
  • env 代码库:包含 Kubernetes Deployment 的清单

当您将更改推送到 app 代码库,Cloud Build 流水线会运行测试、构建容器映像,并将映像推送到 Artifact Registry。推送映像后,Cloud Build 会更新 Deployment 清单并将清单推送到 env 代码库。这会触发另一个 Cloud Build 流水线,该流水线将清单应用于 GKE 集群,如果成功,会将清单存储在 env 代码库的另一个分支中。

app 代码库和 env 代码库是分开的,因为两者的生命周期和用途不同。app 代码库的主要用户是真人,并且由特定应用专用。env 代码库的主要用户是自动化系统(例如 Cloud Build),并且可能由多个应用共享。env 代码库可以有多个分支,每个分支映射到特定环境(您在本实验中仅使用生产环境)并引用某个特定的容器映像,而 app 代码库不会如此。

完成本实验后,您将拥有一个可轻松完成以下操作的系统:

  • 通过查看 Cloud Build 历史记录来区分失败和成功的部署。
  • 通过查看 env 代码库的生产分支来访问当前使用的清单。
  • 通过重新执行相应的 Cloud Build 构建作业,回滚到以前的任何版本。

GitOps 流程

目标

在本实验中,您将学习如何执行以下任务:

  • 创建 Kubernetes Engine 集群
  • 创建 Cloud Source Repositories 代码库
  • 从 Cloud Source Repositories 触发 Cloud Build
  • 通过 Cloud Build 进行自动测试并发布可部署的容器映像
  • 通过 Cloud Build 管理部署在 Kubernetes Engine 集群中的资源

设置和要求

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

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

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

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:如果您已有自己的个人 Google Cloud 账号或项目,请不要在此实验中使用,以避免您的账号产生额外的费用。

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

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:

    • 打开 Google 控制台按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google 控制台。 该实验会启动资源并打开另一个标签页,显示登录页面。

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

    注意:如果您看见选择帐号对话框,请点击使用其他帐号
  3. 如有必要,请从实验详细信息面板复制用户名,然后将其粘贴到登录对话框中。点击下一步

  4. 请从实验详细信息面板复制密码,然后将其粘贴到欢迎对话框中。点击下一步

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

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

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

注意:您可以点击左上角的导航菜单来查看列有 Google Cloud 产品和服务的菜单。 “导航菜单”图标

激活 Cloud Shell

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

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

如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

  2. 现在,输出的内容应如下所示:

输出:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出

[core] project = <project_ID>

输出示例

[core] project = qwiklabs-gcp-44776a13dea667a6 Note: For full documentation of gcloud, in Google Cloud, refer to the gcloud CLI overview guide.

任务 1. 对实验进行初始化

  1. 在 Cloud Shell 中,设置您的项目 ID 和项目编号。将这两者保存为 PROJECT_IDPROJECT_NUMBER 变量:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') export REGION={{{ project_0.default_region }}} gcloud config set compute/region $REGION

在下一个任务中,您将启用所需的 API、在 Cloud Shell 中对 Git 配置进行初始化,并下载稍后在实验中使用的示例代码,以准备好要用的 Google Cloud 项目。

  1. 运行以下命令为 GKE、Cloud Build、Cloud Source Repositories 和 Container Analysis 启用 API:
gcloud services enable container.googleapis.com \ cloudbuild.googleapis.com \ sourcerepo.googleapis.com \ containeranalysis.googleapis.com
  1. 区域创建名为 my-repository 的 Artifact Registry Docker 仓库,用于存储容器映像:
gcloud artifacts repositories create my-repository \ --repository-format=docker \ --location=$REGION
  1. 创建一个 GKE 集群,用于部署本实验的示例应用:
gcloud container clusters create hello-cloudbuild --num-nodes 1 --region $REGION
  1. 如果您从未在 Cloud Shell 中使用过 Git,请使用您的姓名和电子邮件地址进行配置。将来您在 Cloud Shell 中创建了提交时,Git 将使用这些信息来识别您的作者身份(如果您没有 GitHub 账号,只需使用您当前的信息填写即可。本实验不需要账号):
git config --global user.email "you@example.com" git config --global user.name "Your Name"

点击检查我的进度,验证已完成以下目标: 启用服务,创建 Artifact Registry 和 GKE 集群

任务 2. 在 Cloud Source Repositories 中创建 Git 代码库

在此任务中,您将创建两个 Git 代码库(hello-cloudbuild-apphello-cloudbuild-env),并使用一些示例代码对 hello-cloudbuild-app 进行初始化。

  1. 在 Cloud Shell 中,运行以下命令创建这两个 Git 代码库:
gcloud source repos create hello-cloudbuild-app gcloud source repos create hello-cloudbuild-env
  1. 从 GitHub 克隆示例代码:
cd ~ git clone https://github.com/GoogleCloudPlatform/gke-gitops-tutorial-cloudbuild hello-cloudbuild-app
  1. 将 Cloud Source Repositories 配置为远程代码库:
cd ~/hello-cloudbuild-app export REGION={{{project_0.default_region | "REGION"}}} sed -i "s/us-central1/$REGION/g" cloudbuild.yaml sed -i "s/us-central1/$REGION/g" cloudbuild-delivery.yaml sed -i "s/us-central1/$REGION/g" cloudbuild-trigger-cd.yaml sed -i "s/us-central1/$REGION/g" kubernetes.yaml.tpl PROJECT_ID=$(gcloud config get-value project) git remote add google "https://source.developers.google.com/p/${PROJECT_ID}/r/hello-cloudbuild-app"

您刚刚克隆的代码包含一个简单的“Hello World”应用。

from flask import Flask app = Flask('hello-cloudbuild') @app.route('/') def hello(): return "Hello World!\n" if __name__ == '__main__': app.run(host = '0.0.0.0', port = 8080)

点击检查我的进度,验证已完成以下目标: 创建 Git 代码库

任务 3. 使用 Cloud Build 创建容器映像

您克隆的代码已包含以下 Dockerfile。

FROM python:3.7-slim RUN pip install flask WORKDIR /app COPY app.py /app/app.py ENTRYPOINT ["python"] CMD ["/app/app.py"]

有了此 Dockerfile,您便可使用 Cloud Build 创建容器映像并将其存储在 Artifact Registry 中。

  1. 在 Cloud Shell 中,使用以下命令基于最近的提交创建一个 Cloud Build 构建作业:
cd ~/hello-cloudbuild-app COMMIT_ID="$(git rev-parse --short=7 HEAD)" gcloud builds submit --tag="${REGION}-docker.pkg.dev/${PROJECT_ID}/my-repository/hello-cloudbuild:${COMMIT_ID}" .

您执行此命令时,Cloud Build 会将创建容器映像过程生成的日志流式传输到终端。

  1. 构建完成后,在 Cloud 控制台中前往 Artifact Registry > 代码库,确认新的容器映像在 Artifact Registry 中确实可用。点击 my-repository

Artifact Registry

点击检查我的进度,验证已完成以下目标: 使用 Cloud Build 创建容器映像

任务 4. 创建持续集成 (CI) 流水线

在此任务中,您将对 Cloud Build 进行配置,使其自动运行小型单元测试、构建容器映像然后将映像推送到 Artifact Registry。将新的提交推送到 Cloud Source Repositories 会自动触发该流水线。已包含在代码中的 cloudbuild.yaml 文件是该流水线的配置。

架构

  1. 在 Cloud 控制台中,前往 Cloud Build > 触发器
  2. 点击创建触发器
  3. 在“名称”字段中,输入 hello-cloudbuild
  4. 事件下,选择推送到分支
  5. 来源下,选择 hello-cloudbuild-app 作为代码库,选择 .*(任何分支)作为分支
  6. 构建配置下,选择 Cloud Build 配置文件
  7. Cloud Build 配置文件位置字段中,在 / 后输入 cloudbuild.yaml
  8. 点击创建

创建触发器

创建触发器之后,返回 Cloud Shell。现在,您需要将应用代码推送到 Cloud Source Repositories,以在 Cloud Build 中触发 CI 流水线。

  1. 要开始触发,请运行以下命令:
cd ~/hello-cloudbuild-app git add . git commit -m "Type Any Commit Message here" git push google master
  1. 在 Cloud 控制台中,前往 Cloud Build > 信息中心

  2. 您应该会看到正在运行或最近完成的构建。您可以点击构建作业以跟踪其执行情况并检查其日志。

信息中心

点击检查我的进度,验证已完成以下目标: 创建持续集成 (CI) 流水线

任务 5. 创建测试环境和 CD 流水线

Cloud Build 也用于持续交付流水线。每次将提交推送到 hello-cloudbuild-env 代码库的候选分支,该流水线都会运行。该流水线会将新版本的清单应用于 Kubernetes 集群,如果成功,则将清单复制到生产分支。此过程具有以下属性:

  • 候选分支是部署尝试的历史记录。
  • 生产分支是成功部署的历史记录。
  • 您可以在 Cloud Build 中查看成功和失败的部署。
  • 您可以通过在 Cloud Build 中重新执行相应的构建作业,回滚到任何先前的部署。回滚也会更新生产分支,以真实反映部署的历史记录。

接下来,您将修改此持续集成流水线,以更新 hello-cloudbuild-env 代码库的候选分支,从而触发持续交付流水线。

为 Cloud Build 授予 GKE 的访问权限

为了在 Kubernetes 集群中部署应用,Cloud Build 需要 Kubernetes Engine Developer 这一 Identity and Access Management 角色。

  1. 在 Cloud Shell 中,执行以下命令:
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')" gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer

您需要使用生产分支和候选分支以及描述部署过程的 Cloud Build 配置文件对 hello-cloudbuild-env 代码库进行初始化。

第一步是克隆 hello-cloudbuild-env 代码库并创建生产分支。目前它仍然是空的。

  1. 在 Cloud Shell 中,执行以下命令:
cd ~ gcloud source repos clone hello-cloudbuild-env cd ~/hello-cloudbuild-env git checkout -b production
  1. 接下来,您需要复制 hello-cloudbuild-app 代码库中提供的 cloudbuild-delivery.yaml 文件,并提交更改:
cd ~/hello-cloudbuild-env cp ~/hello-cloudbuild-app/cloudbuild-delivery.yaml ~/hello-cloudbuild-env/cloudbuild.yaml git add . git commit -m "Create cloudbuild.yaml for deployment"

cloudbuild-delivery.yaml 文件描述将在 Cloud Build 中运行的部署过程。它有两个步骤:

  • Cloud Build 在 GKE 集群上应用清单。
  • 如果成功,Cloud Build 会在生产分支上复制清单。
  1. 创建候选分支并推送两个分支,使其在 Cloud Source Repositories 中可用:
git checkout -b candidate git push origin production git push origin candidate
  1. 将“Source Repository Writer”这一 IAM 角色授予 hello-cloudbuild-env 代码库的 Cloud Build 服务账号:
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" cat >/tmp/hello-cloudbuild-env-policy.yaml <<EOF bindings: - members: - serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com role: roles/source.writer EOF gcloud source repos set-iam-policy \ hello-cloudbuild-env /tmp/hello-cloudbuild-env-policy.yaml

为持续交付流水线创建触发器

  1. 在 Cloud 控制台中,前往 Cloud Build > 触发器
  2. 点击创建触发器
  3. 在“名称”字段中,输入 hello-cloudbuild-deploy
  4. 事件下,选择推送到分支
  5. 来源下,选择 hello-cloudbuild-env 作为代码库,选择 ^candidate$ 作为分支
  6. 构建配置下,选择 Cloud Build 配置文件
  7. Cloud Build 配置文件位置字段中,在 / 后输入 cloudbuild.yaml
  8. 点击创建

创建触发器

修改持续集成流水线以触发持续交付流水线。

接下来,向持续集成流水线添加一些步骤,这些步骤将生成新版本的 Kubernetes 清单并将清单推送到 hello-cloudbuild-env 代码库,以触发持续交付流水线。

  1. 复制 app 代码库cloudbuild.yaml 文件的扩展版本:
cd ~/hello-cloudbuild-app cp cloudbuild-trigger-cd.yaml cloudbuild.yaml

cloudbuild-trigger-cd.yamlcloudbuild.yaml 文件的扩展版本。该版本添加了以下步骤,这些步骤生成新的 Kubernetes 清单并触发持续交付流水线。

该流水线使用简单的 sed 来呈现清单模板。在实际开发中,使用 Kustomize 或 Skaffold 等专用工具好处更多。它们可让您更全面地控制清单模板的呈现方式。
  1. 提交修改并将其推送到 Cloud Source Repositories:
cd ~/hello-cloudbuild-app git add cloudbuild.yaml git commit -m "Trigger CD pipeline" git push google master

这会触发 Cloud Build 中的持续集成流水线。

点击检查我的进度,验证已完成以下目标: 创建测试环境和 CD 流水线

任务 6. 审核 Cloud Build 流水线

  1. 在 Cloud 控制台中,前往 Cloud Build > 信息中心
  2. 点击进入 hello-cloudbuild-app 触发器,以跟踪其执行情况并检查其日志。该流水线的最后一步将新清单推送到 hello-cloudbuild-env 代码库,触发持续交付流水线。

Build 历史记录

  1. 返回主信息中心
  2. 您应该会看到正在运行的构建作业,或最近完成的 hello-cloudbuild-env 代码库构建作业。您可以点击构建作业以跟踪其执行情况并检查其日志。

Cloud Build 信息中心

任务 7. 测试完整的流水线

完整的 CI/CD 流水线现已完成配置。对其进行端到端测试。

  1. 在 Cloud 控制台中,前往 Kubernetes Engine > 网关、服务和入站流量

列表中应该有一个名为 hello-cloudbuild 的服务。该服务是由刚刚运行的持续交付构建作业所创建。

  1. 点击 hello-cloudbuild 服务的端点。此时您应该会看到“Hello World!”。如果没有端点,或者如果您看到负载均衡器错误,则可能需要等待几分钟,以便负载均衡器完全初始化。如果需要,可点击刷新以更新页面。

应用 1:Hello World!

  1. 在 Cloud Shell 中,在应用和单元测试中将“Hello World”替换为“Hello Cloud Build”:
cd ~/hello-cloudbuild-app sed -i 's/Hello World/Hello Cloud Build/g' app.py sed -i 's/Hello World/Hello Cloud Build/g' test_app.py
  1. 提交更改,并将更改推送到 Cloud Source Repositories:
git add app.py test_app.py git commit -m "Hello Cloud Build" git push google master
  1. 这会触发完整的 CI/CD 流水线。

几分钟后,在浏览器中重新加载应用。您现在应该会看到“Hello Cloud Build!”。

应用 2:Hellow Cloud Build!

任务 8. 测试回滚

在此任务中,您将回滚到显示“Hello World!”的应用版本。

  1. 在 Cloud 控制台中,前往 Cloud Build > 信息中心
  2. hello-cloudbuild-env 代码库的 Build 记录下点击“查看全部”链接。
  3. 点击所列出的第二新的构建作业。
  4. 点击重建

回滚成功屏幕

完成构建作业后,在浏览器中重新加载应用。您现在应该会再次看到“Hello World!”。

应用 1:Hello World!

恭喜!

现在,您可以使用 Cloud Build 在 GKE on Google Cloud 中创建和回滚持续集成流水线了。

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

上次更新手册的时间:2024 年 1 月 26 日

上次测试实验的时间:2024 年 1 月 19 日

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