我正在使用CDK部署一个EC2实例,该实例将在单节点docker集群中运行应用程序。这不适用于关键的生产工作负载,主要用于运行辅助项目和试验。在大多数情况下,它运行得很好,我可以通过互联网访问我的应用程序。
这是我的问题:当我重新部署应用程序时,它会替换EC2实例,并且所有数据都会丢失,因为它使用实例的根卷来存储数据。我现在正试图将EBS卷装载到实例,并在装载的EBS卷上装载docker卷,以便在堆栈更新之间保持数据。以下是我正在为更多上下文开发的应用程序的一些信息:
我在docker swarm中部署的堆栈有以下服务:
- traefik
- nginx
- django
- 芹菜
- 后gres
- redis
我想在traefik、postgres和redis上装载一个EBS卷,并且可能只对所有三个服务使用相同的卷以保持简单。
我一直在这里查看EBS的文档:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-using-volumes.html
我想我需要在我的UserData
脚本中做这样的事情:
# mount the EBS volume
sudo mkdir /data # make a directory on the EC2 machine
sudo mkfs -t xfs /dev/sda1 # create an xfs file system on /dev/sda1
sudo mount /dev/sda1 /data # mount the volume on the directory that was created
我认为这接近我所需要的,但它在每次启动或替换EC2实例时都会格式化卷的数据。
我应该使用fstab吗?我正试图将此添加到我的UserData
脚本中:
sudo mkdir /data
echo "/dev/sda1 /data xfs defaults 0 0" >> /etc/fstab
这仍然不是持久化数据。我通过向/data
添加一个文件来测试这一点,重新部署并检查EC2实例被替换后该文件是否存在。
我使用我的CDK堆栈中定义的CloudFormationInit脚本来安装docker,初始化集群,下载stack.yml文件并将其部署到集群。然后,我创建一个指向EC2实例的公共IP的Route 53记录。
这里有一个CDK结构的链接,我正在EC2上的docker swarm中运行我的Django应用程序:https://github.com/briancaffey/django-cdk/blob/main/src/docker-ec2.ts
你几乎得到了它-你只需挂载它就可以了。格式化它确实会擦除数据,解决方案只是跳过这一步。
你链接到的文档解决了这个问题:
(有条件(如果在上一步中发现设备上有文件系统,请跳过此步骤。如果有一个空卷,请使用mkfs-t命令在该卷上创建一个文件系统。
警告。如果要装载已包含数据的卷(例如,从快照创建的卷(,请不要使用此命令。否则,您将格式化卷并删除现有数据。
因此以下操作应该有效:
# mount the EBS volume
sudo mkdir /data # make a directory on the EC2 machine
sudo mount /dev/sda1 /data # mount the volume on the directory that was created