一、背景
EFS文件系统可以提供可靠的、持续的文件系统给多种服务,这其中也包括ECS容器服务。在容器场景上使用EFS的主要优势是可以简化管理,借助托管服务快速部署无须复杂运维,让ECS容器镜像的构建只需要关心应用程序本身,不需要将配置文件、数据文件打包到容器中。由此可实现容器的运行时和数据的分离。ECS Fargate和Fargate Spot都支持使用EFS文件系统,其中在Fargate Spot服务上搭配EFS,更可以借助EFS的持久化,避免Spot中断时候的数据持久保存问题。
在ECS服务的容器中使用EFS文件系统,无须事先为ECS容器镜像安装任何软件包,以支持NFS协议的Amazon Linux 2和Ubuntu作为容器镜像的基础版本即可。
本文在ECS Fargate和ECS Fargate spot上测试通过,在AWS中国区有效。
二、EFS创建和使用
正常创建一个EFS,并使用EC2验证EFS可正常访问和挂载。关于EFS的创建和使用,可参考这篇文章。
如下截图。
通过EC2验证EFS挂载正常,即可开始下一步ECS服务的配置。
三、ECS服务使用EFS
1、正常启动ECS集群和任务
正常启动过一个ECS集群和任务。此步骤的意义是,验证集群、任务和服务配置正确,避免ECS服务本身配置错误导致调试EFS时候排除故障的复杂度增加。如下截图。
2、容器定义修改
接下来修改上一步已经运行成功的容器任务定义配置文件。进入EFS服务,找到之前配置好的任务定义,例如当前任务定义的版本是2
,点击创建新修订(Create new revision)
。如下截图。
在创建新版容器服务的界面,将页面向下滚动到最下方,在卷菜单下,点击添加卷(Add volume)
链接。如下截图。
在弹出的对话框内,进行如下配置:
- 配置的卷名称(友好化名称,注意这不是挂载目录名)
- 从下拉框选择卷类型是
EFS
- 然后选择EFS的文件系统ID(自动显示本Region内存在的多个EFS文件系统)
- Access point ID功能如果事先没有在EFS上配置,那么这里默认是
None
,不需要调整即可正常访问 - 在
根目录(Root directory)
这里,输入EFS上的存储卷名称,在本文的例子中,EFS文件系统上的根目录有多个文件和子目录,其中wwwroot
子目录下有index.php
文件会稍后用于ECS服务的web服务使用。 - 其他参数保持默认即可。
最后点击添加按钮。如下截图。
添加完毕后,弹出窗口消失,任务配置界面的卷位置可以显示EFS信息了。如下截图。
接下来进一步操作,向上滚动页面,来到容器镜像配置位置。找到之前的容器镜像定义,点击编辑现有配置。如下截图。
找到存储和日志配置菜单位置,在挂载点(Mount points)
菜单上,默认是None
,点击下拉框,选择上一步配置的EFS服务。如下截图。
从下拉框中选择上一步配置的EFS服务的友好名称,然后在下方挂载路径位置输入/var/www/html
表示在容器内EFS将会挂载到这个目录。这个目录是Apache服务的默认的web目录。也就是会将EFS上指定的/wwwroot
目录作为容器中的/var/www/html
目录。配置完成后点击Update
按钮。如下截图。
修改容器定义完成后,页面返回到更新任务定义的界面,点击右下角的创建按钮,将会创建一个新版本的容器定义。如下截图。
创建新版本成功。任务定义版本从版本2
来到了版本3
。如下截图。
至此更新容器任务定义完成。
3、启动新任务
进入到ECS集群界面,查看现有运行的服务(Service),可以看到右下角显示的任务定义是版本2
,接下来我们要将其修改为版本3
,也就是配置了挂载EFS存储目录的版本。选中这当前服务,然后点击Update
更新按钮。如下截图。
进入编辑服务界面,将任务定义版本从2
升级到3
,然后选中强制新的部署(Force new deployment)
。本页面其他设置不需要调整,将鼠标移动到最下方,点击下一步。如下截图。
接下来修改服务定义向导的后三个步骤,都保持默认值,不需要再修改。一路确定,启动新的任务。
启动新的任务完成,页面显示如下。如下截图。
现在进入服务的部署(Deployments)
标签页,可以看到新发布的两个新版本任务。如下截图。
进入任务界面,查看本服务包含的任务(容器),可以看到之前有两个使用任务定义版本2
的服务,现在又新建了两个任务版本定义版本3
的任务,且启动成功。如下截图。
现在通过ECS关联的ALB,测试下对外访问,即可发现容器的/var/www/html
目录下暴露的文件就是EFS存储上/wwwroot
路径下的文件了。
但ALB的健康检查验证新版本任务发布成功后,旧版本会在几分钟后自动从ALB注销,并且被ECS自动删除。因此不需要人工干预ECS的任务。
4、通过ECS Exec和Session Manager登陆到容器内验证
在别的文章中介绍过,通过ECS Exec和Session Manager登陆可到容器内验证,请参考这篇文章。现在使用这个特性,登陆到容器内确认下目录挂载正常。
使用ECS Exec和Session Manager登陆到容器内之后,查看挂载点/var/www/html
目录其中的内容,可确认与EFS存储的/wwwroot
路径内的文件内容一致。如下截图。
为了进一步确认容器内的/var/www/html
路径是来自EFS挂载点,可在容器内执行mount
命令,然后查看输出结果,即可看到这个目录是EFS上的/www/root
挂载到容器上的。如下截图。
至此ECS服务使用EFS文件系统配置完成。
四、参考文档
官网文档:
https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/tutorial-efs-volumes.html
知识库:
https://aws.amazon.com/cn/premiumsupport/knowledge-center/ecs-fargate-mount-efs-containers-tasks/
全文完。