背景

几年前在云服务器上搭建了一套 TTRss + RssHub 集群, 用于阅读文章.

具体可以参见这篇文章: 使用 K8S 部署 RSS 全套自托管解决方案 - RssHub + Tiny Tiny Rss - 东风微鸣技术博客

近期云服务器要到期了, 刚好趁此机会将其从云上迁移到家里的 Homelab2 集群.

迁移是2025年2月22日上午做的, 结果非常顺利. 做完后太太还没起床呢, 那就再利用这段时间总结一下迁移过程.

内容有些流水账, 如果有疑问/建议欢迎交流.

技术栈

迁移前

  • K3s v1.23.10+k3s1
  • Ingress: 自带的 Traefik
  • 证书: cert-manager + DNSPod 插件
  • 存储:自带的 local-path
  • 备份: velero(只备份 manifests)
  • 域名: 后缀为 ewhisper.cn

迁移后

  • K3s: v1.31.5+k3s1
  • Ingress: Tailscale Operator
  • 证书: Tailscale Operator
  • 存储: rook-ceph
  • 备份: volsync
  • 域名:后缀为 west-beta.ts.net

综上, 其实不只是简单迁移, 还需要相应调整存储/网络相关配置.

这里的迁移场景非常具体, 只针对我的使用场景, 但是迁移的规划/步骤/思路可以供大家参考.

Notes:

我的完整迁移后代码位于: homelab2/apps/rsshub at master · east4ming/homelab2

本文出于长度考虑, 就不粘贴细节脚本/yaml了, 感兴趣的可以去 repo 查看.


迁移实战

1. 备份

1.1 K8s Manifests 备份

  • Deploy
  • Service
  • PVC
  • IngressRoute(Traefik)

已经通过 Velero 备份为 json 文件. 再通过脚本 kubectl-neat.sh 转换为 yaml 并移除不需要的字段.

Notes:

kubectl-neat.sh 用到了 kubectl krew 插件: neat

PVC 数据备份

  • redis 数据: dump.rdb
  • ttrss icons: 空. 无需备份.
  • ttrss postgresql 数据: 进入到容器中, 执行pg_dumpall -c -U postgres > export.sql

Reference:

数据库更新或迁移| Awesome TTRSS

另外注意, 备份 Postgres 数据前可以先停止 ttrss Deployment.


2. 停机

原集群上, 停掉所有 Deploy, 停止所有服务.

3. 修改 Manifests

修改 Manifests 以适配新的 Homelab2 集群.

  • NS 添加 volsync.backube/privileged-movers 注解以启用 volsync特权备份功能
  • Deploy postgres 增加 initContainer 删除 PostgreSQL 数据库中的 lost+found 目录, 否则启动报错 (rook-ceph PV 特性导致必须作此调整)
  • Deploy ttrss 增加 initContainer 使用 busybox 镜像执行 chmod 命令,将 /var/www/feed-icons/ 目录的权限设置为 777
  • 修改 IngressRoute 的 Host.
  • 修改 depoly ttrss 中的 SELF_URL_PATH 为新的域名
  • 将 rsshub 和 ttrss 的 traefik IngressRoute 改为 Ingress 配置并调整域名
  • 将环境变量中的密码改为从 secrets 中获取(Secrets 添加到 .gitignore) (因为我的 repo 是public 的, 所以密码要避免暴露)

4. 手动部署

cd apps/rsshub
kubectl apply -f ns.yaml
kubectl apply -f deploy/ -f pvc/ -f secret/ -f service/ -f ingress/

5. 恢复数据

先停掉除了 Postgres 以外的所有 Deploy, 防止脏数据.

5.1. Postgres

先将 export.sql 复制到 Postgres PV 中.

再进入 Postgres pod 中执行以下命令恢复数据:

cat export.sql | psql -U postgres

5.2. Redis

dump.rdb 复制到 Redis PV 中. (还需要 chown)

6. 启动

启动所有 Deploy.

7. 修改 TTRss 供稿设置

登录 TTRss 域名: ttrss.west-beta.ts.net, 进入: 偏好设置 -> 供稿设置 -> 逐一查看, 将URLhttps://rss.ewhisper.cn... 修改为: https://rss.west-beta.ts.net...

8. 验证

  1. 验证 RssHub 是否正常
  2. 验证 TTRss 是否正常
    1. 登录 TTRss
    2. 阅读文章
    3. 验证是否可以正常订阅

9. 备份

  1. 备份 Postgres 数据

10. 纳入 ArgoCD 管理

因为 ArgoCD 不监控子目录的 yaml 文件, 所以需要将所有 yaml 文件都放在一个目录中.

使用脚本 move_and_rename.sh 执行调整, 调整后修改 .gitignore 文件并删除不再需要的空目录.

11. 并行一段时间后清理原集群

  1. node 回收
  2. DNS 记录清理
  3. 域名清理
  4. 原集群备份 s3 删除
  5. 其他杂项清理

总结

以上为本次 TTRss 迁移的总结, 详细步骤对各位没啥用. 但是希望迁移的规划/流程/思路可以提供价值.

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

TTRSS 迁移实战的更多相关文章

  1. 从SQL Server到MySQL,近百亿数据量迁移实战

    从SQL Server到MySQL,近百亿数据量迁移实战 狄敬超(3D) 2018-05-29 10:52:48 212 沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:J ...

  2. 利用Velero对K8S备份还原与集群迁移实战

    一.简介 Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,利用 velero 用户可以安全的备份.恢复和迁移 Kubernetes 集群资源 ...

  3. 数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

    From:https://my.oschina.net/simpleton/blog/525675 一.什么是ETL ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数 ...

  4. 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis数据实战指南(离线同步数据)

    离线迁移 与在线迁移相比,离线迁移适宜于源实例与目标实例的网络无法连通的场景,或者源端实例部署在其他云厂商Redis服务中,无法实现在线迁移. 存在的问题 由于生产环境的各种原因,我们需要对现有服务器 ...

  5. 阿里云rds数据库迁移实战(多数据源)

    由于某几个业务表数据量太大,数据由业务写,数据部门读. 写压力不大,读却很容易导致长时间等待问题(读由单独系统进行读),导致连接被占用,从而容易并发稍稍增长导致全库卡死! 于是,就拆库呗. 业务系统拆 ...

  6. 通过Navicat Premium迁移Oracle到EDB迁移实战

    1.1 DB migration analysis   在从Oracle向EDB迁移数据之前,须要做非常多准备工作.比方须要分析源数据库数据量大小.数据是否稳定.异构数据库兼容.编码方式.业务逻辑(存 ...

  7. MySQL-线上数据迁移实战记录

    1. 迁移背景和限制条件 随着功能的迭代或者数据表中数据量的增加,将现有数据进行迁移已是工作中经常遇到的事情.通常我们在平时迁移数据数据的时候,只需要用mysqldump.mysqlimport指令就 ...

  8. Velero系列文章(四):使用Velero进行生产迁移实战

    概述 目的 通过 velero 工具, 实现以下整体目标: 特定 namespace 在B A两个集群间做迁移; 具体目标为: 在B A集群上创建 velero (包括 restic ) 备份 B集群 ...

  9. 【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

    从实战出发使用RedisShake进行Redis数据在线+离线模式迁移指南 RedisShake基本介绍 RedisShake是基于redis-port基础上进行改进的是一款开源的Redis迁移工具, ...

  10. Zstack迁移实战记录1

    https://blog.csdn.net/weixin_43767046/article/details/113748775 这段时间除了那个重度烤机测试(上面链接),还在做另一件事,想再做一个服务 ...

随机推荐

  1. 全网最适合入门的面向对象编程教程:60 Python面向对象综合实例-传感器数据实时绘图器

    全网最适合入门的面向对象编程教程:60 Python 面向对象综合实例-传感器数据实时绘图器 摘要: 本文将结合之前内容实现模拟一个传感器系统软件,包括三个线程:传感器线程生成数据并通过串口发送给主机 ...

  2. 洛谷P7911 [CSP-J 2021] 网络连接题解

    普通的模拟题,数据很小,基本排除超时超空间的可能 上代码: #include<bits/stdc++.h> #define LL long long using namespace std ...

  3. 【爬虫】爬虫简单举例(三种写法) 涉及requests、urllib、bs4,re

    目录 写法1:requests + re 写法2:urllib + re 方法3:request + bs4 补充.我在发了这篇文章之后,后面又要爬这个论坛.然后我发现我没有认真观察那个网页的源码,所 ...

  4. MockQueryable:LINQ查询模拟测试工具

    我们在项目开发过程中,单元测试是确保代码质量的重要环节.涉及数据库LINQ查询逻辑,就需要数据库配合,但这样可能出现性能和数据库并发等问题.下面给推荐一个开源库,为开发者提供了一种简便的方式来模拟LI ...

  5. pip 安装 Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)'))

    1.问题 1.1 问题截取 pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple Looking in indexes: http ...

  6. Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu

    一.使用说明 1.1 设备模拟-Com 第一步,填写要模拟的设备地址,0表示自动处理,也就是收到什么地址就应答什么地址. 第二步,填写对应的串口号和波特率. 第三步,单击打开串口,成功后会变成关闭串口 ...

  7. Qt编写视频监控系统79-四种界面导航栏的设计

    一.前言 最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上下排列的按钮, ...

  8. 优化博客Ⅰ-压缩图片为webp格式

    自动压缩博客图片为webp格式 作为自己的个人博客,我非常喜欢搞一些花里胡哨的东西,其中就包括不少精美图片,但是过多的图片会占用大量的网络资源导致博客加载速度变慢. 那怎么办呢? 第一个想到的就是升级 ...

  9. IIS通过URL重写配置http跳转https,排除部分域名

    <rewrite> <rules> <rule name="http to https" stopProcessing="true" ...

  10. biancheng-MongoDB教程

    目录http://c.biancheng.net/mongodb2/ 1NoSQL是什么2MongoDB是什么3Windows安装MongoDB4Linux安装MongoDB5MacOS安装Mongo ...