目录:网上冲浪指南

迁移到 K3s - Aria2

2021/02/18

之前一直用的阿里云香港轻量服务器,不过最近不打算继续续费了,需要将上面的部分服务转移到 CloudCone 的 K3s 集群中:

  • Aria2

  • Aria2NG

  • TiddlyWiki

趁着春节假期的缓冲期,就先把 Aria2 给搬到单节点的 K3s 集群中吧。

容器化

之前在阿里云上是用的 pm2 做的守护进程,然后 Caddy 静态暴露 Aria2NG 前端面板跟下载目录。要迁移到 K3s 的话就需要将这些东西容器化了。Aria2 的话,我直接用了这位老哥的 Aria2 Pro,虽然不清楚具体设置了些什么,但是用起来没啥问题,前端面板也是用了他提供的 Aria2NG 镜像。

除了 aria2 之外,还得把下载目录的暴露也容器化。因为目前 K3s 集群中用的 traefik 作为 ingress,所以不能像之前那样直接通过反向代理软件暴露文件系统了。记得之前 Caddy 是自带一个 File Browser 插件的,这是一个单独的 Web 服务,可以非常方便的搭建一个文件共享系统,也提供了官方的 Docker 镜像,那么就决定用它来对外暴露下载目录了。

持久化存储

File Browser 需要持久化一个 db 文件用来保存系统数据(用户管理、文件共享等),Aria2 跟 File Browser 还需要共享下载目录,前者写入,后者读取。因为我的 K3s 集群就 1 个节点,所以直接就用 hostPath 来持久化数据了。

file-transfer-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: default
  name: file-transfer-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: '/path/to/file-transfer'

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: file-transfer-data-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 10Gi

配置文件持久化

File Browser 默认的配置文件将数据库文件设置为了 /database.db,不太方便我们使用 pvc 持久化,所以我就需要通过 ConfigMap 修改一下配置文件,将数据库文件保存到单独的外部挂载目录下。

file-browser-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: file-browser
  name: file-browser-config
  namespace: default
data:
  .filebrowser.json: |
    {
      "port": 80,
      "baseURL": "",
      "address": "",
      "log": "stdout",
      "database": "/db/database.db",
      "root": "/srv"
    }

数据持久化

file-browser.yaml
# 省略部分内容....
containers:
  - image: filebrowser/filebrowser
    name: file-browser
    imagePullPolicy: Always
    volumeMounts:
      - mountPath: /.filebrowser.json (1)
        subPath: .filebrowser.json
        name: file-browser-config
      - mountPath: /db (2)
        subPath: db/
        name: data
      - mountPath: /srv (3)
        subPath: data/
        name: data
volumes:
  - name: data
    persistentVolumeClaim:
      claimName: file-transfer-data-pvc
  - name: file-browser-config
    configMap:
      name: file-browser-config
      items:
        - key: .filebrowser.json
          path: .filebrowser.json
1 file-browser 配置文件挂载点
2 将 data 卷的 db/ 目录挂载到容器中的 /db 路径下,用来持久化数据库文件
3 将 data 卷的 data/ 目录挂载到容器中的 /srv 路径下,用来在 Pod 间共享下载目录
aria2.yaml
containers:
  - image: p3terx/ariang
    name: ariang
    imagePullPolicy: Always
  - image: p3terx/aria2-pro
    env:
      - name: RPC_SECRET
        value: <SECERT>
      - name: RPC_PORT
        value: '6800'
      - name: TZ
        value: Asia/Shanghai
    name: aria2-pro
    imagePullPolicy: Always
    volumeMounts:
      - mountPath: /downloads (1)
        subPath: data/
        name: data
volumes:
  - name: data
    persistentVolumeClaim:
      claimName: file-transfer-data-pvc
1 将 data 卷的 data/ 目录挂载到容器中的 /downloads 路径下,用来在 Pod 间共享下载目录

服务暴露

Aria2 服务需要暴露的端口不少,除了 HTTP 端口之外,还需要暴露供 BT 上传用的 TCP 与 UDP 端口。

aria2-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: aria2
  namespace: default
spec:
  selector:
    app: aria2
  ports:
    # aria2 rpc
    - protocol: TCP
      port: 6800
      name: rpc
    # aria2 BT
    - protocol: TCP
      port: 6888
      name: bt
    # aria2 DHT
    - protocol: UDP
      port: 6888
      name: dht
    # aria ng
    - protocol: TCP
      port: 6880
      name: web
file-browser.yaml
apiVersion: v1
kind: Service
metadata:
  name: file-browser
  namespace: default
spec:
  selector:
    app: file-browser
  ports:
    # file-browser http
    - protocol: TCP
      port: 80

通过 Service 暴露端口之后还需要使用 Ingress 来向集群外暴露服务,我使用的是 traefik 提供的官方 helm chart,通过 IngressRoute 来定义 Ingress 路由。

Traefik 的默认配置中只监听了 80/443 端口,为了让 BT 上传能够正常工作,还得加入新的监听端口:

traefik-values.yaml
# ...
# Configure ports
ports:
  # ...
  aria2tcp:
    port: 6888
    expose: true
    exposedPost: 6888
    protocol: TCP
  aria2udp:
    port: 6888
    expose: true
    exposedPost: 6888
    protocol: UDP

IngressRoute 只能用来路由 HTTP/HTTPS 请求,对于 TCP/UDP 请求,需要使用 IngressRouteTCP/IngressRouteUDP 来转发:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: apps-tcp
  namespace: default
spec:
  entryPoints:
    - aria2tcp
  routes:
    - match: HostSNI(`*`) (1)
      services:
        - name: aria2
          port: 6888

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
  name: apps-udp
  namespace: default
spec:
  entryPoints:
    - aria2udp
  routes:
    - match: HostSNI(`*`) (1)
      services:
        - name: aria2
          port: 6888
1 因为 aria2 暴露的 TCP/UDP 端口没有使用 TLS 加密,所以需要设置路由匹配规则为 HostSNI(*)

内容导航

本网站所展示的文章由 Zeeko Zhu 采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可

Zeeko's blog, Powered by ASP.NET Core 🐳