65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Docker 和 Azure Kubernetes 服务容器化 ASP.NET Core 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (24投票s)

2019 年 7 月 22 日

CPOL

11分钟阅读

viewsIcon

36432

在本教程中,我们将创建一个简单的 ASP.NET Core Web 应用程序,使用 Docker 将其容器化,然后将其部署到 AKS 集群。

引言

曾经有一段单体软件应用的时代,整个应用程序被打包并部署在运行为单个进程的单台服务器上。我们都知道,在这种模型下,单个故障点可能会导致整个应用程序崩溃。

微服务架构应运而生,以解决这个问题以及单体应用程序的其他缺点。在容器中托管微服务可以解决部署和管理微服务应用程序的一些问题,而 Docker 等平台可以轻松地将应用程序打包成可移植的容器。Kubernetes 则负责编排容器化应用程序的部署和管理。

Kubernetes 是一个可以下载并在本地环境中部署的软件,但大多数云托管服务都提供内置的 Kubernetes 服务,可以帮助您在其环境中编排云托管的函数和微服务。在本文中,我们将演示如何使用 Docker 和 Microsoft 的 Azure Kubernetes 服务 (AKS) 在云中编排整个 ASP.NET Core 应用程序的部署和扩展。

应用程序概述

在本教程中,我们将创建一个简单的 ASP.NET Core Web 应用程序,使用 Docker 将其容器化,然后将其部署到 AKS 集群。应用程序的逻辑在这里无关紧要,我们只是为了有一个可以部署的应用程序,以说明在部署扩展时它在哪里运行。重点将放在创建容器和使用 Kubernetes 将应用程序部署到 AKS 集群。应用程序 Docker 化后,我们将创建一个本地镜像以在本地进行测试。

部署需要一个有效的 Azure 帐户,并且我们将使用开发计算机上的以下应用程序。

  • Git for Windows
  • .NET Core 2.1 或更高版本
  • Azure CLI
  • Azure PowerShell
  • Docker for Windows

安装并运行 Docker for Windows 后,进入设置并勾选 Kubernetes 复选框,如下所示

或者,Docker for Windows 应在 Linux 容器模式下运行,否则设置中将不会显示 Kubernetes 选项。

安装 Azure CLI 后,运行以下命令 (az --version),以确保 CLI 已启动并正在运行。

我创建了一个简单的 ASP.NET Core 应用程序,您可以从 https://github.com/akhilmittal/Azure-Kubernetes-Service 克隆或下载。

项目克隆或下载解压后,执行 dotnet run 命令,如下所示。这将运行服务器并告知服务器正在监听哪个端口,即 https://:5000。

打开浏览器并导航到提供的 URL,通常是 https://:5000。您会看到它只是一个简单的应用程序,显示应用程序正在运行的主机或容器。目前,它在没有容器的开发 Windows 计算机上运行,因此它显示主机名,在本例中为 3593BH2。

容器化 ASP.NET Core 应用程序

现在我们将使用 Docker 为 ASP.NET Core 应用程序创建容器。在提供的示例下载中,我已经完成了一些工作,因此我们不必经历创建容器的每一个步骤。

导航到应用程序目录的根目录,查看已创建的 Docker 文件。此 Docker 文件将用于构建镜像。

使用 docker build 命令构建运行时镜像,如下所示

docker build . -t aks:local

确保您位于包含 Docker 文件的目录中,然后运行命令。如果您不熟悉语法,点号表示 Docker 文件位于当前目录,-t 开关允许您指定标签 aks:local

这将启动构建过程。

构建完成后,运行 docker image list 命令。它会列出一个名为 aks:local 的全新镜像。

为了测试这个镜像,请使用 docker run 命令运行基于这个镜像的容器

docker run -d -p 5000:80 aks:local

-d 开关告诉 Docker 将其作为守护进程运行。-p 开关将主机上的 5000 端口映射到容器上的本地 80 端口。

执行命令 docker ps 查看容器是否正在运行。

现在打开浏览器并连接到 https://:5000

我们看到应用程序现在在 Docker 容器下运行,因为主机名现在显示的是容器的 ID。

通过运行以下命令删除新创建的测试容器

docker container rm -f [container name]

对于 [container name],请替换为您的浏览器中显示的容器 ID,或者通过运行 docker ps 命令获取。

在本地 Kubernetes 集群上部署

现在,我们将快速将应用程序部署到本地 Kubernetes 集群,以演示 Kubernetes 的手动编排方法。这将为与 AKS 的 Kubernetes 编排进行比较提供一个基准。

有两种方法可以将镜像部署到本地 Kubernetes 集群:交互式和声明式。

使用交互式方法时,您直接将所有 Kubernetes 部署和编排步骤作为带有参数的命令来指定。使用声明式方法时,您在 Kubernetes 部署清单文件中指定详细信息,并在运行 Kubernetes 时使用该清单作为参数。

让我们通过运行以下命令开始一个交互式示例

kubectl run aks-deployment --image=aks:local --port=80 --replicas=3

这里的关键选项是 --replicas,我们用它来指定应用程序需要三个副本。命令执行后,将创建一个部署,其中所需状态设置为三个副本。将创建一个副本集,以确保始终运行三个应用程序副本。

调度程序将 Pod 部署调度到工作节点,该节点会命令工作节点上运行的 Docker 引擎拉取镜像,然后在 Pod 中运行。

应用程序部署后,创建一个服务来公开此部署。

kubectl expose deployment aks-deployment --type=NodePort 

这将创建服务。通过运行 kubectl get servicekubectl get svc 来验证它。

要连接到服务,请启动浏览器并连接到 localhost,后跟节点上公开的端口号。现在我打开了三个浏览器并访问了同一个 URL。

我们看到容器主机名发生了变化。这是因为服务器后面有三个 Pod(或容器),服务正在向它们进行负载均衡请求。

使用 delete 命令删除部署和服务以进行清理。

kubectl delete deployment aks-deployment

同样,也请删除服务。

kubectl delete service aks-deployment

声明式方法使用保存在部署清单文件中的预配置选项。我在应用程序的根目录中包含了一个 YAML 清单文件:aksdeploy.yml

该文件有两个部分。第一部分指定如何创建部署。第二部分指定如何将其公开为服务。

打开文件并将副本数量 ("replicas:") 更改为 3,将镜像文件名 ("image:") 更改为 aks:local

以下命令将使用 aksdeploy.yml 中的配置创建部署和服务。

kubectl create -f .\aksdeploy.yml

使用 kubectl get svc 检查服务状态,然后启动浏览器连接到该服务。您应该会看到与之前的交互式演示相同的结果,请求分布在可用副本之间。

再次删除部署和服务,但这次通过指定文件名。

kubectl delete -f .\aksdeploy.yml

Docker 镜像和 Azure 容器注册表 (ACR)

用户容器的关键部分是有一个可用的注册表。在本例中,我们将把应用程序的 Docker 镜像推送到 Azure 容器注册表

我们将使用 Azure CLI。使用 az login 命令登录到 Azure。

创建一个资源组,名称为 aksgroup,位置为 australiaeast。(您可以根据需要使用自己的位置。)

az group create -n aksgroup -l australiaeast

现在创建一个容器注册表条目,名称为 learningaksacr,资源组为 aksgroup,位置为 australiaeast(或您偏好的位置),skustandard

az acr create -n learningaksacr -g aksgroup --sku standard

创建容器注册表后,需要推送镜像。首先,登录。

az acr login -n learningaksacr

成功登录后,在推送之前,用容器注册表的登录服务器名称标记本地镜像。

az acr list -o table

复制登录服务器名称并妥善保管。要列出此计算机上可用的 Docker 镜像,我们可以使用 docker image list 命令。我们有 aks:local 镜像,需要使用登录服务器名称对其进行标记。

现在,运行 docker tag 命令。指定本地镜像名称,新名称(将是登录服务器名称),以及镜像名称和标签。

docker tag aks:local learningaksacr.azurecr.io/aks/v1

使用 docker image list 命令进行验证,我们看到已成功标记的镜像。本地镜像和标记的镜像共享相同的镜像 ID。

现在使用 docker push 命令将标记的镜像推送到注册表。

docker push learningaksacr.azurecr.io/aks/v1:latest

现在,任何其他 Docker 计算机都可以使用或访问此镜像,AKS 集群可以轻松地从注册表中拉取此镜像。

部署 Azure Kubernetes 服务 (AKS) 集群

我们已经在本地部署了 Kubernetes 集群,现在是时候使用 AKS 部署到 Azure 了。使用 AKS,可以轻松地配置生产级的 Kubernetes 集群。

继续之前,创建一个服务主体,将应用程序注册到 Azure Active Directory (AD),并为其创建身份。如果应用程序要向其他 Azure 服务公开自己,则需要注册的 ID。

使用 Azure CLI 和以下命令创建服务主体

az ad sp create-for-rbac --skip-assignment

创建后,您将获得服务主体的 appIDdisplayNameURLpassword 和 tenant 属性。请妥善保管这些信息以备将来参考。

现在授予服务主体从 ACR 拉取镜像的权限。我在这里使用了 PowerShell 窗口。

使用 az acr show 命令获取 ACR 资源 ID ($acrId)。

az acr show --name learningaksacr --resource-group aksgroup --query "id"

然后使用 az role assignment create 命令授予 AKS 集群读取器角色,以便它可以读取 ACR 中存储的镜像。

az role assignment create --assignee [appID] --role Reader -- scope $acrId

使用为服务主体提供的 appID,并将范围设置为从 az acr show 命令获取的 ACR 的资源 ID。

现在使用 az aks create 命令创建我们的 AKS 集群。提供一个名称和资源组。对于 node-count,将其设置为一个工作节点。使用 generate-ssh-keys 生成 SSH 公钥(和私钥)文件。指定 service-principalclient-secret,即之前复制的应用程序 ID 和密码。运行命令。

az aks create `
>> --name learningakscluster `
>> --resource-group aksgroup
>> -- node-count 1 `
>> --generate-ssh-keys `
>> --service-principal [appID] `
>> --client-secret [password]

部署完成后,并且要从客户端计算机连接到我们的 AKS 集群,请使用 kubectl 命令行界面。

用户位置显示的 .kube 文件包含服务器设置为端口 6445 上运行的本地服务器。

使用 az aks get-credentials 命令获取我们刚刚部署的 AKS 集群的凭据,指定集群名称和资源组名称。

现在,返回到 .kube\config,并注意服务器现在反映了正在 Azure 中运行的 AKS 集群。为了验证,请执行 kubectl get nodes 命令。我们可以看到一个工作节点,确认了我们的 AKS 集群已成功配置。

将 ASP.NET Core 应用程序部署到 AKS

集群已准备好应用程序进行部署。打开我们之前在应用程序根目录中看到的 aksdeploy.yml 文件。

目前,镜像引用的是本地 Docker 镜像。让我们将其更改为引用我们推送到 Azure 容器注册表的镜像。将 "image:" 属性从 aks:local 更改为服务器上的镜像名称和标签:learningaksacr.azurecr.io/aks/v1:latest

早些时候,我们将此应用程序部署到本地集群,并将服务类型设置为 NodePort。现在我们将它们部署到云服务(如 Azure)中,我们可以将 "type:" 属性更改为 LoadBalancer

保存文件,然后使用 kubectl apply 命令进行部署。

kubectl apply -f .\aksdeploy.yml

这将创建定义的 Kubernetes 对象,包括部署和服务。创建的服务将应用程序公开到互联网。

要监视部署进度,请使用 kubectl get service 命令并带上 --watch 参数。最初,aks 部署服务的外部 IP 会显示为“pending”。一旦外部 IP 从 pending 变为一个 IP 地址,就复制该 IP。

要测试您的应用程序,请浏览到外部 IP 地址。

我们可以看到我们的应用程序正在 AKS 集群中的工作节点上运行。

结论

现在您应该了解如何容器化 ASP.NET Core 应用程序(或任何类似的微服务应用程序)并将其部署到 Azure Kubernetes 服务。我们还在文章中探讨了 Azure 容器注册表的作用。

虽然我们绕道演示了在本地系统的部署,但希望这能说明通过清单进行交互式或声明式配置来扩展 Kubernetes 部署是多么容易。

要了解有关通过 Azure Kubernetes 服务使用 Kubernetes 的更多信息,请从 Microsoft Azure 文档中的 Azure Kubernetes 服务 (AKS) 入门 开始。阅读本文后,您应该已经熟悉其中的一些步骤,但文档将引导您完成其他选项和场景。

所有 Azure 服务都与成本相关。请确保您谨慎使用它们,如果不再需要,请关闭或清除它们。

历史

  • 2019 年 7 月 22 日:初始版本
© . All rights reserved.