·조회수 177

Docker Swarm、Traefikを利用したサーバー管理

开始之前

在运营个人项目的过程中,我开始管理多个服务,为此每个月产生的AWS费用逐渐成为了负担。在没有收入的初期阶段,减少固定支出变得至关重要,因此我决定购买了相对便宜的3台迷你服务器,搭建自助托管环境。

过去,我一直在单个服务器上使用Docker Compose来构建服务,但是当服务器数量增多时,Compose方式显然存在明显的局限性。特别是需要根据CPU和内存使用量手动分配容器,从扩展性和管理方面来看也非常低效。

为了解决这个问题,我引入了Docker Swarm。Swarm可以将多台服务器组成一个类似集群的结构,支持灵活的服务部署和扩展。再加上使用Traefik,每个服务都不需要单独设置Nginx配置,HTTPS证书也会自动颁发和更新,大大减轻了运维负担。

对于我这样既要开发又要运营的个人来说,Docker Swarm和Traefik是保持复杂基础架构简洁的好选择。在本文中,我将尝试总结实际配置的过程。

硬件配置

迷你服务器规格介绍

这次搭建的服务器是基于Asrock DeskMini X300裸机构建的3台迷你PC。尽管尺寸小巧,但性能足够强大,非常适合自助托管环境。

每台服务器的主要规格如下:

  • 型号:Asrock DeskMini X300
  • CPU:Ryzen 5600G
  • 内存:64GB
  • 硬盘:1TB SSD
  • 散热器:[NOCTUA] NH-L9a-AM4(低噪音散热器)

这种配置提供了足够的性能来运行大约10到20个个人服务的容器,并且内存和SSD容量充足,可以轻松运行较重的服务。我购买了3台,考虑到全天候在家中运行的情况,我购买了低噪音散热器进行安装。(之前在公司运行服务器的经验对我很有帮助。那时候有多吵啊..)

由于功耗比普通台式机低,因此非常适合作为全天候运行的家用服务器。

网络设备介绍

目前使用的互联网连接是KT Gigabit Internet,KT的一个特点是为每个LAN端口提供单独的公共IP。我利用这一点,使得3台服务器可以独立从外部访问。

网络设备包括以下TP-Link Omada系列:

  • 路由器:TP-Link ER605

  • 交换机:TP-Link TL-SG2210P(支持2.5Gbps,PoE)

  • 控制器:TP-Link OC200

  • 无线AP:TP-Link EAP650(Wi-Fi 6)

这些设备都通过Omada SDN系统进行统一管理,提供VLAN配置、流量监控、端口级别控制等功能。

服务器1

  • 直接连接到KT调制解调器以获得公共IP

  • 运行Harbor Docker注册表、数据库、文档系统等固定服务

服务器2

  • 使用Docker Swarm构建集群
  • 将多个个人服务分散运行在容器中

有了这样的配置,我可以在Harbor管理镜像的同时,在其他服务器上实现灵活的服务部署/扩展/管理

最初,我尝试将3台服务器全部组成集群,以整合所有服务和基础设施。但是,在Docker Swarm环境中稳定运行像Harbor这样复杂的服务存在一些限制,为了更灵活地配置,我最终选择了像现在这样分离角色的方式。

优势

使用Traefik进行简单的流量管理

引入Traefik后,最方便的是流量管理变得简单得多。以前,我需要为每个服务手动编写Nginx配置,并且还需要手动颁发SSL证书。但是Traefik可以自动处理以下功能:

  • 通过Let's Encrypt自动颁发和更新HTTPS证书
  • 仅通过docker-compose.yml的标签设置,就可以实现域名连接、重定向、端口指定
  • 通过提供的仪表板可以直观地监视当前路由状态和服务状态

对于一个独立开发者来说,无需重复设置是一个非常大的优势。

简单的扩展

使用Docker Swarm可以更简单地部署或扩展新服务。只需将新的工作节点注册到集群中,Swarm会根据可用资源自动分配容器。

换句话说,不再需要考虑“这个服务应该在这台服务器上运行”,Swarm会自动部署容器并分配资源。

无中断部署(滚动更新)

通过update_config设置,可以在不中断现有服务的情况下将其替换为新版本。Swarm会先启动新容器,确认正常运行后再关闭旧实例。

services:
  my-app:
    image: myapp:v1
    deploy:
      replicas: 1
      update_config:
        order: start-first
        parallelism: 1
        delay: 5s

如果有2台以上的服务器,新容器会先部署到其他节点,因此实际服务用户完全不会察觉到部署过程。

服务隔离和回滚功能

每个服务都在独立的容器中运行,因此可以快速修复或回滚出现问题的特定服务。例如,如果更新图像后出现问题,只需一行命令就可以将其恢复到先前状态,实现快速且安全的运营。

docker service rollback my-service

基于Traefik的动态路由

Traefik基于Docker标签自动配置路由。只需在docker-compose.yml中添加几行代码,就可以实现域名、路径、HTTPS应用等自动处理。

与Nginx等手动配置繁琐不同,Traefik在服务添加或更改名称时无需重新配置路由,这是一个巨大的优势。

结语

对于一个独立开发者来说,必须自己负责开发和运营的情况下,我认为最重要的是保持复杂基础架构简单

这次利用Docker Swarm和Traefik构建服务器时,我意识到,即使不使用复杂的工具或云环境,也可以建立自己能够很好运行的基础架构的自信。

当然,一开始肯定会有试错,特别是由于关于Docker Swarm的实际资料并不丰富,我也遇到了困难,但是通过自己的搭建和测试经验,比任何文档都更有力量。

有人可能会说“为什么要使用Docker Swarm”,但是在从开发到部署、运营的情况下,简洁性、自动化、易维护性是我认为最大的优势和武器。

김지식
김지식
웹, 앱 개발자입니다.

댓글

댓글을 불러오는 중...