将 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 的过程中,您可以参考此图;当您完成此 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 方面的经验水平?

新手水平 中等水平 熟练水平

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.png

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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

再次利用 Cloud Shell 的网页预览功能:

2015-11-03 17:20:22 的屏幕截图.png

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

f42271880ce4d572.png

确认应用正在 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 可对其进行访问和编排(几分钟后您便会看到)。

576374602b52f4e4.png

如果您有兴趣,可以点击以下链接,浏览存储在 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 是一组容器,它们为了管理和联网而绑定在一起。它可以包含单个容器,也可以包含多个容器。在此处,您只需使用一个基于存储在私有容器注册表中的 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

6b053874002827fe.png

此时,您至少已从迁移到容器和 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.png

您还可以非常轻松地缩容服务。以下是将 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 中打开代码编辑器。

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 字段,您可以告知部署更新 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

在此过程中,服务的用户不应看到任何中断。过一段时间后,他们将开始访问应用的新版本。

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。最后,您应该会看到 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 中,引入了图形化 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

port8081.png

这应该会将您发送到 API 端点。您可能会看到“未经授权”页面,但不必担心。如需前往信息中心,请移除“?authuser=3”并将其替换为“/ui”。

尽情使用 Kubernetes 图形化信息中心,利用它部署容器化应用,以及监控和管理集群!

177789527b650f6b.png

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

da1ccc707dd6647.png

a51c7160e237f32f.png

完成信息中心操作后,您可以按 Control + C 停止代理。如需详细了解 Kubernetes 信息中心,请参阅信息中心导览

14. 日志记录

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

b63159b959ba5010.png

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

43e9aab3e02358d5.png

在此处,您可以选择将日志导出到 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 图形信息中心。

后续步骤

许可

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