Fargate 是一种适用于容器的无服务器计算引擎,可与 Amazon ECS 和 Amazon EKS 配合使用。借助 AWS Fargate,我们可以在不管理服务器的情况下运行应用程序(官方信息页面)。
在本文中,我们将采用分步方法在 AWS Fargate Service 上部署和运行 .NET Core Web API 应用程序。
Fargate 的典型用例
Fargate 支持所有常见的容器用例,包括微服务架构应用程序、批处理、机器学习应用程序等。
应用
对于应用程序,我将使用 .NET Core Web API 应用程序。但是,如果您有用其他编程语言编写的 Java 应用程序或服务器应用程序,则大多数部署信息仍将适用。
下图显示了使用 Visual Studio 的 .NET Core Web API 应用程序。
创建项目后,我添加一个令牌控制器:
令牌控制器有一个简单的方法,如下所示:HTTPGet
现在,我们可以从 Visual Studio 运行应用程序。将显示以下 Swagger UI,我们可以看到令牌终结点并对其进行测试。
这是一个基本的 Web API,功能非常有限,但对于我们的演示目的来说是可以的。
Docker 支持
接下来,我已将 Dockerfile 添加到解决方案中,我们可以使用它在容器内本地运行应用程序,也可以使用它将映像发布到 Docker Hub。
下图显示了在本地计算机上的容器中运行的应用程序。
在本地运行并对其进行测试后,我们可以将映像保存到 Docker Hub 或 AWS Elastic Container Registry (ECR),以便我们可以在 AWS Fargate 中使用它来运行容器。
应用程序源代码在此 Git 存储库中提供。
我将使用 Docker Hub,但请根据您的要求随意选择 ECR。
下图显示了该映像可从 Docker Hub 获得。
此时,我们有一个 .NET Core Web API 应用程序,该应用程序打包为 Docker 映像,可在 Docker Hub 上使用。接下来,让我们使用 AWS Fargate 选择此映像来运行应用程序。
如前所述,Fargate 是一个用于容器的无服务器计算引擎。
AWS Fargate 条款
让我们熟悉一下有关 AWS Fargate 和容器服务的一些术语。
- Amazon ECS 集群是任务或服务的逻辑分组。我们可以使用集群来隔离我们的应用程序。这样,它们就不会使用相同的底层基础结构。当我们的任务在 Fargate 上运行时,该服务还会管理我们的集群资源。
- 要在 Amazon ECS 上部署应用程序,必须将我们的应用程序组件配置为在容器中运行。
- 任务定义是 JSON 格式的文本文件,用于描述构成应用程序的一个或多个容器。我们可以用它来描述最多 10 个容器。
- 任务是集群中任务定义的实例化。在 Amazon ECS 中为应用程序创建任务定义后,我们可以指定要在集群上运行的任务数。我们可以运行一个独立的任务,也可以将一个任务作为服务的一部分运行。
我们可以使用 Amazon ECS 服务在 Amazon ECS 集群中同时运行和维护所需数量的任务。
创建使用 Fargate 的 Amazon ECS 集群
登录 AWS Web 控制台,打开 Amazon ECS 控制面板,然后单击 Create Cluster 按钮。它将打开一个类似于以下内容的窗体。
下图显示了输入的集群名称和 AWS Fargate 作为所选基础设施:
单击窗体底部的 “创建群集”按钮,我们将为工作负载预配群集:Click the Create Cluster button on the bottom of the form, and we'll have a cluster provisioned for our workloads:
这就是设置集群所需的全部内容。
使用 Fargate 部署容器
首先,我们在 ECS Web 控制台上创建一个新的任务定义,如下所示。
提供以下信息:
对于基础结构部分,保留默认值:
对于容器部分,我输入了一些详细信息;例如,容器名称 (tokengen) 和映像 URI,它是映像在注册表中的位置(此处,它指向 Docker Hub 上的映像)。
我们还可以指定端口,在本例中为 5000。
保留其他默认值,然后单击 C reate。 这应该导致以下对创造的定义:
因此,创建了任务定义,但尚未运行容器。
现在,我们可以按如下方式创建服务。
选择定义,然后从 “部署”按钮创建服务,如下所示。
以下是创建服务的屏幕截图:
在这里,我为所需的任务选择了 3 个数字(这意味着它将运行 3 个 tokengenwebapi 容器)。
为了在三个实例之间分配流量,我们可以按如下方式设置负载均衡器:
我们可以为负载均衡器设置一个目标组来路由流量。对于运行状况检查,我们可以指定一个终结点,如下所示:
网络部分允许我们选择 VPC、子网和安全组,如下所示:
查看选项后,单击 “创建”。服务状态如下图所示:
很快,UI 将更新以反映任务状态。
下图显示所有 3 个任务都在运行:
我们可以检查 Fargate 的日志。
网络配置如下图所示:
负载均衡器设置了 DNS 名称,我们可以使用它来访问在容器中运行的应用程序。
如果要允许对应用程序进行公共访问,请确保将安全组设置为允许入站流量。
下图显示了通过浏览器访问的令牌终结点:
如果我刷新页面,我们可以看到颁发者信息,并且所有三个实例都在响应传入的 HTTP 请求。
CLI 命令
如果您设置了 AWS CLI,我们将使用 CLI 命令来检查和更新 Fargate 基础设施。
检索集群信息
aws ecs describe-clusters --cluster DevCluster
横向扩展 Amazon ECS 服务
当我们创建 Amazon ECS 服务时,它包含三个 Amazon ECS 任务副本。我们可以通过使用返回 3 的命令来看到这一点。describe-services
使用该命令将服务缩放到五个任务。重新运行该命令以查看更新的五个。update-service``describe-services
aws ecs describe-services --cluster DevCluster --services tokengensrv --query 'services[0].desiredCount'
aws ecs update-service --cluster DevCluster --service tokengensrv --desired-count 5
滚动更新
在测试期间,我更新了 Docker Hub 上的映像,并希望使用新的更新重新部署应用程序。一种方法是创建任务定义的修订版本,然后更新服务。
如您所见,所有三个容器都在运行,然后启动了新的修订活动。
几分钟后,我们可以看到所有三个任务都已更新并正在运行。这一切都是无缝发生的,我们没有任何努力,而且一直以来,Web API 应用程序都可用。
下图显示了使用负载均衡器 DNS 地址访问应用程序:
至此,我们将结束这篇文章。应用程序源代码在前面链接的 Git 存储库中可用。
总结
Fargate 是一种适用于容器的无服务器计算引擎,可与 Amazon Elastic Container Service 和 Amazon Elastic Kubernetes Service 配合使用。在这篇文章中,我们介绍了使用 AWS Fargate,我们可以在不管理服务器的情况下运行应用程序。我们看到了在高可用性环境中在 Fargate 上部署和运行 .NET Core Web API 应用程序的分步演示。它所需要的只是我们的应用程序的 Dockerfile,然后 Fargate 能够提取映像并从中运行应用程序。