将 ASP.NET Core 应用部署到 Google Kubernetes Engine 上的 Kubernetes

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 的过程中,可以参考以下资源;看看结尾都应该没有问题(但您可以暂时先忽略这些)。

7dbdc973aceef1af.jpeg

在此 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 使用体验?

<ph type="x-smartling-placeholder"></ph> 新手 中级 熟练

2. 设置和要求

自定进度的环境设置

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.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 USD 免费试用计划的条件。

启动 Cloud Shell

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

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shell853e55310c205094

55efc1aaa7a4d3ad.png

如果您以前从未启动过 Cloud Shell,系统会显示一个中间屏幕(非首屏)来介绍 Cloud Shell。如果是这种情况,请点击继续(此后您将不会再看到此通知)。一次性屏幕如下所示:

9c92662c6a846a5c

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

9f0e51b578fecce5

这个虚拟机装有您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:

  1. 在 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`
  1. 在 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 上预览”。

Capture.PNG

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

f42271880ce4d572.png

确认应用正在运行后,按 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

再次充分利用 CloudShell 的网页预览功能:

2015 年 11 月 3 日 17:20:22 的屏幕截图.png

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

f42271880ce4d572.png

确认应用可在 Docker 容器本地正常运行后,您可以通过 Ctrl-> C 停止正在运行的容器。

现在映像按预期运行,接下来您可以将它推送到 Google Container Registry,这是一个私有代码库,用于存储 Docker 映像,该代码库可从每个 Google Cloud 项目(以及从 Google Cloud Platform 外部访问)进行访问:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

如果一切进展顺利,一段时间后,您应该能够看到 Container Registry 部分中列出的容器映像。此时,您已经有一个项目范围的 Docker 映像可用,Kubernetes 可以访问和编排该映像,几分钟后您就会看到。

576374602b52f4e4

如果您想浏览存储在 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 部分,等待系统初始化(应该只需要几秒钟)。

d5f6e3c267feea1a.png

集群由 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 集群:

eefb8d9b7f39598b.png

现在是时候将您自己的容器化应用部署到 Kubernetes 集群了!从现在开始,您将使用 kubectl 命令行(已在 Cloud Shell 环境中设置)。此 Codelab 的其余部分要求 Kubernetes 客户端和服务器版本均为 1.2 或更高版本。kubectl version 将显示该命令的当前版本。

7. 创建部署

kubernetes pod 是一组用于管理和联网的容器。它可以包含一个容器或多个容器。在这里,您只需使用通过存储在私有 Container Registry 中的 ASP.NET Core 映像构建的容器。它将在端口 8080 上传送内容。

使用您喜爱的编辑器(vim, nano,emacs 或 Cloud Shell 的代码编辑器)创建一个 hello-dotnet.yaml 文件,然后为该 Pod 定义 Kubernetes Deployment:

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 副本。

要查看您刚刚创建的 Deployment,只需运行以下命令:

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

请注意,系统针对您的服务列出了 2 个 IP 地址,它们都服务于端口 8080。一个是仅在您的云虚拟网络内可见的内部 IP;另一个是外部负载均衡的 IP在此示例中,外部 IP 地址为 104.155.20.69

现在,通过将浏览器指向以下网址,您应该就可以访问该服务:http://<EXTERNAL_IP>:8080

6b053874002827fe

至此,您已通过迁移到容器和 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 集群的状态:

6af0243662464ca9

您还可以非常轻松地缩减服务规模。下面展示了如何从 4 个 Pod 缩容为 2 个 Pod。

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 打开代码编辑器。

f487389b8b1cc105.png

前往 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 字段,即可告知 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

这会使用新映像更新 Deployment,从而使用新映像创建新 Pod,并删除旧 Pod。

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

在此过程中,服务的用户应该不会看到任何中断。稍等片刻后就会开始访问新版应用。

fb9f41e814dda653.png

如需详细了解滚动更新,请参阅 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

f8b0239fa7719f29.png

点击启用 API(如果尚未启用)。最后,您应该会看到 API 的启用情况,如下所示:

ea6053f9603613b5.png

启用 Cloud Build API 后,您可以运行以下命令,通过 Container Builder 服务构建和推送您的映像:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

映像会自动存储在 Container Registry 中。

13. 运行 Kubernetes 图形信息中心

最新版本的 Kubernetes 中引入了图形网页界面(信息中心)。此界面可让您快速上手,并实现了 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

port8081.png

这应该会将您转到 API 端点。您可能会收到“未经授权”错误消息但不用担心要进入信息中心,请移除“?authuser=3”并将其替换为“/ui”。

您可以使用 Kubernetes 图形信息中心来部署容器化应用,以及监控和管理集群!

177789527b650f6b

或者,您也可以使用与在 Web 控制台中按“Connect”(连接)按钮类似的说明,从开发机器或本地机器访问信息中心按钮。

da1ccc707dd6647.png

a51c7160e237f32f.png

使用完信息中心后,您可以按 Ctrl + C 停止代理。如需详细了解 Kubernetes 信息中心,请观看信息中心导览

14. 日志记录

您可以使用 kubectl logs 命令检索在 Kubernetes 中运行的容器的日志。当您使用 Google Kubernetes Engine 运行代管式 Kubernetes 集群时,所有日志都会自动转发并存储在 Google Cloud Logging 中。您可以在 Google Cloud 控制台中导航到 StackdriverLogging → 日志,以查看 Pod 中的所有日志输出:

b63159b959ba5010.png

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

43e9aab3e02358d5

在这里,您可以选择将日志导出到 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 Registry 存储分区:

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 图形信息中心。

后续步骤

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。