用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序
介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上。我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃。 微服务体系结构的发展是为了解决单片应用程序的这个缺点和其他缺点。在容器中托管微服务解决了部署和管理基于微服务的应用程序的一些问题,而像Docker这样的平台使得在可移植的容器中打包应用程序变得很容易。Kubernetes协调了容器化应用程序的部署和管理。 Kubernetes是可以下载并部署到本地环境中的软件,但大多数云托管服务都提供内置的Kubernetes服务,帮助您在其环境中协调云托管功能和微服务。在本文中,我们将演示如何编排整个ASP的部署和扩展。NET Core应用在云端使用Docker和微软的Azure Kubernetes服务(AKS)。 应用程序概述 在本教程中,我们将创建一个简单的ASP。NET Core web应用程序,用Docker封装,然后部署到一个AKS集群。应用程序的逻辑在这里并不重要,因为我们将使用它来部署应用程序,以便在扩展部署时说明应用程序在何处运行。相反,重点是创建容器并使用Kubernetes将应用程序部署到一个AKS集群。当应用程序被dockerized时,我们将创建应用程序的本地映像以在本地进行测试。 您需要一个有效的Azure帐户来进行部署,我们将在开发机器上使用以下应用程序。 针对Windows。net Core 2.1或以上版本的azure cli azure powershell docker 当Windows的Docker安装并运行后,转到设置并启用Kubernetes的复选框,如下所示: 或者,Windows的Docker应该在Linux容器模式下运行,否则,Kubernetes选项将不会显示在设置中。 在Azure CLI安装之后,运行以下命令(az——version)以确保CLI已启动并运行。 我创建了一个简单的ASP。NET Core应用程序,可以克隆或从https://github.com/akhilmittal/az-kubernetes-service下载。 在克隆或下载并解压缩项目之后,执行dotnet run命令,如下所示。这将运行服务器,并告诉服务器在哪个端口监听应用程序。http://localhost: 5000。 打开浏览器并导航到所提供的URL,通常是http://localhost:5000。您将看到,它只是一个简单的应用程序,显示运行该应用程序的主机或容器。目前,它运行在没有容器的开发windows机器上,因此它显示主机机器的名称,在本例中为3593BH2。 用集装箱装ASP。网络核心应用程序 现在我们将使用Docker为ASP创建一个容器。网络核心应用程序。我已经在示例下载中完成了一些工作,因此我们不必遍历创建容器的每个步骤。 导航到应用程序目录的根目录,查看已经创建的Docker文件。这个Docker文件将用于构建映像。 使用docker build命令构建运行时镜像,如下所示: 隐藏,复制Code
docker build . -t aks:local
确保您在包含Docker文件的目录中,然后运行该命令。如果您不熟悉语法,点表示Docker文件位于当前目录,-t开关允许您指定标记aks:local。 这将启动构建过程。 构建完成后,运行docker映像列表命令。它列出了一个名为aks:local的全新形象。 要测试此图像,请使用docker run命令运行基于此图像的容器: 隐藏,复制Code
docker run -d -p 5000:80 aks:local
d开关告诉Docker将其作为守护进程运行。p开关将主机上的端口5000映射到容器上的本地端口80。 执行docker ps命令来查看容器的启动和运行情况。 现在转到浏览器并连接到http://localhost:5000。 我们看到应用程序现在在docker容器下运行,因为主机名现在显示了容器的ID。 通过运行以下命令删除新创建的测试容器: 隐藏,复制Code
docker container rm -f [container name]
对于[容器名称],替换在浏览器中显示的容器的ID,或者运行docker ps命令。 在本地Kubernetes集群上部署 现在,我们将快速地将应用程序部署到本地Kubernetes集群,以演示使用Kubernetes手动编排的方法。这将提供一个基线,以比较Kubernetes编配与AKS。 在本地Kubernetes集群上部署映像有两种方法:交互式和声明式。 当使用互动应用程序roach,您可以将Kubernetes的所有部署和编排步骤直接指定为带参数的命令。使用声明式方法,可以在Kubernetes部署清单文件中指定详细信息,并在运行Kubernetes时使用该清单作为参数。 让我们从一个交互式示例开始,运行下面的命令: 隐藏,复制Code
kubectl run aks-deployment --image=aks:local --port=80 --replicas=3
这里的关键选项是——replicas,我们使用它来指定应用程序需要三个副本。当执行命令时,将创建一个部署,其中所需的状态设置为三个副本。创建一个副本集,以确保应用程序始终有三个副本在运行。 调度器在工作节点上调度pod部署,这将命令在工作节点上运行的Docker引擎拉出映像,然后在pods中运行。 部署应用程序后,创建一个服务来公开此部署。 隐藏,复制Code
kubectl expose deployment aks-deployment --type=NodePort
这将创建服务。通过运行kubectl get服务或kubectl get svc来验证它。 要连接到服务,启动浏览器并连接到本地主机,然后连接到节点上公开的端口号。现在我打开了三个浏览器并点击了相同的URL。 我们看到容器主机名发生了变化。这是因为在服务器后面,有三个pods或容器,服务负责向它们平衡请求的负载。 使用delete命令删除部署和服务,从而清理它们。 隐藏,复制Code
kubectl delete deployment aks-deployment
同样,也要删除该服务。 隐藏,复制Code
kubectl delete service aks-deployment
声明式方法使用保存在部署清单文件中的预配置选项。我在应用程序的根目录中包含了一个YAML清单文件:aksdeploy.yml。 该文件有两个部分。第一个指定如何创建部署。第二个指定如何将其公开为服务。 打开文件,将副本数("replicas:")改为3,图像文件名("image:")改为aks:local。 下面的命令使用aksdeploy.yml中的配置创建部署和服务。 隐藏,复制Code
kubectl create -f .\aksdeploy.yml
使用kubectl get svc检查服务的状态,然后启动浏览器连接到服务。您应该看到与前面的交互式演示相同的结果,请求分布在可用的副本上。 同样,删除部署和服务,但这一次通过指定文件名。 隐藏,复制Code
kubectl delete -f .\aksdeploy.yml
Docker镜像和Azure容器注册表(ACR) 用户容器的一个关键部分是让它们在注册表中随时可用。在本例中,我们将把应用程序的Docker图像推送到Azure容器注册中心。 我们将使用Azure CLI。使用az登录命令登录到Azure。 创建一个资源组,名称为aksgroup,位置为australiaeast。(你可以使用你自己的位置。) 隐藏,复制Code
az group create -n aksgroup -l australiaeast
现在创建一个容器注册项,名称为learningaksacr,资源组为aksgroup,位置为australiaeast(或您首选的位置),sku为标准。 隐藏,复制Code
az acr create -n learningaksacr -g aksgroup --sku standard
创建容器注册表后,需要推入映像。首先,登录。 隐藏,复制Code
az acr login -n learningaksacr
成功登录之后,在推入之前,用容器注册中心的登录服务器名标记本地映像。 隐藏,复制Code
az acr list -o table
复制登录服务器名并保持方便。要列出这台机器上可用的Docker镜像,可以使用Docker镜像列表命令。我们有aks:local映像,需要使用登录服务器名对其进行标记。 现在,运行docker tag命令。指定本地图像名称、新名称(将是登录服务器名称)、图像名称和标记。 隐藏,复制Code
docker tag aks:local learningaksacr.azurecr.io/aks/v1
通过docker图像列表命令验证这一点,我们会看到成功标记的图像。本地和标记的图像共享相同的图像ID。 现在使用docker push命令将标记的图像推送到注册表。 隐藏,复制Code
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使用以下命令创建一个服务主体: 隐藏,复制Code
az ad sp create-for-rbac --skip-assignment
创建之后,您将获得服务主体的appID、displayName、URL、密码和租户属性。保留这些信息以备以后参考。 现在将权限授予服务主体来拉取im从ACR开始。我在这里使用PowerShell窗口。 使用az ACR show命令获取ACR资源ID ($acrId)。 隐藏,复制Code
az acr show --name learningaksacr --resource-group aksgroup --query "id"
然后将读取器角色授予AKS集群,以便它可以使用az角色分配创建命令读取存储在ACR中的映像。 隐藏,复制Code
az role assignment create --assignee [appID] --role Reader -- scope $acrId
使用为服务主体提供的appID,范围被设置为ACR的资源ID,该资源ID是从az ACR show命令获取的。 现在使用az AKS create命令创建我们的AKS集群。提供名称和资源组。对于节点数,将其设置为单个工作节点。使用generate- SSH -keys来生成SSH公共(和私有)密钥文件。指定服务主体和客户端秘密,即之前复制的应用程序ID和密码。运行该命令。 隐藏,复制Code
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\配置,注意服务器现在反映了在Azure中运行的AKS集群。要进行验证,请执行kubectl get nodes命令。我们可以看到单个节点工作人员确认了我们的AKS集群的成功配置。 部署的ASP。NET Core应用到AKS 集群已经设置好,应用程序现在可以部署到集群中。打开aksdeploy。我们前面在应用程序的根目录中看到的yml文件。 当前,该映像引用了一个本地Docker映像。让我们改变它来引用我们推送到Azure容器注册中心的图像。代替指向aks:local的“image:”属性,将其更改为服务器上的图像名称,标记为:learningaksacr.azurecr.io/aks/v1:latest。 之前,我们将此应用程序部署到本地集群,并使用服务类型作为NodePort。现在我们正在将它们部署到Azure这样的云服务中,我们可以将“type:”属性更改为LoadBalancer。 保存文件,然后使用kubectl apply命令进行部署。 隐藏,复制Code
kubectl apply -f .\aksdeploy.yml
这将创建定义的Kubernetes对象,其中包括部署和服务。创建的服务将应用程序公开到internet。 要监视部署的进度,使用kubectl get服务命令和——watch参数。最初,aks部署服务的外部IP显示为挂起。一旦外部IP从挂起更改为IP地址,就复制该IP。 要测试应用程序,请浏览到外部IP地址。 我们可以看到我们的应用程序在一个AKS集群的工作节点上运行。 结论 现在您应该了解了如何封装和部署ASP。NET Core应用程序——或任何类似的微服务应用程序——到Azure Kubernetes服务。在本文中,我们还探讨了Azure容器注册中心的作用。 虽然我们绕道演示了在本地系统上的部署,但这很可能说明了扩展Kubernetes部署是多么容易,无论是交互式的还是通过清单的声明性配置。 要了解更多关于通过Azure Kubernetes服务使用Kubernetes的信息,请从Microsoft Azure文档中对Azure Kubernetes服务(AKS)的介绍开始。阅读本文后,您应该熟悉其中的一些步骤,但是文档将带您了解其他选项和场景。 所有Azure服务都与成本相关。确保你勤奋地使用这些工具,如果不需要,就关掉或清除它们。 历史 2019年7月22日:初版 本文转载于:http://www.diyabc.com/frontweb/news19221.html
最新文章
- Nginx配置文件(nginx.conf)配置详解(2)
- Karma:2. 集成 Karma 和 mocha 进行单元测试
- AVL树(三)之 Java的实现
- [css] 认识margin
- swift与OC混编高级教程之混编框架的创建和调用
- STM32的串口
- iOS开发:iOS的整体架构以及API介绍
- jQuery点击图片弹出大图遮罩层
- 最小生成树(kruskal模版 模板)
- C++ Code_combobox
- i2c sub system __i2c_board_list/klist_devices/klist_drivers
- boost::signals::signal的使用方法
- [SOJ] can I post the letter?
- .net core 2.1 Razor 超快速入门
- vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)
- Android后台监控指定app的输入内容,抢红包,模拟点击原理
- 自适应Simpson法与积分初步
- 延迟初始化Lazy
- Mac git 终端使用
- Anaconda 科学计算环境与包的管理