1. 概览
ASP.NET Core 是一个全新的开源跨平台框架,可用于使用 C# 编程语言构建基于云的现代互联应用。
Kubernetes 是一个开源项目,可在从笔记本电脑到高可用性多节点集群、从公有云到本地部署以及从虚拟机到裸金属等众多不同环境中运行。
在本实验中,您将一个简单的 ASP.NET Core 应用部署到运行在 Kubernetes Engine 上的 Kubernetes。此 Codelab 基于使用 Google Cloud Shell 构建并启动 ASP.NET Core 应用 Codelab 构建而成。您可能需要先完成该实验,然后再尝试此实验。
此 Codelab 旨在帮助您将代码(此处为简单的 ASP.NET Core 版“Hello World”应用)转化为在 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。在本例中,新创建的 Deployment 管理着一个运行 hello-dotnet:v1 映像的 Pod 副本。
如需查看您刚刚创建的部署,只需运行以下命令:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-dotnet 1 1 1 1 37s
如需查看该 Deployment 创建的 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 来对其进行访问。为了使 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 的流量进行负载均衡(目前虽然只有 1 个 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
请注意,系统针对您的服务列出了两个 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. 发布服务升级
您部署到生产环境的应用,有时会需要进行 bug 修复或添加新功能。下面我们来看看具体的操作流程。
首先,我们来修改应用。从 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 命令。系统会打开一个文本编辑器,并在其中显示 Deployment 的完整 YAML 配置。目前,您无需彻底掌握整个 YAML 配置的每一个细节,只需知道:通过更新配置中的 spec.template.spec.containers.image 字段,您就是在指示该 Deployment 使用新的映像来更新所有 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 通用许可授权。