目录
介绍
应用概述
容器化核心应用程序
部署在本地Kubernetes集群上
Docker镜像和Azure容器注册表(ACR)
部署Azure Kubernetes服务(AKS)群集
将核心应用程序部署到AKS
结论
介绍
有一个单体软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上。众所周知,使用此模型,单点故障可能会导致整个应用程序崩溃。
微服务架构发展到解决单体应用程序的这一缺点和其他缺点。在容器中托管微服务解决了部署和管理基于微服务的应用程序的一些问题,而像Docker这样的平台可以轻松地将应用程序打包到便携式容器中。Kubernetes协调了容器化应用程序的部署和管理。
Kubernetes是您可以在本地环境中下载和部署的软件,但大多数云托管服务提供内置的Kubernetes服务,可帮助您在其环境中协调云托管功能和微服务。在本文中,我们将演示如何使用Docker和Microsoft的Azure Kubernetes Services(AKS)协调在云中部署和扩展整个 Core应用程序。
应用概述
在本教程中,我们将创建一个简单的 Core Web应用程序,将其与Docker一起容器化,然后将其部署到AKS集群。应用程序的逻辑在这里并不重要,因为我们只是为了部署应用程序而使用它,这可以说明在部署扩展时它运行的位置。重点是创建容器并使用Kubernetes将应用程序部署到AKS集群。当应用程序停靠时,我们将创建应用程序的本地镜像以在本地进行测试。
您需要有效的Azure帐户才能进行部署,我们将在开发计算机上使用以下应用程序。
Git for Core 2.1或更高版本Azure CLIAzure PowerShell适用于Windows的Docker
安装并运行Docker for Windows后,转到设置并启用Kubernetes复选框,如下所示:
或者,Docker for Windows应该在Linux容器模式下运行,否则,Kubernetes选项将不会显示在设置中。
安装Azure CLI后,运行以下命令(az --version)以确保CLI已启动并正在运行。
我创建了一个简单的 Core应用程序,您可以从/akhilmittal/Azure-Kubernetes-Service克隆或下载。
项目克隆或下载并解压缩后,执行dotnet run如下所示的命令。这将运行服务器并告诉服务器正在侦听应用程序的端口,即http://localhost:5000。
打开浏览器并导航到提供的URL,通常为http://localhost:5000。您将看到它只是一个简单的应用程序,显示运行应用程序的主机或容器。目前,它在没有容器的开发Windows机器上运行,因此它显示了主机的名称,在本例中为3593BH2。
容器化核心应用程序
现在我们将使用Docker为 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以查看容器的运行情况。
现在转到浏览器并连接到http://localhost:5000。
我们看到应用程序现在在docker容器下运行,因为主机名现在显示为容器的ID。
运行以下命令删除新创建的测试容器:
docker container rm -f [container name]
对于[容器名称],请替换浏览器中显示的容器ID或运行该docker ps命令。
部署在本地Kubernetes集群上
现在,我们将快速的将应用程序部署到本地Kubernetes集群上,以说明使用Kubernetes进行编排的手动方法。这将提供与Kubernetes编排与AKS进行比较的基线。
在本地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 service或kubectl get svc验证它。
要连接到该服务,请启动浏览器并连接到localhost,然后连接节点上公开的端口号。现在我打开了三个浏览器并点击了同一个URL。
我们看到容器主机名发生了变化。这是因为服务器后面有三个pod或容器,服务负载平衡请求。
通过使用delete命令删除部署和服务来清理它们。
kubectl delete deployment aks-deployment
同样,delete服务也是如此。
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(或您的首选位置)和sku为standard。
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
一旦创建,你得到的appID,displayName,URL,password,和租户性质的服务主体。保留此信息以供日后参考。
现在授予服务主体权限以从ACR中提取镜像。我在这里使用PowerShell窗口。
使用该az acr show命令获取ACR资源ID($acrId)。
az acr show --name learningaksacr --resource-group aksgroup --query "id"
然后将读者角色授予AKS群集,以便它可以使用az role assignment create命令读取存储在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-principal和client-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集群。
将核心应用程序部署到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对象,其中包括部署和服务。创建的服务将应用程序公开给Internet。
要监视部署的进度,请使用带--watch参数的kubectl get service命令。最初,aks部署服务的外部IP显示为挂起。一旦外部IP从挂起更改为IP地址,请复制IP。
要测试您的应用程序,请浏览到外部IP地址。
我们可以看到我们的应用程序在AKS集群中的工作节点上运行。
结论
现在,您应该了解如何将核心应用程序或任何类似的微服务应用程序容器化和部署到Azure Kubernetes服务。我们还在文章中探讨了Azure容器注册表的作用。
虽然我们绕道而行展示了在本地系统上的部署,但希望这表明通过交互式或通过清单的声明性配置来扩展Kubernetes部署是多么容易。
要了解有关通过Azure Kubernetes Services使用Kubernetes的更多信息,请从Microsoft Azure文档中的Azure Kubernetes Services(AKS)简介开始。阅读本文后,您应该熟悉一些步骤,但文档将引导您完成其他选项和方案。