You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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里的关机记录,确认是不是系统因为资源不够强制关机了。

二、找到关键日志排查问题

哪怕节点关机了,还是有办法拿到日志的:

  1. Swarm服务日志:在Master节点上执行这条命令,能聚合TeamCity服务的所有日志(不管容器跑在哪个节点):
    sudo docker service logs infra_teamcity
    
    这里能看到TeamCity初始化过程中有没有报错,比如数据库初始化失败、卷挂载异常之类的。
  2. Docker系统日志:如果Worker节点能重启,登录后查看Docker的运行日志:
    journalctl -u docker.service
    
    看看有没有容器启动失败、卷挂载超时的信息。
  3. TeamCity日志卷:你用了Rexray挂载EBS卷,卷是独立于节点的,哪怕节点挂了,卷还在。可以用临时容器挂载这个卷查看日志:
    sudo docker run -it --rm -v teamcity-server-logs:/logs ubuntu:latest cat /logs/teamcity-server.log
    
    直接读取TeamCity的日志文件,看初始化到哪一步出了问题。

三、优化部署配置避免节点崩溃

针对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:58