[云原生]K8S 部署 RSS 全套自托管解决方案

什么是 RSS?

RSS 是一种描述和同步网站内容的格式,是使用最广泛的 XML 应用。RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个 RSS 文件后,这个 RSS Feed 中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的 XML 格式,所以也能在其他的终端和服务中使用,是一种描述和同步网站内容的格式。

RSS 广泛用于网上新闻频道,blog 和 wiki。使用 RSS 订阅能更快地获取信息,网站提供 RSS 输出,有利于让用户获取网站内容的最新更新。网络用户可以在客户端借助于支持 RSS 的聚合工具软件,在不打开网站内容页面的情况下阅读支持 RSS 输出的网站内容。

为什么我还是需要 RSS?

两个目的:

  1. 通过 RSS 和 RSS 阅读器作为高效率的 Feed 集合器,免去每日浏览各个网站搜寻信息的时间,发现优质内容,提高阅读效率。
  2. 通过 RSS Feed, 获取低频但重要的信息,如重要软件更新,预报预警等。

部署架构

Overview

Tiny Tiny RSS 有一个公网 HTTPS 域名直接登录该域名来进行 RSS 阅读;

Tiny Tiny RSS 订阅源可以来自:

  1. 支持 RSS 的网站,比如博客的对应 RSS 地址c
  2. 我自己部署的 RssHub, 公网 HTTPS 域名

Tiny Tiny RSS

  1. Tiny Tiny RSS 部署在 K8S 集群的 rss ns 里;
  2. 基于 Awesome需要部署的组件有:
    1. tiny tiny rss, 需要有一个 PVC 存储,用于存放 icon
    2. tiny tiny rss 的 数据库 - postgresql 13, 需要有一个 PVC 存储,用于存放数据库数据。
  3. 组件都是单节点部署,不考虑高可用;
  4. Tiny Tiny RSS 通过 Ingress + SVC 对外发布域名;

RssHub

  1. RssHub 部署在 K8S 集群的 rss ns 里;
  2. 基于 RSSHUB 需要部署的组件有:
    1. rsshub
    2. browserless chrome
    3. redis, 需要有一个 PVC 存储,用于存放缓存数据。
  3. 组件都是单节点部署,不考虑高可用;
  4. RssHub 通过 Ingress + SVC 对外发布域名;

前提条件

  1. 需要有属于自己的域名,如:ewhisper.cn, 具体的域名为:
    1. ttrss.ewhisper.cn
    2. rss.ewhisper.cn
  2. 且该域名已经在国内备案,80 和 443 端口可以正常使用;
  3. 该域名托管在 DNSPod 或类似的 DNS 供应商,可以方便地修改 DNS Record;
  4. 需要有对应域名的证书,本次需要有:ttrss.ewhisper.cnrss.ewhisper.cn 的证书,可以是单域名证书,也可以是泛域名证书。
  5. 已经搭建好 K8S 集群
  6. K8S 集群有 Ingress Controller
  7. K8S 集群有 StorageClass 或可以提供 PV 存储。(本文 K8S 集群默认提供 local-path storageclass)
  8. 本次 2 个域名通过 K8S Traefik 的 IngressRoute 进行配置,配置 Ingress 和 证书;

📚️ Reference: 可以通过 cert-manager 为 dnspod 在 Letsencrypt 上申请免费证书

实施

Tiny Tiny RSS 搭建

1. 修改 docker-compose

有 2 个地方需要修改:

  1. 环境变量:
    1. SELF_URL_PATH=https://ttrss.ewhisper.cn/ (你自己的域名)
    2. DB_PASS=changeit (postgresql 数据库密码)
  2. 使用 kompose 转换,转换前,需要在 docker-compose.yml 补充相关信息以保证转换 k8s service 成功,具体为在各个 docker compose 的 service 里加上 ports 字段。docker-compose.yml 修改的内容见这里:
代码语言:javascript
复制
version: "3"
services:
  service.rss:
    environment:
      - SELF_URL_PATH=https://ttrss.ewhisper.cn/ # please change to your own domain
      - DB_PASS=changeit # use the same password defined in `database.postgres`  
...
  service.mercury:
    ports:
      - 3000:3000
...
  service.opencc: # set OpenCC API endpoint to `service.opencc:3000` on TTRSS plugin setting page
    ports:
      - 3000:3000
...
  database.postgres:
    environment:
      - POSTGRES_PASSWORD=changeit
    ports:
      - 5432:5432      

2. 使用 kompose 转换

命令如下:

docker-compose.yml 所在目录下执行:

代码语言:javascript
复制
kompose convert -o ./k8s/ --pvc-request-size 2Gi

📝 Note: --pvc-request-size 2Gi 按需调整。

转换后,目录结构如下:(转换后还会生成 NetWorkPolicy 文件,个人认为没必要,就删除掉了相关文件和 label; 另外,生成的文件中有的 字段包含 . , 以防万一,都替换为了 -):

代码语言:javascript
复制
└── ttrss
    ├── docker-compose.yml
    └── k8s
        ├── database-postgres-claim0-persistentvolumeclaim.yaml
        ├── database-postgres-deployment.yaml
        ├── database.postgres-service.yaml
        ├── feed-icons-persistentvolumeclaim.yaml
        ├── service-mercury-deployment.yaml
        ├── service-opencc-deployment.yaml
        ├── service-rss-deployment.yaml
        ├── service.mercury-service.yaml
        ├── service.opencc-service.yaml
        └── service.rss-service.yaml

除此之外还需要手动创建一个 ingress, 用于对外暴露服务(这里用的是 Traefik CRD - IngressRoute).

  1. Tiny Tiny Rss
    1. Deployment: service-rss-deployment.yaml (🐾这里还需要添加一个 ENV: DB_HOST, 以通过 DB SVC 访问 DB)
    2. Service: service.rss-service.yaml (用于对接 Ingress, 对外提供服务)
    3. IngressRoute: ingress-rss-service.yaml
  2. DB - PostgreSQL
    1. Deployment: database-postgres-deployment.yaml
    2. SVC: database.postgres-service.yaml (Tiny Tiny Rss 通过该 SVC 连接到 DB)
    3. PVC: database-postgres-claim0-persistentvolumeclaim.yaml(申请持久化存储)
  3. 其他服务 - opencc
    1. Deployment: service-opencc-deployment.yaml
    2. Service: service-opencc-deployment.yaml
  4. 其他服务 - mercury
    1. Deployment: service-mercury-deployment.yaml
    2. Service: service.mercury-service.yaml
3. 部署

使用 kubectl 部署:

代码语言:javascript
复制
kubectl -n rss create -f ./k8s/
4. 配置 DNS Record

在 DNS 提供商控制台(本例为 DNSPod) 配置对应域名 <ttrss.ewhisper.cn> 的 DNS Record:

  • ttrss, A 记录,指向 K8S 集群 Ingress 对应的公网地址
5. 访问验证

效果如下:

Tiny Tiny Rss

RssHub 搭建

RssHub 搭建的步骤几乎和 Tiny Tiny RSS 一样。具体如下:

1. 修改 docker-compose

使用 kompose 转换,转换前,需要在 docker-compose.yml 补充相关信息以保证转换 k8s service 成功,具体为在各个 docker compose 的 service 里加上 ports 字段。

2. 使用 kompose 转换

命令如下:

docker-compose.yml 所在目录下执行:

代码语言:javascript
复制
kompose convert -o ./k8s/ --pvc-request-size 2Gi

📝 Note: --pvc-request-size 2Gi 按需调整。

转换后,目录结构如下:

代码语言:javascript
复制
.
├── docker-compose.yml
└── k8s
    ├── browserless-deployment.yaml
    ├── browserless-service.yaml
    ├── redis-data-persistentvolumeclaim.yaml
    ├── redis-deployment.yaml
    ├── redis-service.yaml
    ├── rsshub-deployment.yaml
    └── rsshub-service.yaml

1 directory, 8 files

除此之外还需要手动创建一个 ingress, 用于对外暴露服务(这里用的是 Traefik CRD - IngressRoute).

  1. RssHub
    1. Deployment: rsshub-deployment.yaml
    2. Service: rsshub-service.yaml (用于对接 Ingress, 对外提供服务)
    3. IngressRoute: rsshub-ingress.yaml
  2. Browserless - Chrome
    1. Deployment: browserless-deployment.yaml
    2. SVC: browserless-service.yaml (RssHub 通过该 SVC 连接到 Browserless )
  3. Redis
    1. Deployment: redis-deployment.yaml
    2. Service: redis-service.yaml
    3. PVC: redis-data-persistentvolumeclaim.yaml
3. 部署

使用 kubectl 部署:

代码语言:javascript
复制
kubectl -n rss create -f ./k8s/
4. 配置 DNS Record

在 DNS 提供商控制台(本例为 DNSPod) 配置对应域名 <rss.ewhisper.cn> 的 DNS Record:

  • rss, A 记录,指向 K8S 集群 Ingress 对应的公网地址