1. 概览
ASP.NET Core 是一个全新的开源跨平台框架,可用于使用 C# 编程语言构建基于云的现代互联应用。
Kubernetes 是一个开源项目,可在从笔记本电脑到高可用性多节点集群、从公有云到本地部署以及从虚拟机到裸金属等众多不同环境中运行。
在此实验中,您将一个简单的 ASP.NET Core 应用部署到在 Kubernetes Engine 上运行的 Kubernetes。此 Codelab 基于使用 Google Cloud Shell 构建并启动 ASP.NET Core 应用 Codelab 构建而成。您可能需要先完成该实验,然后再尝试此实验。
此 Codelab 的目标是让您将自己的代码(此处为简单的 Hello World ASP.NET Core 应用)转换为在 Kubernetes 上运行的复制应用。您需要将在机器上开发的代码转换为 Docker 容器映像,然后在 Google Kubernetes Engine 上运行该映像。
下图展示了此 Codelab 中涉及的各个部分,可帮助您了解这些部分如何组合在一起。在学习此 Codelab 的过程中,您可以参考此图;当您完成此 Codelab 时,您应该能够理解此图中的所有内容(但您现在可以忽略此图)。

在本 Codelab 中,借助 Kubernetes Engine(在 Compute Engine 上运行的 Google 托管式 Kubernetes 版本)这样的托管式环境,您可以把更多精力放在体验 Kubernetes 上,而不必分心去设置底层基础设施。
如果您有兴趣在本地机器(如开发笔记本电脑)上运行 Kubernetes,则应考虑了解 Minikube。它可为开发和测试目的提供单节点 Kubernetes 集群的简单设置。如果需要,您可以使用 Minikube 完成此 Codelab。
学习内容
- 如何将简单的 ASP.NET Core 应用打包为 Docker 容器。
- 如何在 Google Kubernetes Engine (GKE) 上创建 Kubernetes 集群。
- 如何将 ASP.NET Core 应用部署到 pod。
- 如何允许外部流量进入您的 pod。
- 如何扩容服务并发布升级。
- 如何运行 Kubernetes 图形信息中心。
所需条件
您打算如何使用本教程?
您如何评价自己在 Google Cloud Platform 方面的经验水平?
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



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

如果您以前从未启动过 Cloud Shell,将看到一个中间屏幕(非首屏),描述它是什么。如果是这种情况,请点击继续(您将永远不会再看到它)。一次性屏幕如下所示:

预配和连接到 Cloud Shell 只需花几分钟时间。

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。
在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:
- 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list
命令输出
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project
命令输出
[core] project = <PROJECT_ID>
如果不是上述结果,您可以使用以下命令进行设置:
gcloud config set project <PROJECT_ID>
命令输出
Updated property [core/project].
3. 在 Cloud Shell 中创建 ASP.NET Core 应用
在 Cloud Shell 提示符处,您可以通过检查 dotnet 命令行工具的版本来验证该工具是否已安装。此命令应会输出已安装的 dotnet 命令行工具的版本:
dotnet --version
接下来,创建一个新的 ASP.NET Core Web 应用。
dotnet new mvc -o HelloWorldAspNetCore
系统会创建一个项目并恢复其依赖项。您应该会看到如下所示的消息:
Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.
Restore succeeded.
4. 运行 ASP.NET Core 应用
我们的应用很快就可以运行了。前往应用文件夹。
cd HelloWorldAspNetCore
最后,运行应用。
dotnet run --urls=http://localhost:8080
该应用随即便开始监听端口 8080。
Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.
如要验证该应用是否正在运行,请点击右上角的网页预览按钮,然后选择“在端口 8080 上预览”。

您将看到默认的 ASP.NET Core 网页:

验证应用正在运行后,按 Ctrl+C 关闭应用。
5. 将 ASP.NET Core 应用打包为 Docker 容器
接下来,准备好应用以作为容器运行。第一步是定义容器及其内容。
在应用的基础目录中,创建一个 Dockerfile 来定义 Docker 映像。
touch Dockerfile
使用您惯用的编辑器(vim,、nano,emacs 或 Cloud Shell 的代码编辑器)将以下内容添加到 Dockerfile。
# Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build WORKDIR /app # Install production dependencies. # Copy csproj and restore as distinct layers. COPY *.csproj ./ RUN dotnet restore # Copy local code to the container image. COPY . ./ WORKDIR /app # Build a release artifact. RUN dotnet publish -c Release -o out # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime WORKDIR /app COPY --from=build /app/out ./ # Make sure the app binds to port 8080 ENV ASPNETCORE_URLS http://*:8080 # Run the web service on container startup. ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]
您的 Dockerfile 中包含的一项重要配置是应用监听传入流量的端口 (8080)。为此,您可以设置 ASPNETCORE_URLS 环境变量,ASP.NET Core 应用会使用该变量来确定要监听的端口。
保存此 Dockerfile。现在,我们来构建映像:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .
完成后(需要一些时间下载和解压缩所有内容),您会看到映像已构建并保存在本地:
docker images REPOSITORY TAG gcr.io/yourproject-XXXX/hello-dotnet v1
使用以下命令在本地测试映像,该命令将从新创建的容器映像在本地端口 8080 上运行 Docker 容器:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
再次利用 Cloud Shell 的网页预览功能:

您应该会在新标签页中看到默认的 ASP.NET Core 网页。

确认应用正在 Docker 容器中本地正常运行后,您可以按 Ctrl-> C 停止正在运行的容器。
现在,映像已按预期运行,您可以将其推送到 Google Container Registry,这是一个私有代码库,用于存储您的 Docker 映像,可从每个 Google 云项目(也可从 Google Cloud Platform 外部)访问:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
如果一切顺利,过一会儿,您应该就能在 Container Registry 部分中看到列出的容器映像。现在,您拥有一个适用于整个项目的 Docker 映像,Kubernetes 可对其进行访问和编排(几分钟后您便会看到)。

如果您有兴趣,可以点击以下链接,浏览存储在 Google Cloud Storage 中的容器映像:https://console.cloud.google.com/storage/browser/(最终链接应采用以下完整形式:https://console.cloud.google.com/project/PROJECT_ID/storage/browser/)。
6. 创建 Kubernetes 集群
好的,您现在可以创建 GKE 集群了,但在此之前,请前往 Web 控制台的 Google Kubernetes Engine 部分,等待系统初始化(这应该只需要几秒钟)。

集群由 Google 管理的 Kubernetes 主 API 服务器和一组工作器节点组成。工作器节点是 Compute Engine 虚拟机。
我们来使用 CloudShell 会话中的 gcloud CLI 创建集群。将可用区调整为您附近的某个位置(可用区列表)。这需要几分钟才能完成:
gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b
最后,您应该会看到创建的集群。
Creating cluster hello-dotnet-cluster...done. Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster]. kubeconfig entry generated for hello-dotnet-cluster. NAME ZONE MASTER_VERSION hello-dotnet-cluster europe-west1-b 1.10.7-gke.6
现在,您应该拥有一个由 Google Kubernetes Engine 提供支持且功能齐全的 Kubernetes 集群:

现在是时候将您自己的容器化应用部署到 Kubernetes 集群了!从现在开始,您将使用 kubectl 命令行(已在 Cloud Shell 环境中设置)。此 Codelab 的其余部分要求 Kubernetes 客户端和服务器版本均为 1.2 或更高版本。kubectl version 将显示该命令的当前版本。
7. 创建部署
Kubernetes pod 是一组容器,它们为了管理和联网而绑定在一起。它可以包含单个容器,也可以包含多个容器。在此处,您只需使用一个基于存储在私有容器注册表中的 ASP.NET Core 映像构建的容器。它将在端口 8080 上提供内容。
使用您惯用的编辑器(vim, nano,emacs 或 Cloud Shell 的代码编辑器)创建 hello-dotnet.yaml 文件,并为 pod 定义 Kubernetes 部署:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: hello-dotnet
name: hello-dotnet
namespace: default
spec:
replicas: 1
selector:
matchLabels:
run: hello-dotnet
template:
metadata:
labels:
run: hello-dotnet
spec:
containers:
- name: hello-dotnet
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
使用 kubectl 部署到默认命名空间:
kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created
如您所见,您已创建 deployment 对象。建议使用 Deployment 来创建和扩缩 Pod。在此示例中,新部署管理着运行 hello-dotnet:v1 映像的单个 pod 副本。
如需查看您刚刚创建的部署,只需运行以下命令:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-dotnet 1 1 1 1 37s
如需查看部署创建的 pod,请运行以下命令:
kubectl get pods
NAME READY STATUS RESTARTS AGE hello-dotnet-714049816-ztzrb 1/1 Running 0 57s
现在,您可以运行一些有趣的 kubectl 命令(这些命令都不会更改集群的状态,完整文档可点击此处查看):
kubectl get pods kubectl cluster-info kubectl config view kubectl get events kubectl logs <pod-name>
此时,您应该让容器在 Kubernetes 的控制下运行,但您仍须允许外部世界访问该容器。
8. 允许外部流量
默认情况下,只能通过 pod 在集群内的内部 IP 访问该 pod。为了使 hello-dotnet 容器可以从 Kubernetes 虚拟网络外部进行访问,您必须将 Pod 公开为 Kubernetes 服务。
在 Cloud Shell 中,您可以结合使用 kubectl expose 命令和 --type="LoadBalancer" 标志向公共互联网公开 pod。此标志在创建外部可访问的 IP 时是必需的:
kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080
此命令中使用的标志指定您将使用底层基础架构(在本例中为 Compute Engine 负载平衡器)提供的负载平衡器。请注意,您公开的是 Deployment,而不是直接公开 Pod。这会使生成的服务对 Deployment 管理的所有 Pod 的流量进行负载均衡(在本例中,只有一个 Pod,但稍后您将添加更多副本)。
Kubernetes 主实例会创建负载平衡器和相关的 Compute Engine 转发规则、目标池和防火墙规则,以使该服务完全可从 Google Cloud Platform 外部进行访问。
如需查找服务的可公开访问的 IP 地址,只需请求 kubectl 即可列出所有集群服务:
kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-dotnet 10.3.253.62 104.155.20.69 8080/TCP 1m kubernetes 10.3.240.1 <none> 443/TCP 5m
请注意,系统针对您的服务列出了 2 个 IP 地址,它们均通过端口 8080 提供服务。一个是仅在您的云虚拟网络中可见的内部 IP;另一个是外部负载均衡 IP。在此示例中,外部 IP 地址为 104.155.20.69。
现在,通过将浏览器指向以下地址,您应该能够访问该服务:http://<EXTERNAL_IP>:8080

此时,您至少已从迁移到容器和 Kubernetes 中获益良多 - 您无需指定在哪个主机上运行工作负载,还可以受益于服务监控和重启。让我们来看看您还能从新的 Kubernetes 基础设施中获得哪些好处。
9. 扩大服务规模
Kubernetes 提供了许多强大的功能,其中一个就是可以轻松扩缩应用。假设您突然需要为应用增加容量,只需指示复制控制器为您的 pod 管理新数量的副本即可:
kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-dotnet 4 4 4 3 16m
kubectl get pods NAME READY STATUS RESTARTS AGE hello-dotnet-714049816-g4azy 1/1 Running 0 1m hello-dotnet-714049816-rk0u6 1/1 Running 0 1m hello-dotnet-714049816-sh812 1/1 Running 0 1m hello-dotnet-714049816-ztzrb 1/1 Running 0 16m
请注意此处的声明性方法 - 您无需启动或停止新实例,而是声明应始终运行的实例数量。Kubernetes 协调循环只是确保现实符合您的要求并视需要采取措施。
下图总结了 Kubernetes 集群的状态:

您还可以非常轻松地缩容服务。以下是将 Pod 从 4 个缩容到 2 个的示例。
kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME READY STATUS RESTARTS AGE hello-dotnet-714049816-g4azy 1/1 Running 0 1m hello-dotnet-714049816-rk0u6 1/1 Running 0 1m
10. 测试恢复能力
Kubernetes(或更具体地说,是 ReplicaSet)会监控您的 Pod,如果 Pod 出现问题并停止运行,它会立即创建一个新的 Pod。我们来测试一下,看看效果如何。
首先,获取 pod 列表:
kubectl get pods
NAME READY STATUS RESTARTS AGE hello-dotnet-714049816-g4azy 1/1 Running 0 1m hello-dotnet-714049816-rk0u6 1/1 Running 0 1m
通过传入 pod 名称来删除其中一个 pod:
kubectl delete pod hello-dotnet-714049816-g4azy
如果您再次查看 Pod 列表,会看到一个新 Pod 正在创建并立即再次运行:
kubectl get pods
NAME READY STATUS RESTARTS AGE hello-dotnet-714049816-abczy 1/1 ContainerCreating 0 1m hello-dotnet-714049816-rk0u6 1/1 Running 0 1m
11. 发布服务升级
在某些情况下,您部署到生产环境的应用将需要进行问题修复或需要其他功能。下面我们来看看该流程。
首先,我们来修改应用。从 Cloud Shell 中打开代码编辑器。

前往 HelloWorldAspNetCore > Views > Home 下的 Index.cshtml,然后更新其中一条轮播消息。
找到以下行:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
并将其更改为以下内容:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
保存更改,然后返回到 Cloud Shell。在 HelloWorldAspNetCore, 中构建 Docker 映像:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
并推送到 Container Registry:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
您现在可以让 Kubernetes 顺利地将您的复制控制器更新到新版应用了。如需更改正在运行的容器的映像标签,您需要修改现有的 hello-dotnet deployment,并将映像从 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 更改为 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2。
为此,您将使用 kubectl edit 命令。系统随即会打开一个文本编辑器,其中显示完整的部署 YAML 配置。您现在无需完全了解 YAML 配置,只需知道通过更新配置中的 spec.template.spec.containers.image 字段,您可以告知部署更新 pod 以使用新映像。
kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: 2017-01-06T10:05:28Z
generation: 3
labels:
run: hello-dotnet
name: hello-dotnet
namespace: default
resourceVersion: "151017"
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
replicas: 4
selector:
matchLabels:
run: hello-dotnet
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
run: hello-dotnet
spec:
containers:
- image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
imagePullPolicy: IfNotPresent
name: hello-dotnet
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
terminationGracePeriodSeconds: 30
进行更改后,保存并关闭文件(此操作使用 vi,因此请按“Esc”键,然后输入 :wq 并按“Enter”键)。
deployment "hello-dotnet" edited
这会使用新映像更新部署,从而导致系统使用新映像创建新 pod 并删除旧 pod。
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-dotnet 4 5 4 3 1h
在此过程中,服务的用户不应看到任何中断。过一段时间后,他们将开始访问应用的新版本。

如需详细了解滚动更新,请参阅 Kubernetes 文档。
希望通过这些部署、扩缩和更新功能,您会认同,一旦设置好环境(即此处的 GKE/Kubernetes 集群),Kubernetes 就可以帮助您专注于应用,而不是管理基础架构。
12. Cloud Build
到目前为止,我们一直使用常规 Docker 命令 (docker build ...) 构建容器,然后手动将映像推送到 Google Cloud Platform 的 Container Registry 中。您还可以将这两个步骤都推迟到服务器端 Cloud Build,这样无需在本地安装 Docker 即可构建和推送容器映像。
首先,在 API 管理器 > 库中启用 Cloud Build API。搜索 Cloud Build,然后点击进入 Cloud Build API:

如果该 API 尚未启用,请点击启用 API。最后,您应该会看到 API 已启用,如下所示:

启用 Cloud Build API 后,您可以运行以下命令,通过 Container Builder 服务构建并推送映像:
$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3
映像会自动存储在 Container Registry 中。
13. 运行 Kubernetes 图形信息中心
在最新版本的 Kubernetes 中,引入了图形化 Web 界面(信息中心)。借助此界面,您可以快速入门,并以更易于理解和发现的方式与系统互动,从而使用 CLI 中的部分功能。
如需配置对 Kubernetes 集群信息中心的访问权限,请在 Cloud Shell 窗口中输入以下命令:
gcloud container clusters get-credentials hello-dotnet-cluster \
--zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081
然后再次使用 Cloud Shell 预览功能前往端口 8081:

这应该会将您发送到 API 端点。您可能会看到“未经授权”页面,但不必担心。如需前往信息中心,请移除“?authuser=3”并将其替换为“/ui”。
尽情使用 Kubernetes 图形化信息中心,利用它部署容器化应用,以及监控和管理集群!

或者,您也可以按照类似说明从开发机器或本地机器访问信息中心。这些说明会在您从 Web 控制台按要监控的集群的“连接”按钮时显示。


完成信息中心操作后,您可以按 Control + C 停止代理。如需详细了解 Kubernetes 信息中心,请参阅信息中心导览。
14. 日志记录
您可以使用 kubectl logs 命令检索在 Kubernetes 中运行的容器的日志。当您使用 Google Kubernetes Engine 运行托管式 Kubernetes 集群时,所有日志都会自动转发并存储在 Google Cloud Logging 中。您可以在 Google Cloud 控制台中依次前往 Stackdriver → Logging → Logs,查看来自 pod 的所有日志输出:

进入日志记录控制台后,您可以前往 GKE 容器,查看从 STDOUT 收集的所有日志:

在此处,您可以选择将日志导出到 Google BigQuery 以进行进一步的日志分析,也可以设置基于日志的提醒。在今天的实验中,我们不会执行此操作。
15. 恭喜!
至此,本 Codelab 结束,您已了解如何使用 ASP.NET Core 和 Kubernetes。我们只是浅尝辄止地介绍了这项技术,建议您进一步探索自己的 Pod、复制控制器和服务,同时还应了解活跃性探测(健康检查)并考虑直接使用 Kubernetes API。
清理
大功告成!现在该清理一下所用的资源了(以节省成本,践行良好的云资源管理实践)。
删除 Deployment(同时也会删除正在运行的 pod)和 Service(同时也会删除外部负载平衡器):
首先,删除服务和部署,这也会删除您的外部负载平衡器:
kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted deployment "hello-dotnet" deleted
接下来,删除集群:
gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted. - [hello-dotnet-cluster] in [europe-west1-b] Do you want to continue (Y/n)? Y Deleting cluster hello-dotnet-cluster...done. Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].
此命令会删除运行集群的所有 Google Compute Engine 实例。
最后,删除托管映像的 Docker 注册表存储分区:
gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
当然,您也可以删除整个项目,但这样会丢失您所做的所有结算设置(必须先停用项目结算)。此外,只有在当前结算周期结束后,删除项目才会停止所有结算。
所学内容
- 如何将简单的 ASP.NET Core 应用打包为 Docker 容器。
- 如何在 Google Kubernetes Engine 上创建 Kubernetes 集群。
- 如何将 ASP.NET Core 应用部署到 pod。
- 如何允许外部流量进入您的 pod。
- 如何扩容服务并发布升级。
- 如何运行 Kubernetes 图形信息中心。
后续步骤
- 详细了解 Kubernetes ( http://kubernetes.io/)。
- 详细了解 Google Cloud Platform 上的 Windows。
- 详细了解 Google Cloud Platform 上的 .NET。
- 详细了解 Google Cloud Platform 上的 SQL Server。
- 详细了解 Cloud Tools for Visual Studio。
- 详细了解 Cloud Tools for PowerShell。
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。