使用rexray/ebs实现Docker Swarm部署TeamCity的AWS EBS持久化问题
解决Docker Swarm部署TeamCity时Worker节点关机的问题
Hey Steve,看起来你在搭建Swarm集群部署TeamCity的过程中碰到了挺头疼的问题——Worker节点突然关机打断了初始化流程。我来帮你一步步梳理排查方向和解决方案:
一、先搞清楚Worker节点为什么会关机
你用的是t2.micro实例,内存只有1GB,而TeamCity Server本身对资源的需求不算小,再加上Docker、Swarm后台进程的开销,很大概率是资源耗尽导致节点崩溃,可以从这几个地方查:
- 登录AWS控制台,查看对应Worker节点的CloudWatch指标:重点看「内存使用率」「CPU使用率」,还有「实例状态变化事件」(比如有没有显示“Instance terminated”,原因是不是内存不足)。另外t2实例有CPU信用额度,要是信用耗尽会导致性能骤降,也可以查「CPUCreditUsage」指标。
- 如果能重启Worker节点,登录后用
dmesg命令查看内核日志,找有没有OOM(内存不足)相关的报错;再看/var/log/syslog里的关机记录,确认是不是系统因为资源不够强制关机了。
二、找到关键日志排查问题
哪怕节点关机了,还是有办法拿到日志的:
- Swarm服务日志:在Master节点上执行这条命令,能聚合TeamCity服务的所有日志(不管容器跑在哪个节点):
这里能看到TeamCity初始化过程中有没有报错,比如数据库初始化失败、卷挂载异常之类的。sudo docker service logs infra_teamcity - Docker系统日志:如果Worker节点能重启,登录后查看Docker的运行日志:
看看有没有容器启动失败、卷挂载超时的信息。journalctl -u docker.service - TeamCity日志卷:你用了Rexray挂载EBS卷,卷是独立于节点的,哪怕节点挂了,卷还在。可以用临时容器挂载这个卷查看日志:
直接读取TeamCity的日志文件,看初始化到哪一步出了问题。sudo docker run -it --rm -v teamcity-server-logs:/logs ubuntu:latest cat /logs/teamcity-server.log
三、优化部署配置避免节点崩溃
针对t2.micro的资源限制,先调整TeamCity服务的资源约束,避免耗尽节点资源:
修改你的docker-compose.yml,给TeamCity加上资源限制和预留:
version: '3' services: teamcity: image: jetbrains/teamcity-server:2017.1.2 volumes: - teamcity-server-datadir:/data/teamcity_server/datadir - teamcity-server-logs:/opt/teamcity/logs ports: - "80:8111" deploy: resources: limits: memory: 768M # 给TeamCity分配768M内存,剩下的留给系统和Docker reservations: memory: 512M # 如果你后续升级了Worker节点实例类型,再调整placement约束 placement: constraints: - node.role==worker volumes: teamcity-server-datadir: driver: rexray/ebs driver_opts: size: 10 # 可以指定卷大小,避免默认太小不够用 teamcity-server-logs: driver: rexray/ebs driver_opts: size: 5
另外,Rexray配置里建议加上文件系统类型,确保兼容性:
sudo docker plugin install --grant-all-permissions rexray/ebs REXRAY_PREEMPT=true EBS_ACCESSKEY=XXX EBS_SECRETKEY=YYY REXRAY_FSTYPE=ext4
四、检查Swarm集群和卷状态
- 在Master节点执行
sudo docker node ls,查看Worker节点的状态,是不是处于Down状态,有没有报错信息。 - 执行
sudo docker volume inspect teamcity-server-datadir,查看卷的挂载状态,如果卷还绑定在已经关机的节点上,可以先备份数据(把卷挂载到临时容器复制数据),然后删除卷重新部署服务,让Rexray重新创建卷并挂载到可用节点。
临时应急方案
如果Worker节点反复崩溃,你可以先把TeamCity部署到Master节点上完成初始化,修改docker-compose.yml的placement约束:
deploy: placement: constraints: - node.role==manager
等TeamCity初始化完成、确认能正常运行后,再考虑迁移到Worker节点,或者直接升级Worker节点的实例类型(比如换成t2.small,2GB内存会稳定很多)。
内容的提问来源于stack exchange,提问作者Steve_333
相关产品推荐
相关产品推荐

