Hello Cloud Run(使用 C#)

1. 简介

89eb4723767d4525

Cloud Run 是一个托管式平台,供您运行可通过 HTTP 请求调用的无状态容器。Cloud Run 采用无服务器设计:您不用管理基础架构,因此可全力专注于最重要的工作,即构建出色的应用。

它基于 Knative 构建而成,可让您选择使用 Cloud Run 在全代管式环境中运行容器,或使用 Cloud Run on GKE 在您的 Google Kubernetes Engine 集群中运行容器。

此 Codelab 的目标是构建容器映像并将其部署到 Cloud Run。

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

295004821bab6a87

37d264871000675d

96d86d3d5655cdbe.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

Google Cloud Shell

虽然 Google Cloud 可以通过笔记本电脑远程操作,但在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Cloud Shell 是一个可通过浏览器访问的在线开发和运营环境。您可以通过其预加载了实用程序(如 gcloud 命令行工具、kubectl 等)的在线终端管理您的资源。您还可以使用在线 Cloud Shell Editor 开发、构建、调试和部署云端应用。

这个虚拟机装有您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且直接在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。这意味着在本 Codelab 中,您只需要一个浏览器(没错,它适用于 Chromebook)。

  • 如需从 Cloud 控制台激活 Cloud Shell,只需点击激活 Cloud Shell

cb81e7c8e34bc8d.png

如果这是您第一次启动 Cloud Shell,系统会显示一个中间屏幕,说明它是什么。如果您看到了中间屏幕,请点击继续

bfde7b083abc9544.png

预配环境应该只需要几秒钟:

cbb597d2be277a14.png

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证:

gcloud auth list

命令输出

Credentialed Accounts

ACTIVE: *
ACCOUNT: <my-account>@<mydomain>

该项目也应该已设置为您的 PROJECT_ID(假设您已在 Web 控制台中选择一个项目):

gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果出于某种原因未设置项目,只需发出以下命令即可:

gcloud config set project <PROJECT_ID>

正在查找您的 PROJECT_ID?查看 Cloud 控制台顶部的下拉菜单:

2c7a57249d954735

您还可以使用“设置和实用程序”查看项目详情部分:

791f101797cfef39

默认情况下,Cloud Shell 还会设置一些环境变量,这对您日后运行命令可能会很有用。

echo $GOOGLE_CLOUD_PROJECT

命令输出

<PROJECT_ID>
  • 最后,您可以设置默认可用区:
gcloud config set compute/zone us-central1-f

您可以选择不同的可用区。如需了解详情,请参阅区域和可用区

启用 Cloud Run API

在 Cloud Shell 中,启用 Cloud Run API:

gcloud services enable run.googleapis.com

这应该会生成类似于以下内容的成功消息:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. 编写示例应用

我们将构建一个响应 HTTP 请求的简单 ASP.NET C# 应用程序。

如需创建应用,请使用 Cloud Shell 中的 dotnet 命令行工具:

dotnet new web -o helloworld-csharp

切换到 helloworld-csharp 目录:

cd helloworld-csharp

接下来,更新 Program.cs 以匹配以下内容:

var builder = WebApplication.CreateBuilder(args);

var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
var url = $"http://0.0.0.0:{port}";
builder.WebHost.UseUrls(url);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

这段代码会创建一个基本 Web 服务器,该服务器监听由 PORT 环境变量定义的端口,并使用 Hello World 进行回复。

您可以在 Cloud Shell 中本地运行应用来测试该应用。您应该会看到它在监听端口 8080:

$ dotnet run
Using launch settings from /home/atameldev/helloworld-csharp/Properties/launchSettings.json...
Hosting environment: Development
Content root path: /home/atameldev/helloworld-csharp
Now listening on: http://0.0.0.0:8080
Application started. Press Ctrl+C to shut down.

4. 部署到 Cloud Run

使用以下命令将应用部署到 Cloud Run:

gcloud run deploy hello-world \
    --allow-unauthenticated \
    --region us-central1 \
    --source .
  • hello-world是服务名称。
  • allow-unauthenticated 标志将服务部署为公开提供的服务,没有身份验证要求。
  • us-central1 是将部署应用的区域。
  • source 标志可确定要构建的源代码的位置。Cloud Run 使用 Buildpack 自动利用源代码创建容器。

等待部署完成,这可能需要几分钟。成功部署后,命令行中便会显示该服务的网址:

Service [hello-world] revision [hello-world-00001-yos] has been deployed and is serving 100 percent of traffic.
Service URL: https://helloworld-wdl7fdwaaa-uc.a.run.app

现在,您可以通过在网络浏览器中打开该服务网址来访问已部署的容器:

85e7fbbd264444c9

恭喜!您刚刚将容器映像中封装的应用部署到了 Cloud Run。Cloud Run 可以对您的容器映像进行自动横向扩容以处理收到的请求,并在需求减少时缩容。您只需为在处理请求期间消耗的 CPU、内存和网络付费。

5. 该清理资源了

您可以决定删除 GCP 项目以避免产生费用(这会导致系统停止对该项目中使用的所有资源计费),也可以直接删除 Cloud Run 服务:

gcloud run services delete helloworld

6. 接下来做什么?

下一步最好是部署到 Cloud Run on GKE

如需详细了解如何使用源代码构建适用于 Cloud Run 的无状态 HTTP 容器并将其推送到 Container Registry,请参阅下面的内容: