# Fully Booked：零停机迁移到自托管 Kubernetes

Company: Fully Booked
Service: DevOps 工程
Period: 2026-05 - 2026-06
Tech: Kubernetes, Docker, Cloudflare, Terraform, CI/CD, Linux, Node.js, PostgreSQL
Web: https://fully-booked.uk
Canonical: https://webanion.com/zh/portfolio/fully-booked-zero-downtime-migration-to-self-hosted-kubernetes

Fully Booked 此前运行在托管云基础设施上，账单逐月上涨，整套技术栈也无人真正拥有。我们把整个平台迁移到自托管的 Kubernetes 集群，全程没有让用户经历一分钟的停机。切换覆盖 DNS、入口网关、数据库和发布流水线，并分阶段推进：只有当某一层在新集群上得到验证之后，流量才会转移过去。那一周使用这款应用的人都没有察觉发生了什么，而这正是目标所在。每月的账单变成了自有硬件，如今同一个集群还承载着平台每周的版本发布。

## 完整故事

从不断上涨的云账单到自有硬件，全程零停机。这里讲述这次迁移如何分阶段推进、逐层验证、最终完成切换。

### 一张只涨不降的账单，一套无人真正拥有的技术栈

<p>Fully Booked 一直运行在早已不够用的 DigitalOcean 云主机上：每天约一千人使用着租来的基础设施，每个扩容决定都由供应商定价，月度账单只朝一个方向变化。这个要求说来简单，做来很难：把整个平台搬到企业自有的硬件上，而且不能让任何正在使用应用的人察觉到变化。</p>

### 先对齐环境，再迁移流量

<p>迁移被安排成先赢得信任、再移动流量。多节点 k3s 集群在自有硬件上搭建起来，用 UFW 和 fail2ban 加固，每个服务都容器化，确保在两套基础设施上运行得完全一致。证书、定时备份和监控在切换之前就已就位，而不是事后补上。之后流量才开始移动，一个界面接一个界面地迁，每一步都留有即时回滚的余地。</p>

### 割接只是一次代理翻转

<p>Cloudflare 本来就在平台前面负责 DNS、缓存和 TLS，这正是最后一步从容的原因：割接是一次代理翻转，而不是一场 DNS 赌博。在边缘节点之后，集群运行着控制平面和工作节点，承载门户、管理后台、后端和任务这些 Pod，监控在旁守着，备份按计划执行。图里没有 IP，也没有主机名，因为系统的形状不是它的机密。</p>

### 零停机，有据可查

<p>整个割接期间记录到的停机时间为零，那一周使用应用的人没有一个察觉到发生了什么，而这正是全部的意义。经常性的云账单变成了自有基础设施，从 DNS 到磁盘的每一层都在客户自己手里，同一个集群如今还承载着平台每周的版本发布。这次迁移所承载的平台，在<a href="/portfolio/fully-booked-all-in-one-smart-booking-solution">Fully Booked 的故事</a>里有完整讲述。</p>
